这几天开始了数据库的学习,一开始上课对数据库设计范式进行了比较细致的理解,根据所听到的每个人对设计范式的理解以及在网上对有关文献的阅读,做出如下的小结。
首先,数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不需要的冗余信息。
范式说明:(据我了解的数据库一共有6个范式,而一般来说,数据库只需满足前3个范式)
第一范式(1NF):原子性,即在数据库表中的字段具有不可再分的性质。
一开始还纠结为什么是不能再分了?例如定义一个name的字段不是可以分成username(用户名)和name(本人姓名),经过查阅之后,原来是不允许你把数据库表的一列再分成二列或多列,并且在现有的DBMS中你想设计出不符合1NF的数据库是不可能的。
第二范式(2NF):其他字段对主键的完全依赖性。
先举个例子来阐明一下我的见解:
字段 | id(主键) | name | pwd | address | userdesc |
1 | lzytt | a | asd | ||
2 | lzytt | ||||
3 | llll | asd | |||
4 | dddd | ||||
... |
现在假定一个id号代表一个人的编号,那么通过id号可以找到一个人的在表中列出的其他属性的值,这些值现在依赖这个id号而存在,如果删掉某个id的值,那依赖于它的属性值也随之删掉,如把id=1删掉,那么name=lzytt pwd=a address=asd 这一行所有的值都不存在了。也就是说主键是所有属性中的标识符,它消失则其他关系这个标识的属性都消失。而其他的属性,如果其值不具唯一性,显然就不能作为依赖,这种关系就类似于学生管理系统,每个学号对应一个人的各种信息。
第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是属性完全依赖于主键。
第三范式(3NF):属性不依赖于其它非主属性(消除传递依赖)。
必须先满足第二范式,并且它的任何一个非主属性都不传递依赖于主键,则满足第三范式。
3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。
打个比方,比如评论表,如果你将用户ID,用户头像都放在这留言表中,就是不合适的了。用户头像是依赖于用户ID,而不依赖该评论。