用一个例子理解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,主页,电话,联系地址,回复标题,回复内容全部需要系统复制,造成数据冗余。

更新异常--若某个用户改绑个人信息,则需要系统修改大量元组的值,浪费时间。。。

插入异常--若某个用户想创个小号,但不想费事儿的填邮箱,电话,那完了。。。创建不了。(涉及空值,暂时不会)

删除异常--若某个用户言论不当想撤回发帖,一撤回,糟了,自己的账号被回收了用一个例子理解1NF,2NF,3NF,BCNF。。(此篇纯水,无价值)

那就进一步修改,

create table31(用户名,email,主页,电话,联系地址

create table32 (发帖ID,发帖标题,发帖内容)

create table33 (回复ID,回复标题,回复内容)

由于题(不)目(想)较(再)简(写)单(了),table3-1,2,3内都不存在传递函数依赖满足3NF,

同时,由于主属性只有一个,也不会存在主属性间的相互依赖,不存在符不符合BCNF的问题。

这样设计就满足1NF,2NF,3NF,BCNF。。。

当然还有改进的空间,但我真心不会了。。。。。。

下面总结一下--

用一个例子理解1NF,2NF,3NF,BCNF。。(此篇纯水,无价值)

1NF---无重复的列

2NF--消除非主属性的部分函数依赖(保证非主属性对主属性的完全函数依赖)

3NF--非主属性不依赖于非主属性(消除非主属性的传递函数依赖)

BCNF--消除主属性的间的依赖(消除主属性对码的传递函数依赖)

真完了......

大佬看完给个意见呗