用一个例子理解1NF,2NF,3NF,BCNF。。(此篇纯水,无价值)
设计一个论坛的数据库:
(1) 用户:用户名,email,主页,电话,联系地址
(2) 帖子:发帖标题,发帖内容,回复标题,回复内容
第一次:将数据库设计为仅存在表。
create table1(用户名 email 主页 电话 联系地址 发帖标题 发帖内容 回复标题 回复内容)
很显然,这个表是符合第一范式(貌似正常情况下只要成功创建一个表就自动满足1NF),但不符合2NF(用户名是不能决定--发帖标题 发帖内容 回复标题 回复内容)。
将表修改为
create table2(用户名 email 主页 电话 联系地址 发帖ID 发帖标题 发帖内容 回复ID 回复标题
回复内容)添加两个属性--发帖ID,回复ID此时就有
(用户名,发帖ID,回复ID) → (email,主页,电话,联系地址,发帖标题,发帖内容,回复
标题,回复内容) 产生了函数依赖,但这样的修改不符合2NF--
(用户名) → (email,主页,电话,联系地址)
(发帖ID) → (发帖标题,发帖内容)
(回复ID) → (回复标题,回复内容)
即非主属性可以由部分主属性确定,这是部分函数依赖的定义,即破坏了完全函数依赖,不符合2NF,这个设计会导致数据冗余和操作异常。
数据冗余--一个ID多次发帖,则email,主页,电话,联系地址,回复标题,回复内容全部需要系统复制,造成数据冗余。
更新异常--若某个用户改绑个人信息,则需要系统修改大量元组的值,浪费时间。。。
插入异常--若某个用户想创个小号,但不想费事儿的填邮箱,电话,那完了。。。创建不了。(涉及空值,暂时不会)
删除异常--若某个用户言论不当想撤回发帖,一撤回,糟了,自己的账号被回收了
那就进一步修改,
create table31(用户名,email,主页,电话,联系地址)
create table32 (发帖ID,发帖标题,发帖内容)
create table33 (回复ID,回复标题,回复内容)
由于题(不)目(想)较(再)简(写)单(了),table3-1,2,3内都不存在传递函数依赖满足3NF,
同时,由于主属性只有一个,也不会存在主属性间的相互依赖,不存在符不符合BCNF的问题。
这样设计就满足1NF,2NF,3NF,BCNF。。。
当然还有改进的空间,但我真心不会了。。。。。。
下面总结一下--
1NF---无重复的列
2NF--消除非主属性的部分函数依赖(保证非主属性对主属性的完全函数依赖)
3NF--非主属性不依赖于非主属性(消除非主属性的传递函数依赖)
BCNF--消除主属性的间的依赖(消除主属性对码的传递函数依赖)
真完了......
大佬看完给个意见呗