数据库设计范式

为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。

                 

在实际开发中最为常见的设计范式有三个:

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

原文地址:https://www.cnblogs.com/nicoleTeng/p/7723265.html