为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。
在实际开发中最为常见的设计范式有三个:
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
原文:http://www.cnblogs.com/nicoleTeng/p/7723265.html