作为数据库的设置,身为一个程序员,或者说,身为可以管控这些数据的管理员,你会基于什么考虑去设计数据库中的数据该如何存放,该如何关联,该如何减少重复,如何增加有效利用率?这就引出了数据库的设置所需要遵循的原则,当然如何能做到最好,但是在实际的应用中,往往会有所妥协,但是还请尽量往数据库三大范式靠齐。
1.第一范式(确保每列保持原子性)
第一范式就是最基础的范式,解释来说就是所有字段都不可再分割。
举个例子:H2O,就是我们所说的水,但从H2O来看,是能够分割成2个H和一个O的,意味着这是可分割的。
再举个例子:姓名,中国人有多少个姓名?少说也有几十万个名字吧,而实际的汉字总共有几个?所这些名字也是可以拆分个一个个的汉字。
这就意味着如果字段属性不可再分割,及达成了第一个范式的要求。
2.第二范式(确保表中的每列都和主键相关)
第二范式基于第一范式之上的,首先先考虑的一点,你会将什么设为一张表的主键?有人说就UUID呀,好的,那UUID意味着什么?这个UUID与什么相绑定,假设你是一个老师,每个学生都有自己的编号,那你会设置一张表同时存放学生的成绩与学生的姓名吗?还是切分成两张表?一张表存学生信息,一张表存学生成绩?
这里就引出第二范式的思考,即每列确保与主键相关联,是基于主键设置的属性,不可以存入不想关的数据。
3.第三范式(确保每列都和主键列直接相关,而不是间接相关)
第三范式的解释就是说,每个属性都是与这个主键都是直接关联的。对,就是照抄了一遍,因为这个就事这个意思,没有那么复杂的思考。
如果将一个人看作事一张大表的话,你的五官作为一张小表,那你的口鼻眼嘴耳就是属于其中,而心脏就属于脏器类的了。
即要拆分成最小单位的表,减少数据冗余。
总结,第一范式是从字段来约束成最小单位的属性,第二范式就是将主键与字段进行了关联,第三范式就是需要主键与字段直接关联,一般实际开发中,第二范式还是能够遵守的,第三范式往往就要根据实际的业务场景判断是否需要进行拆分。