数据库设计范式
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。
在实际开发中最为常见的设计范式有三个:
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
posted on 2017-10-24 14:15 nicoleTeng 阅读(185) 评论(0) 编辑 收藏 举报