数据库三范式

数据库三范式

 

示例表数据

假设有一个名为employee的员工表,它有九个属性:id(员工编号)、name(员工名称)、mobile(电话)、zip(邮编)、province(省份)、city(城市)、district(区县)、deptNo(所属部门编号)、deptName(所属部门名称)、表总数据如下:

idnamemobilezipprovincecitydistrictdeptNodeptName
101张三13910000001<br />13910000002100001北京北京海淀区D1部门1
101张三13910000001<br />13910000002100001北京北京海淀区D2部门2
102李四13910000003200001上海上海静安区D3部门3
103王五13910000004510001广东省广州白云区D4部门4
103王五13910000004510001广东省广州白云区D5部门 5

由于此员工表是非规范化的,我们将面对如下的问题。

  • 修改异常:上表中张三有两条记录,因为他隶属于两个部门。如果我们要修改张三的地址,必修修改两行记录。假如一个部门得到了张三的新地址并进行了更新,而另一个部门没有,那么此时张三在表中会存在两个不同的地址,导致了数据不一致

  • 新增异常:假如一个新员工假如公司,他正处于入职培训阶段,还没有被正式分配到某个部门,如果deptNo字段不允许为空,我们就无法向employee表中新增该员工的数据。

  • 删除异常:假设公司撤销了D3部门,那么在删除deptNo为D3的行时,会将李四的信息也一并删除。因为他隶属于D3这一部门。

第一范式(1NF)

表中的列只能含有原子性(不可再分)的值。

表中的张三有两个手机号存储在mobile列中,违反了 1NF 规则。为了使表满足 1NF,数据应该修改如下:

idnamemobilezipprovincecitydistrictdeptNodeptName
101张三13910000001100001北京北京海淀区D1部门1
101张三13910000002100001北京北京海淀区D1部门1
101张三13910000001100001北京北京海淀区D2部门2
101张三13910000002100001北京北京海淀区D2部门2
102李四13910000003200001上海上海静安区D3部门3
103王五13910000004510001广东省广州白云区D4部门4
103王五13910000004510001广东省广州白云区D5部门 5

第二范式(2NF)

第二范式要同时满足下面两个条件

  • 满足第一范式

  • 没有部分依赖

例如,员工表的一个候选键是{id,mobile,deptNo},而deptName依赖于deptNo,同样 name 依赖于 id,因此不是 2NF的。为了满足第二范式的条件,需要将这个表拆分成employee、dept、employee_dept、employee_mobile四个表。如下:

员工表 employee

idnamezipprovincecitydistrict
101张三100001北京北京海淀区
102李四200001上海上海静安区
103王五510001广东省广州白云区

部门表 dept

deptNodeptName
D1部门1
D2部门2
D3部门3
D4部门4
D5部门5

员工部门关系表 employee_dept

iddeptNo
101D1
101D2
102D3
103D4
104D5

员工电话表 employee_mobile

idmobile
10113910000001
10113910000002
10213910000003
10313910000004

第三范式(3NF)

第三范式要同时满足下面两个条件

  • 满足第二范式
  • 没有传递依赖

例如,员工表的province、city、district依赖于zip,而zip依赖于id,换句话说,province、city、district传递依赖于id,违反了 3NF 规则。为了满足第三范式的条件,可以将这个表拆分成employee和zip两个表,如下

employee

idnamezip
101张三100001
102李四200001
103王五510001

地区表area

zipprovincecitydistrict
100001北京北京海淀区
200001上海上海静安区
51000广东省广州白云区

在关系数据库模型设计中,一般需要满足第三范式的要求。如果一个表具有良好的主外键设计,就应该是满足3NF的表。规范化带来的好处是通过减少数据冗余提高更新数据的效率,同时保证数据完整性。然而,我们在实际应用中也要防止过度规范化的问题。规范化程度越高,划分的表就越多,在查询数据时越有可能使用表连接操作。而如果连接的表过多,会影响查询性能。关键的问题是要依据业务需求,仔细权衡数据查询和数据更新关系,指定最合适的规范化程度。不要为了遵循严格的规范化规则而修改业务需求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值