数据库设计有1NF、2NF、3NF、BCNF、4NF、5NF。从左往右,越后面的数据库设计范式冗余度越低。

满足后一个设计范式也必定满足前一个设计范式。

1NF只要求每个属性是不可再分的,基本每个数据库都会满足。

2NF要求每个联系都满足完全依赖,不能存在部分决定(partial dependency)。

例如,某关系R有6个属性:ABCDEG,满足的函数依赖(functional dependency)为:

F = {A->B, B->C, AD->G, D->E}

可以看出,其主键(Primary Key)为{A,D}

由于函数依赖A->B, B->C, D->E的左边不是完整的AD, 故它违背了完全依赖的要求,没有达到2NF的设计要求

3NF与BCNF很接近,设计要求比BCNF略微宽松,故先来探讨BCNF

BCNF的口号是:对每个函数依赖(FD),左边都要是超码(Superkey),

其具体定义为:

如果As->Bs是R中一个非平凡的函数依赖,那么As是R的一个超码。

其中,非平凡是指:Bs不是As的子集

3NF比BCNF要求宽松一点,即:

如果As->Bs是R中一个非平凡的函数依赖,那么As是R的一个超码, 或者Bs是主键(Primary Key)的一部分。

一般而言,数据库设计达到BCNF/3NF,就已经足够了。

选择达到3NF或者BCNF往往是一个权衡的过程,3NF存在冗余,但能够避免FD的丢失;

BCNF冗余更低,但可能造成FD的丢失。其中FD的丢失指将新得到的表合并后,会比原来的表多出来一些本来不存在的信息。

最新文章

  1. 如何装最多的水? — leetcode 11. Container With Most Water
  2. LINUX下的PHP
  3. 转:ProgressMonitorDialog
  4. webClient请求JAVA超时解决方案
  5. usp_Copy_Unzip_DirFiles -- 拷贝,解压,列出文件名 from FTP Folder to Work Folder
  6. android学习日记03--常用控件tabSpec/tabHost
  7. Maven实战二
  8. ios内存详解
  9. UVA732【DFS+栈】
  10. 剑指offer(javascript实现)
  11. FastStone Capture(FSCapture)
  12. Extjs 改变grid行的背景颜色
  13. vue 项目界面绘制_stylus_iconfont_swiper
  14. 如何用ABP框架快速完成项目(9) - 用ABP一个人快速完成项目(5) - 不要执着于设计模式和DDD理论,避免原教旨主义
  15. Linux系统中常用的命令汇总
  16. Github+阿超运算
  17. zabbix3.4.7安装在centos 7.4上
  18. vue组件知识点
  19. Xcode常见快捷键
  20. PAT甲题题解-1067. Sort with Swap(0,*) (25)-贪心算法

热门文章

  1. select,poll.epoll区别于联系
  2. verilog分频模块设计
  3. linux yum 安装及卸载
  4. Cocos Creator 热更新文件MD5计算和需要注意的问题
  5. 软件测试 基础 (三) (web 页面常见功能测试)
  6. 使用IDEA搭建一个 Spring + Spring MVC + Mybatis 的Web项目 ( 零配置文件 )
  7. Codeforces Round #608 (Div. 2) D. Portals
  8. C# 选择文件夹 选择文件
  9. IE浏览器如何实现断点续传
  10. windows下安装geopandas