引言
最近,本帅在进行无聊的复试备考,而哈工程复试是要求的数据库概论,和网络安全盖伦,是的,盖伦,肉的恶心,我学了很久,经过不懈的钻研,终于摸索出来了数据库设计的基本流程,那么,下面跟着本帅一起进行数据库设计的探索吧!
流程
- 建立概念模型ER图
- 根据ER图写出表
- 根据范式要求写出符合范式要求的表
建立ER图,并根据ER图建立初始表
-
找出实体(尽量找大类,相当于java中的类,不是找个体,并且实体可以用叠词形容词来形容)
-
找出属性,并标记出关键字属性
-
找出各个实体间的联系
1.注意联系之间的元数 2.确定联系的基数(1对1,1对多,多对多)
注:
1.实体=表,属性=表中字段(属性)
2.表实际上就是结构化的关系的集合,也称为关系。
而集合与集合之间就是一种映射关系,映射关系可以分为一一对应,一对多(包含),多对多(你中有我,我中有你,相互包含)。
假设我们有一种映射关系叫做夫妻关系f,x∈{女人},y∈{男人},且有表记录有关信息如下:
女人实体表(身份证,姓名,身高,…)
男人实体表(身份证,姓名,身高,…)
a.假设我们在近代,那么f这个关系便是一一对应的,我们如何表示这种一一对应关系呢
我们会表示成f(x)= y。 也就是,x的老公是y
由于是单值函数,写成t(y)=x也可以,即也能表示为y的老婆是x
那么我们如何在表中记录下来这个映射关系呢
很简单,我们可以在男人实体表或者女人实体表中加上一个字段,引用唯一标识对方身份的属性,来表示夫妻是谁。
即:
男人实体表(身份证,姓名,身高,…)
女人实体表(身份证,姓名,身高,…,老公身份证)
或者,
男人实体表(身份证,姓名,身高,…,老婆身份证)
女人实体表(身份证,姓名,身高,…)
那么,这个引用唯一标识对方身份的字段(即主键),就是外键。
而这种一一对应的关系,实则就是联系中的1对1联系。
b.假设我们在古代,那么f这个关系便是一对多的,我们又如何表示这种关系呢
很简单因为古代是一个男人y可以娶多个女人xi(i=0,1,…)
我们可以记作f(xi)=y,也就是xi对应的这几个女人都是y这个男人的老婆。
因此我们可以借鉴上面1对1在表中表示的映射关系,将唯一能标识男人y的属性(男人实体表中的主键)引用到女人实体表中,这样就能表示这种一夫多妻的关系了。我们可以把1对多这种关系在表中表示如下:
女人实体表(身份证,姓名,身高,…,老公身份证)
女人x1(身份证1,姓名1,身高1,老公y.身份证号)
女人x2(身份证2,姓名2,身高2,老公y.身份证号)
…
女人xi(身份证i,姓名i,身高i,老公y.身份证号)
这样,女人xi的老公都是y,清楚的表示了出来
因此,联系中的1对1和1对多,都是采用引入外键的形式,来标注表1对应的实体与表2之间的一种映射关系。其中联系基数为1的1端所在实体表中的主键被多端所在实体表作为外键引用。
c.而多对多,实际上就是两个实体之间都是能有1对多的关系,按照上面的分析,我们需要在多端对应的实体中引用1端的主键作为外键,因此由于可以拆成两个多对多,我们分别两个实体的主键都要引入做外键,而且为了保持映射关系,不能放入到一个任意一个表中,因此需新建一个表,引入两个外键来表示这种多对多的映射关系。
m:n -> 1:m + 1:n;
至此,我们就能用er图将表写出大概的表。
写表规则:
- 每个实体对应一个表,属性对应一个字段
- 注意多对多联系,多对多联系实质上也是一个表,而且会继承联系的实体主键做外键
- 写完表后进行一定的整合,去除一部分冗余
用范式将表进行规范化
范式规则
范式 | 规则 |
---|---|
1NF | 单位格不可再分 |
2NF | 对候选键完全依赖 |
3NF | 没有传递依赖 |
BCNF | F函数依赖集合中左边都是候选键(起决定作用的都是候选键) |
以上范式规则都提到了候选键,那么如何找候选键呢?
假设给定关系集合R={A,B,C,D} 有F={B->D,D->B,AB->C}
则
1.L(仅在F左边出现):A
LR(既在左边出现,又在右边出现):B,D
R(尽在F右边出现):C(在右边出现证明不能决定别人,因此一定非候选键)
2.对L和LR中的进行组合计算闭包(能决定的元素集合)
A+={}
AB+={A,B,C,D}=R
AD+={A,B,C,D}=R
因此AB和AD都能决定R,所以是候选键
范式判断流程图