为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。
在实际开发中最为常见的设计范式有三个:
1.第一范式(确保每列保持原子性)
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
place table (primary key: image_path, 地理位置不可分)
id | image_path | country | city | district | time |
1 | /storage/xxx1.jpg | china | shenzhen | NanShan | 2017-10-20 |
2 | /storage/xxx2.jpg | USA | New York | null | 2016-9-10 |
3 | /storage/xxx3.jpg | Japan | Tokyo | null | 2012-8-30 |
2.第二范式(确保表中的每列都和主键相关)
第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
face table (primary key: image_path + personId)
image_path | personId | face_left | face_top | width | height |
/storage/xxx1.jpg | 100 | 100 | 200 | 110 | 110 |
/storage/xxx1.jpg | 200 | 200 | 200 | 120 | 120 |
/storage/xxx2.jpg | 300 | 300 | 300 | 100 | 100 |
/storage/xxx3.jpg | 100 | 400 | 200 | 130 | 130 |
name table (primary key: personId)
personId | name[用户自定义] |
100 | me |
200 | dad |
300 | mom |
3.第三范式(确保每列都和主键列直接相关,而不是间接相关)
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
总结:
第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;
通俗的理解是,字段还可以再分吗?如过不能,则是符合1NF的设计。
第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
简单的解释,比如你和一个女生约会建立一张表,不用每条约会记录都记录她的身高、体重,将身高体重单独的存在一张表中供查询即可。
第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。
打个比方,比如评论表,如果你将用户ID,用户头像都放在这留言表中,就是不合适的了。用户头像是依赖于用户ID,而不依赖该评论。
参考文章: http://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html