目录
在建设数据库过程中,最重要的是,需求分析阶段。这一步决定了数据库项目的成败。
需求分析阶段,也叫做ER建模,【rentity-relationship modeling】也叫做需求可视化,概念建模。这个结阶段需要数据库开发人员和需求方以ER图的方式,对业务需求进行,可视化展现。
基本概念
1. 实体 entity
实体表示客观世界中众多的概念,比如:人,地点,事件。
每个实体包含了多个实体成员。实体人可能是小王,小张;地点是篮球场,操场等。
ER图中,用矩形表示实体:
2. 属性 attribute
每个实体都有属性,比如:人的名字,人的性别,人的年龄等;在ER图中用椭圆表示实体的特征。属性等同于特征。
每个属性至少有一个唯一属性,要用下划线标记,比如id字段就是唯一的。
3. 联系 relation
实体和实体间通常有某种关联,在ER图中菱形表示。比如某一个员工向主管汇报,如图:
在实体和实体之间的连线上,有一些符号。
这些符号叫做基数约束。
参考理解
联系: 用菱形表示,菱形框里阿米哪些联系名,并将相关的实体连接起来,同时在旁边标上类型, 是1:1,或者1:n或者m:n 。比如下图中的班级和学生组成关系,老师和课程有任课关系。
3.1 基数约束的四种形态
3.1.1 基数约束形态一
表示强制多个对应,一个实体A对应多个实体B。
3.1.2 基数约束形态二
表示可选多个对应,一个实体A可对应0个或者多个实体B。
3.1.3 基数约束形态三
表示强制单个对应,一个实体A对应一个实体B。
3.1.4 基数约束形态四
表示可选单个对应,一个实体A对应0个或者1个实体B。
综上所述:
符号部分分为了两个部分:左边要么是竖杠要么圆圈;右边要么是竖杠要么是开口的三角。
左边的竖杠:强制对应;
左边的圆圈:可选对应;
右边的竖杠:对应0个或者1个实体;
右边的三角:对应1个或者多个实体;
最终有4种组合。
联系都是双向的,实际建模常见的是这样:
上面的解读是:实体A对应0个或者1个实体B,同时,实体B对应1个或者多个实体A。
扩展概念
以上是基础ER建模。为了更细致的刻画用户需求,又出现了下面的建模规则。
1. 复合属性 composite attribute
有的属性具有复合特点,比如地址属性,地址包含了省份,城市,等子属性。
ER图上这类属性的属性,用圆括号标记,扩展为多个子属性。参考下图的商店实体定义:
STORE为实体,storeId是唯一属性,所以用下划线标识;storeAddress是store的直接属性,storeAddress属性还有自己的子属性。
2. 多指属性 multivalued attribute
有的属性具有多个值,比如一个人可能有多个电话号码。
ER图上用双层椭圆标识:
3. 派生属性 derives attribute
有的属性,可以从其他属性或者其他数据派生出来,这类属性在ER图上用虚线椭圆标识。
上图中的YearsInBusiness属性,表示店铺开张了多少年,这个属性可以结合OpeningDate属性计算出来。所以可算作是派生属性。
4. 可选属性 optional attribute
有些属性可能没有取值,比如奖金。
ER图上这样的属性后面添加(O)标识。
5. 联系的进一步描述
a. 可以在关联中,表示出最大最小基数。
上图表示:1个学生对应到了2到6间教室;1个教室对应了5到40个学生。
b. 也可以在关联中说明关联的关系。下面是一种较常见的一元关联:
左边的单词是recipient【接受】,右边是giver【送出】
每个人只能给其他人一份礼物,但是可以收到0或者多份礼物。
6. 关联实体
关联实体用于描述 M:N 关联的一个替代方法。用一个内部菱形表示,这个实体没有唯一属性也没有唯一属性,就是没有任何属性。
以上2个图,是等价的。
关联实体基本是用在多对多的场景下,后续会讲到。
7. 弱实体
一般,实体至少要有一个唯一属性。这样才能精确的定位到要处理的数据。但是在ER建模这一层,也并非总是如此。
举例子:假如现在需要为连锁酒店系统进行ER建模。现在记录下各地酒店的房间使用情况。可以将房间的使用相关信息作为酒店的建模的一个多值复合属性。如图:
这样做是没有问题。但是没有体现出部分码的地位,就是没有RoomId在各个BuildingId的唯一性。同时,很多时候也需要将房间这个实体和其他实体关联。比如每个房间的清洁工。
引入弱实体机制后,就能解决这个问题。
两个地方要注意:
(1) 弱实体的主码,成为部分码。码名下方用虚线表示。上面的Room就是弱实体。
(2)弱实体至少要有一个属主实体。即Room弱实体至少要属于Building这一个实体。还可以属于其他实体。弱实体和属主实体之间(Room弱实体和Building实体之间)用双菱形标识。弱实体的部分码和同属主实体的候选码的组合可以定位到唯一的弱实体的记录。
(3)上面的说的码,个人理解的就是键。部分码就是弱实体中的唯一id,作为键;
主实体中主码是主键;候选码是属于主实体的,但是应该是不同于主码的。
高级部分
下面这部分本人是没理解很明白。
1. 相同实体之间具有u多个M:N 关系
某人为一个学生选课系统进行ER建模,得到如下结果:
假如需求中有说明:一个同学一门课只能选一次,那这样的设计没问题。可是如果需求中说明,一个同学可以选一门课几次(可能是挂了好几次),这样的设计就有问题了。
对此,正确的做法之一是使用有两个属主实体的弱实体:
或者为每次预定生成一个唯一的id,如下图所示:
2. 三元(或更多)关系
在ER图中,联系一般是将两个实体关联起来,又或者自己关联自己。但是也有些时候,需求方需要同时将多个实体联系起来。这怎么办呢?要知道表示联系的菱形有且只有两个接口。
答曰:使用关联实体。下面这个ER图中,使用了关联实体描述了某工厂的供货商,生产产品,零件三方联系:
但如果现在需求又变更了,需要给关联增加某些属性,比如说供货商每次提供的货物量,这个ER图就不能用了。
因为这样就没办法区分同一家供应商为同一产品提供等数量的同一零件的不同实例了。解决的办法是把关联实体改成一般的实体,并增设一个唯一标识符:
说明
建模工具可使用PowerDesigner,Workbench等,对于Mac系统可以使用mysql workbench。这里推荐一款轻量级的在线数据库建模工具,网址是https://erdplus.com/#;