数据库设计第二范式 (2NF)
定义
2NF有以下几条要求:
- 建立在1NF之上
- 不含有部分依赖(Partial Dependency)
示例1
要求1好理解,但是在要求2中的部分依赖是什么意思?让我们通过一个示例来理解。以下面我们建议了一个用户订单表。
CREATE TABLE Custom_Order(ID INT NOT NULL,Custom_ID INT NOT NULL,Custom_Name VARCHAR (20) NOT NULL,Order_ID INT NOT NULL,Sale_Date DATETIME NOT NULL,Order_Detail DOUBLE NOT NULL,PRIMARY KEY (ID)
);
该表满足1NF,但不满足2NF,因为主键和列存在部分依赖关系:
- Custom_Name依赖于Custom_ID。这里的依赖是指即每个用户的编号是唯一的,而名称绑定于这个唯一的ID。即,一个编号只对应一个用户名,而一个用户名可能有多个编号(用户名可以相同)。
- 客户名与其所购买的商品之间没有直接联系。
所以,Custom_Name 是有依赖的。 同时,订单这个主体也应该独立开,即 Sale_Date 和 Detail 都是有依赖的。若要使此表符合2NF,我们需要将表分成三个表。一个用户表(Customs表),定义用户的相关信息;一个订单表(Orders),表示订单详细信息;一个用户订单表(CustomOrders表)记录用户交易的相关信息。三个表如下所示。
-- 用户信息表
CREATE TABLE Customs(ID INT NOT NULL,NAME VARCHAR (20) NOT NULL,PRIMARY KEY (ID)
);-- 订单表
CREATE TABLE Orders(ID INT NOT NULL,Detail DOUBLE NOT NULL,PRIMARY KEY (ID)
);-- 用户订单表
CREATE TABLE CUSTMERORDERS(Custom_ID INT NOT NULL,Order_ID INT NOT NULL,Sale_Date DATETIME,PRIMARY KEY (CUST_ID, ORDER_ID)
);
通过这个示例我们可以看到,所谓的部分依赖指的是某个(或多个)列依赖于别的列,且和和其他的列没有任何直接关系。当表的设计中有部分依赖时,我们需要将一张表拆分成多张表,这些表包括基本信息表(如Customs表和Orders表)和关系表(如CustomOrders表),从而消除数据的部分依赖。这和设计模式中常说的耦合是一个原则,要尽可能实现低耦合高内聚(low in coupling and high in cohesion)。
示例2
再举行一例,我们从数据冗余角度来看2NF。
编号 | 姓名 | 性别 | 领导姓名 | 领导性别 |
---|---|---|---|---|
1001 | 张三 | 男 | ||
1002 | 李小四 | 女 | 张三 | 男 |
如上表所示,我们在个人信息表中包括了其领导的相关信息。领导的信息都使用了实际的值,而不是引用。这样就违反了2NF,在实际应用中就会带来麻烦。比如,李小四的领导换人了,那么需要同时更新“领导姓名”和“领导性别”两列,如果有多个属性,那么就进行相应的更新。在实际应用中,如果很容易出错,导致数据不同步。
所以,根据2NF的原则,我们修改表的结构如下所示。
编号 | 姓名 | 性别 | 领导编号 |
---|---|---|---|
1001 | 张三 | 男 | 0 |
1002 | 李小四 | 女 | 1001 |
通过对编号的引用,避免了数据不同步的问题,这样无论某人的信息如何修改,编号都不需要改变,在实际显示的时候只需要根据SQL进行联接即可。
总结
2NF要求数据表中对列的引用不能有部分依赖,可以理解为在对不同表的数据引用时,要引用其编号而不是实际的数据。这样带来的设计好处是,数据冗余小(只有编号)且易于修改(修改了被引用表的数据对原表没有影响)。
数据库设计第二范式 (2NF)相关推荐
- 数据库设计的相关原则
在目前的企业信息系统中,数据库还是最佳的数据存储方式,虽然已经有很多的书籍在指导我们进行数据库设计,但应该那种方式是设计数据库的表结构的最好方法.设计时应遵从什么样的原则.四个范式如何能够用一种方式达 ...
- 数据库设计(二)——数据库设计原则
一.数据库表的设计原则 1.不应该针对整个系统进行数据库设计,而应该根据系统架构中的组件划分,针对每个组件所处理的业务进行组件单元的数据库设计:不同组件间所对应的数据库表之间的关联应尽可能减少,如果不 ...
- 如何设计数据库(数据库设计原则)
数据库设计的三大范式:为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的总结.要想设计一个结构合理的关系型数据库,必须满 ...
- MySQL 学习笔记(14)— 数据库设计流程、实体关系图、第一范式、第二范式、第三范式、外键使用
本文参考:https://gitbook.cn/gitchat/column/undefined/topic/5db92c12a9c3a53bc3800f0c 1. 数据库设计流程 数据库设计是对数据 ...
- 数据库第一范式1NF,第二范式2NF,第三范式3NF详解
文章目录 一,超码.主码.候选码之间的定义与联系 二,函数依赖. 三,三大范式 第一范式(1NF): 第二范式(2NF): 第三范式(3NF): BCNF 一,超码.主码.候选码之间的定义与联系 码是 ...
- 数据库设计之第一范式、第二范式、第三范式
一.第一范式 理论: 1.第一范式的目标是确保每列的原子性. 2.如果每列都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式(1NF:First Normal Form). 举例说明: ...
- 数据库设计三大范式和ER模型
1. 数据库设计之三范式的介绍 范式: 对设计数据库提出的一些规范,目前有迹可寻的共有8种范式,一般遵守3范式即可. 第一范式(1NF): 强调的是列的原子性,即列不能够再分成其他几列.(1NF强调字 ...
- 14 个实用的数据库设计技巧,一次性教给你!
目录 原始单据与实体之间的关系 主键与外键 基本表的性质 范式标准 通俗地理解三个范式 要善于识别与正确处理多对多的关系 主键PK的取值方法 正确认识数据冗余 E--R图没有标准答案 视图技术在数据库 ...
- DQL查询语句约束数据库设计备份和还原
DQL:查询语句 1. 排序查询* 语法:order by 子句* order by 排序字段1 排序方式1 , 排序字段2 排序方式2...* 排序方式:* ASC:升序,默认的.* DESC:降序 ...
最新文章
- 备忘录吕吕没有备忘录十新建_一份备忘单,可帮助您记住CSS自定义属性
- Python程序设计 第六章 函数(续
- opencv光流Optical Flow
- java控制结构_java控制结构WORD
- 1.2.2 OSI参考模型(应用层、表示层、会话层、传输层、网络层、数据链路层、物理层)
- vnc连接linux颜色灰色,VNC 灰色的屏幕解决方法
- java原子整数_多线程(四、原子类-AtomicInteger)
- python与javascript的区别_python与js区别有哪些
- 金三银四旗开得胜!javagui界面
- java做登录时要加锁吗_你用对锁了吗?谈谈 Java “锁” 事
- 水晶报表基础入门——4.水晶报表排序、分组技术
- shell基础之99乘法表
- 从12306网站新验证码看Web验证码设计与破解
- U盘安装linux找不到image,U盘安装出现vesamenu.c32 not a COM32R image解决方法
- 百度优化排名_思路和步骤
- 计算机管理磁盘管理右键无反应,win7系统删除磁盘管理磁盘右键菜单只有“帮助”的解决技巧...
- 如何把操作系统迁移到新硬盘?
- MIT 6.824涉及的部分论文翻译
- Spring Container Extension
- 计算机网络相关术语概念名词汇总总结集合——摘自《计算机网络--自顶向下》第四章