定义

2NF有以下几条要求:

  1. 建立在1NF之上
  2. 不含有部分依赖(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. 数据库设计的相关原则

    在目前的企业信息系统中,数据库还是最佳的数据存储方式,虽然已经有很多的书籍在指导我们进行数据库设计,但应该那种方式是设计数据库的表结构的最好方法.设计时应遵从什么样的原则.四个范式如何能够用一种方式达 ...

  2. 数据库设计(二)——数据库设计原则

    一.数据库表的设计原则 1.不应该针对整个系统进行数据库设计,而应该根据系统架构中的组件划分,针对每个组件所处理的业务进行组件单元的数据库设计:不同组件间所对应的数据库表之间的关联应尽可能减少,如果不 ...

  3. 如何设计数据库(数据库设计原则)

    数据库设计的三大范式:为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的总结.要想设计一个结构合理的关系型数据库,必须满 ...

  4. MySQL 学习笔记(14)— 数据库设计流程、实体关系图、第一范式、第二范式、第三范式、外键使用

    本文参考:https://gitbook.cn/gitchat/column/undefined/topic/5db92c12a9c3a53bc3800f0c 1. 数据库设计流程 数据库设计是对数据 ...

  5. 数据库第一范式1NF,第二范式2NF,第三范式3NF详解

    文章目录 一,超码.主码.候选码之间的定义与联系 二,函数依赖. 三,三大范式 第一范式(1NF): 第二范式(2NF): 第三范式(3NF): BCNF 一,超码.主码.候选码之间的定义与联系 码是 ...

  6. 数据库设计之第一范式、第二范式、第三范式

    一.第一范式 理论: 1.第一范式的目标是确保每列的原子性. 2.如果每列都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式(1NF:First Normal Form). 举例说明: ...

  7. 数据库设计三大范式和ER模型

    1. 数据库设计之三范式的介绍 范式: 对设计数据库提出的一些规范,目前有迹可寻的共有8种范式,一般遵守3范式即可. 第一范式(1NF): 强调的是列的原子性,即列不能够再分成其他几列.(1NF强调字 ...

  8. 14 个实用的数据库设计技巧,一次性教给你!

    目录 原始单据与实体之间的关系 主键与外键 基本表的性质 范式标准 通俗地理解三个范式 要善于识别与正确处理多对多的关系 主键PK的取值方法 正确认识数据冗余 E--R图没有标准答案 视图技术在数据库 ...

  9. DQL查询语句约束数据库设计备份和还原

    DQL:查询语句 1. 排序查询* 语法:order by 子句* order by 排序字段1 排序方式1 , 排序字段2 排序方式2...* 排序方式:* ASC:升序,默认的.* DESC:降序 ...

最新文章

  1. 备忘录吕吕没有备忘录十新建_一份备忘单,可帮助您记住CSS自定义属性
  2. Python程序设计 第六章 函数(续
  3. opencv光流Optical Flow
  4. java控制结构_java控制结构WORD
  5. 1.2.2 OSI参考模型(应用层、表示层、会话层、传输层、网络层、数据链路层、物理层)
  6. vnc连接linux颜色灰色,VNC 灰色的屏幕解决方法
  7. java原子整数_多线程(四、原子类-AtomicInteger)
  8. python与javascript的区别_python与js区别有哪些
  9. 金三银四旗开得胜!javagui界面
  10. java做登录时要加锁吗_你用对锁了吗?谈谈 Java “锁” 事
  11. 水晶报表基础入门——4.水晶报表排序、分组技术
  12. shell基础之99乘法表
  13. 从12306网站新验证码看Web验证码设计与破解
  14. U盘安装linux找不到image,U盘安装出现vesamenu.c32 not a COM32R image解决方法
  15. 百度优化排名_思路和步骤
  16. 计算机管理磁盘管理右键无反应,win7系统删除磁盘管理磁盘右键菜单只有“帮助”的解决技巧...
  17. 如何把操作系统迁移到新硬盘?
  18. MIT 6.824涉及的部分论文翻译
  19. Spring Container Extension
  20. 计算机网络相关术语概念名词汇总总结集合——摘自《计算机网络--自顶向下》第四章

热门文章

  1. 谷歌云oracle,DD Windows 一键脚本(包含GCP谷歌云Oracle甲骨文)
  2. Unity 游戏Demo制作——地下城 一
  3. java中数组如何从大到小排序?
  4. C语言(itoa函数)
  5. Sequence Game
  6. day08——随机森林
  7. 如何在WooCommerce中添加免费送货栏
  8. 前端面试(1)——准备
  9. 计算几何(三)三角形面积
  10. TCP/IP basic