中国中国建设银行网站首页,大型门户网站建设所具有的功能模块主要有几种类型,php网站整合discuz,肇庆百度网站推广好的设计会尽可能少的引入冗余数据#xff0c;或做有损拆分#xff0c;而是使用规范的方法找到正确的分解。而范式则是关系数据库实现设计优化的通用手段。范式与关系数据库的关系可以参考笔者之前的WIKI。
【强制】数据库设计优先满足第三范式(3NF)#xff0c;如果无法满足…好的设计会尽可能少的引入冗余数据或做有损拆分而是使用规范的方法找到正确的分解。而范式则是关系数据库实现设计优化的通用手段。范式与关系数据库的关系可以参考笔者之前的WIKI。
【强制】数据库设计优先满足第三范式(3NF)如果无法满足则尽量满足第二范式(2NF)
在进行数据库设计时如果能够满足第三范式要尽量保证第三范式如果因为性能考虑需要冗余字段无法满足第三范式的时候也要尽量保证第二范式。
第一范式
当关系模式满足第一范式时该关系模式所有属性的域都是原子的。第一范式要求表中列的值具有原子性也就是说表中列的值为不可再次拆分的最小数据单位。常见的非原子域的情况有 (1) 组合属性具有非原子域。如包含子属性street、city、state的属性address。 (2) 使用以集合为值的属性会导致冗余存储数据的设计进而会进一步导致不一致。如数据库设计者可能不将教师和课程安排之间的联系表示为一个单独的关系teaches而是尝试为每一个教师存储一个课程段标志号的集合并为每一个课程段存储一个教师标志号的集合。每当关于哪位教师讲授哪个课程段的数据发生变化时就需同时更新两个地方课程表的教师集合和教师表课程集合。
第二范式
关系模式R属于第二范式如果R中的每个属性A都满足如下准则之一 (1) 它出现在一个候选码中。 (2) 它没有部分依赖于一个候选码。 函数依赖α → \rightarrow →β称为部分依赖(partial dependency)的条件是存在α的真子集γ使得γ → \rightarrow →β。我们称β部分依赖于α。 第二范式要求表中的每条记录都有唯一标识且不存在部分依赖。所谓部分依赖就是指所有非唯一标识字段都必须完全依赖唯一标识不能只依赖唯一标识的一部分。如果知道唯一标识属性的值就可以检索到任何表记录的任何属性的任何值。 假设有关系模型R包含如下属性(学号、课程号、课程名、姓名、学分、成绩)表示学生的课程得分以学号和课程号为唯一标识这里姓名属性只依赖学号学分属性只依赖课程号所以这里存在部分依赖不符合第二范式的要求。 第二范式的核心思想是关系模型的内聚也即拆分思想。对于上面的关系模型可以进一步细分为如下几个关系模型 学生表(学号、姓名) 课程表(课程号、课程名、学分) 学生课程成绩表(学号、课程号、成绩)
第三范式
第三范式是比BC范式弱的范式。任何满足BC范式的关系模式也满足第三范式。具有函数依赖集F的关系模式R属于第三范式(third normal form)的条件是对 F F^ F中所有形如α → \rightarrow →β的函数依赖α ⊆ \subseteq ⊆R且β ⊆ \subseteq ⊆R下面至少有一项是成立 (1) α → \rightarrow →β是平凡的函数依赖(即β ⊆ \subseteq ⊆α)。 (2) α是模式R的一个超码。 (3) β - α中的每一个属性A都包含于R的一个候选码中。 第三范式要求表中的每一个非主键字段都和主键字段直接相关也就是说表中的所有非主键字段不能依赖于其他非主键字段。举例来说不能存在非主属性A依赖于非主属性B非主属性B依赖于主键C的情况即存在A-B-C的依赖关系。也就是说所有非主键属性之间不能有依赖关系必须相互独立。 假设有关系模型R包含如下属性(学号、姓名、年龄、学院、学院电话)因为存在传递依赖(学号) - (姓名) - (学院) - (学院电话)所以不符合第三范式的要求。 第三范式的核心思想是消除所有基于函数依赖能够发现的冗余并保持函数依赖。对于上面的关系模型可以进一步细分为如下几个关系模型 学生(学号、姓名、年龄、学院) 学院(学院、学院电话)
【建议】在遵循范式规则的同时也要考虑反范式设计
软件设计没有银弹并不是说在进行数据库设计时一定要遵循范式在特定的场景下可以考虑反范式设计。
违反第一范式
第一范式强调属性的域的原子性但是特殊情况下违反第一范式也有其价值。如在含有复杂结构的实体域中强制使用第一范式会给应用程序带来不必要的负担如必须编写代码把数据转换成原子形式。从原子形式来回转换数据也会有运行时额外开销。所以这种场景支持非原子的值很有用。事实上现代数据库的确支持很多类型的非原子值。如支持创建复合属性、集合、数组等复杂数据类型。
违反第三方式
第三范式强调的是没有冗余数据因为如果存在冗余就意味着要保证冗余数据的一致性。但是没有冗余的数据库未必是好的数据库。有时为了提高运行效率就必须降低范式标准适当保留冗余数据达到以空间换时间的目的。
参考
https://zhuanlan.zhihu.com/p/617424106 【MySQL】数据库的设计规范重点三大范式 https://blog.csdn.net/kenhins/article/details/51084815 数据库建表规则三大范式 https://cloud.tencent.com/developer/article/2123662 三范式与反范式 https://blog.csdn.net/Systemoutprintl/article/details/108209291 数据库的三大范式 https://www.cnblogs.com/gdwkong/p/9012262.html MySQL设计之三范式的理解