/ DB

数据库设计三大范式

1.第一范式(确保每列保持原子性)

第一范式是最基本的范式。如果数据库表中的 所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
有两个规则

  • 具有原子性数据的列中不会有多个类型相同的值
    比如人员信息表,设计人的 兴趣列
name like
job food,jump
mack draw,drink

这样兴趣列就设计得太烂了,
是否可以考虑单独设计一个表,来保存所有人的兴趣,
再设计一个表存储单个人的兴趣

  • 具有原子性数据的表不会有多个存取同类数据的列
    比如人员信息表
name company_address famliy_address play_address
job chongqing shanghangh xxx
mack beijing hebei xxx

各种地址...,也可以单独用表存储

另外,网上有其他文字,经常举例,下面的表不满足第一范式,

name address
job xxx 省 xxx 市 xxx
mack xxx 省 xxx 市 xxx

应该改为下面这样,才满足第一范式

name province city detail_address
job xxx 省 xxx 市 xxx
mack xxx 省 xxx 市 xxx

我个人不是非常同意,这种还是得看具体需求,或许把 【省市详细地址】合并为一个【地址】的方式让你更方便管理数据。

2.第二范式(确保表中的每列都和主键相关)

需要是满足第一范式的基础上来说。
第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

上面的例子中,似乎都没有主键,需要这样

name id age
job 1 23
mack 2 24

实际上,只要是符合第一范式的设计,且只有一列主键,这个表就是符合第二范式的。
这有一点要注意,是表的每一列都与主键相关

3.第三范式(确保每列都和主键列直接相关,而不是间接相关)

需要是满足第二范式的基础上来说。
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
我的举一个【满足第二范式】【不满足第三范式】的例子

name id age bounsLevel bouns
job 1 23 good 3000
mack 2 24 not_bad 1000

这个例子
bounsLevel 和 bouns存在传递依赖,可以单独设计表存储,用外键关联

id bounsLevel bouns
1 good 3000
2 not_bad 1000

总结

第一范式就是原子性,字段不可再分割;
第二范式就是完全依赖,没有部分依赖;
第三范式就是没有传递依赖。