首页 > 数据库 >数据库三大范式(转)

数据库三大范式(转)

时间:2023-04-26 22:44:37浏览次数:38  
标签:OrderID 3NF 范式 数据库 2NF 依赖于 主键 三大

原文:https://blog.csdn.net/famousdt/article/details/6921622

范式:英文名称是 Normal Form,它是英国人 E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出来的,范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法。目前有迹可寻的共有8种范式,依次是:1NF,2NF,3NF,BCNF,4NF,5NF,DKNF,6NF。通常所用到的只是前三个范式,即:第一范式(1NF),第二范式(2NF),第三范式(3NF)。下面就简单介绍下这三个范式。


◆ 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。
考虑这样一个表:【联系人】(姓名,性别,电话)
如果在实际场景中,一个联系人有家庭电话和公司电话,那么这种表结构设计就没有达到 1NF。要符合 1NF 我们只需把列(电话)拆分,即:【联系人】(姓名,性别,家庭电话,公司电话)。1NF 很好辨别,但是 2NF 和 3NF 就容易搞混淆。


◆ 第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分
考虑一个订单明细表:【OrderDetail】(OrderID,ProductID,UnitPrice,Discount,Quantity,ProductName)。
因为我们知道在一个订单中可以订购多种产品,所以单单一个 OrderID 是不足以成为主键的,主键应该是(OrderID,ProductID)。显而易见 Discount(折扣),Quantity(数量)完全依赖(取决)于主键(OderID,ProductID),而 UnitPrice,ProductName 只依赖于 ProductID。所以 OrderDetail 表不符合 2NF。不符合 2NF 的设计容易产生冗余数据。

(就拿上面的例子来说,如果只用一个【OrderDetail】表,有两个订单,Discount和Quantity不同,但购买的是相同的product,所以这两条数据中有关product的信息(UnitPrice和ProductName)就得出现2次)

可以把【OrderDetail】表拆分为【OrderDetail】(OrderID,ProductID,Discount,Quantity)和【Product】(ProductID,UnitPrice,ProductName)来消除原订单表中UnitPrice,ProductName多次重复的情况。


◆ 第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况
考虑一个订单表【Order】(OrderID,OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity)主键是(OrderID)。
其中 OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity 等非主键列都完全依赖于主键(OrderID),所以符合 2NF。不过问题是 CustomerName,CustomerAddr,CustomerCity 直接依赖的是 CustomerID(非主键列),而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合 3NF。
通过拆分【Order】为【Order】(OrderID,OrderDate,CustomerID)和【Customer】(CustomerID,CustomerName,CustomerAddr,CustomerCity)从而达到 3NF。


第二范式(2NF)和第三范式(3NF)的概念很容易混淆,区分它们的关键点在于,2NF:非主键列是否完全依赖于主键,还是依赖于主键的一部分;3NF:非主键列是直接依赖于主键,还是直接依赖于非主键列

标签:OrderID,3NF,范式,数据库,2NF,依赖于,主键,三大
From: https://www.cnblogs.com/tan-wm/p/17357618.html

相关文章

  • PowerDesigner 数据库建模 - 生成表和测试数据
    新建模型NewModel选择PhysicalDataModel-- PhysicalDiagram新建表编辑字段信息新建了两张表创建外键配置数据库连接可以测试一下是否可以连接连接数据库生成建表SQL执行SQL点击run生成测试数据点击run......
  • db2 创建数据库、表、存储过程等
    启动[root@localhost~]#su-db2inst1[db2inst1@localhost~]$db2startSQL8007WThereare"13"day(s)leftintheevaluationperiodfortheproduct"DB2ConnectServer".Forevaluationlicensetermsandconditions,refertotheLicen......
  • 对数据库中存储的程序进行现代化改造,以使用 Amazon Aurora PostgreSQL 联合查询、pg_c
    作为数据库迁移和现代化的一部分,您可以继续使用存储的程序和调度作业,将远程实例中的数据整合到集中式数据存储中。 AmazonSchemaConversionTool(AmazonSCT)可帮助您将传统的Oracle和SQLServer函数转换为其等效的开源函数。但是,如何继续使用存储的程序从远程数据库中提取数......
  • Django 查询数据库不释放内存的情况
    查询结果未及时清空如果查询结果较大,可能会占用很多内存。在使用完查询结果后,应该及时清空,以释放占用的内存。可以通过将查询结果赋值给一个变量,然后使用del关键字删除变量来清空查询结果。例如:result=MyModel.objects.all()#使用查询结果...#清空查询结果delresul......
  • 数据库查询与前台请求后台接口返回结果id的值不一致
    数据库查询与前台请求后台接口返回结果id的值不一致主要是主键ID类似于时间戳的那种形式,前端获取接口返回后,最后几位变成了0了,网上搜了下,还有不少人也出现过这种情况。解决办法就是后台返回这个id,改成字符串类型,原因可能是int或者long在前端长度不够导致   ......
  • drf之三大组件(认证组件、权限组件、频率组件)
    目录环境准备创建相关的表,models.py创建登录样例配置路由认证组件BaseAuthentication创建认证组件创建测试样例总结1.创建认证组件2.局部使用(只在一个视图类中使用,使用后会影响当前视图类中管理的所有接口)3.全局使用(对所有接口都生效)4.局部禁用权限组件BasePermission环境......
  • java连接jdbc-mssql数据库
    packagecom.swift.erp;importjava.sql.SQLException;importjava.sql.Statement;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;publicclassAPP{//引入sqljdbc.jarpublicstaticvoidmain(String[]args......
  • mysql主从,django使用多数据库做读写分离
    mysql主从mysql主从搭建的目的1.读写分离2.单个实例并发量低,提高并发量3.只在主库写,读数据都去从库mysql主从原理步骤一:主库db的更新事件(update,insert,delete)被写道binlog步骤二:从库发起连接,连接到主库步骤三:此时主库创建一个binlogdumpthread线程,把binlog的内容发送到......
  • java连接数据库的5种方式
    方式一直接导入第三方库驱动类这种加载方式在jdbc入门时已经用过,这个driver属于第三方库,。为静态加载,灵活性差,依赖性抢方式二使用反射机制获取方式一和方式二代码packagecom.hsp.edu;importcom.mysql.cj.jdbc.Driver;importjava.lang.reflect.Constructor;import......
  • 通过晶体数据库下载cif文件(转摘)
    1.7个晶体数据库下载cif文件的介绍——摘自:https://mbd.baidu.com/ug_share/mbox/4a83aa9e65/share?product=smartapp&tk=b345140e38a063d8d34015a16117c5d1&share_url=https%3A%2F%2F7dapi7.smartapps.baidu.com%2Fpages%2Farticle%2Farticle%3F_swebfr%3D1%26eid%3Dc1a3101e0346......