数据库设计——三大范式

发布于:2023-01-19 ⋅ 阅读:(170) ⋅ 点赞:(0)

        在我们设计数据库的过程中,有良好的设计思想如何设计出合理的数据库无疑是非常重要的。

        1.设计表时应该保证表中的属性不可再分割。(单表)

举个例子我们设计一个个人信息表:

        (id,姓名,年龄。性别,住址),那么这个住址我们一般怎么填,那肯定是(xx省xx市xx县xx镇),那么我们看这个属性对于用户的输入来说可能没什么影响。但是对于我们来说,我们要想得到这个地址,我们要切割属性,省的字段长度市的字段长度等等肯定都不相同,这个操作起来就是非常的复杂,所以我们就应该考虑这个设计的合理性。我们可以仔细回想,我们一般在现实生活中是怎么填这些东西的呢?那是先有一个省让你选择,你填一个省。然后是市以此类推,这就是一个设计的合理性问题。所以正确的设计应该是(省,市,区,详细地址),这样我们比如要完成一个需求,得到在北京市的入口数量,是不是就很方便呢?这就是设计的合理性的体现。

        2.非主属性必须完全依赖于主属性。(多对多)

         如上图我们在设计一个多对对关系的表时,一个用户可以用多种职业,而一种职业也可以由多人担任。所以我们要将这种多对多关系的表给联系起来,只能是去设计一个第三方表,将用户id

与角色id联系起来,比如有一个需求要你查询到对应用户的角色名称,理所当然是不是直接将角色名称连在后面就好了呢?如果只是仅仅是完成这个需求是没有问题的,但是在你这样做了以后,后期角色id为1的换了个职业,那我们这样对应的第三方表是不是也要改呢?仅仅为了一个查询的操作,我们就将DML的操作难度全部变复杂,是不是非常的不合理呢?

       

        这才是正确的操作,在建立多对多的两表链接时,第三方表强制要求只能将两表的主属性链接,不能再加入其它非主属性。非主属性必须完全依赖于主属性!

3.属性不依赖于其他的非主属性。(一对多)

        

        外键只放其他表的主键!

         像这里的第二张图,将班级名称也带到学生表中来就是错误的,一旦我们班级表中的班级名称发生DML操作就会引起一系列的数据混乱,所以这也是不可取的!

        到此我们就将数据库设计的三大范式学完了!

本文含有隐藏内容,请 开通VIP 后查看