数据库设计原则-范式(2)
第二范式(2NF)
1.在讲第二范式前,首先必须要保证符合第一范式的要求。
2.在前面文章中说到,每行都表示一个实体,不能重复,第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。比如我们前面给的电话本的例子,每个用户都有一个ID,这个ID是唯一的,因此每个用户可以被惟一区分。这个惟一属性列被称为主关键字或主键、主码。
3.属性完全依赖于主键。
例子:这个表设计符合第一范式,但是不符合第二范式。
| OrderId | Company | ContactPerson | Money |
| 1 | 东明企业 | andery | 2347.00 |
| 2 | 德商网络 | jack | 5893.00 |
| 3 | 东明企业 | andery | 1506.00 |
| 4 | 东明企业 | andery | 6503.00 |
上表中订单号(OrderId)是主键,这里公司名字(Company)和订单金额(Money)都依赖于订单号。但是联络人(ContactPerson)则是依赖于公司名称的。
这样会出现的问题:
1.数据冗余,加入一个公司下了100个订单,联络人就会重复出现100次。
2.更新异常,若某公司的联络人有调整,相应的ContactPerson值都要更新,这么多重复的数据都需要更新,产生不需要的消耗。
这里就不符合第二范式,我们就需要分成2个表。
| OrderId | Company | Money |
| 1 | 东明企业 | 2347.00 |
| 2 | 德商网络 | 5893.00 |
| 3 | 东明企业 | 1506.00 |
| 4 | 东明企业 | 6503.00 |
| Company | ContactPerson |
| 东明企业 | andery |
| 德商网络 | jack |
这样符合第二范式了,某公司联络人变更只需要更新第二张表中相应公司的联络人信息就可以了。