数据库设计
数据库设计又称数据库逻辑设计或者数据库建模,目的就是将现实中的数据储存在数据库中。这里重点只关注关系数据库,不关系对象关系数据库。
例如学生-课程数据库,如果把所有学生的属性和所有课程的属性全部放在一张表中,可以说是十分糟糕的设计,这是因为这样的数据库不仅有大量的数据冗余,而且修改,删除和插入的时候都有很大的可能会出错。比较好的设计比如做成三张表,一张是学生表,一张是课程表,另一表中存放学生和修过的对应课程以及学生在该课程上的成绩。
E-R模型
E-R模型即实体-关系模型。
在数据库设计中,有3种基本数据分类对象:
- Entity 实体,表示显示对象的集合
- Attribute 属性,是描述实体性质的数据项
- Relationship 关系,实体和实体间的关联
一张实体关系图比如
实体和属性
属性也有一些自己的特点:
- 标识符,是可以唯一确定一个实体对象的属性或者属性集合。对应到表中的候选键。
- 主标识符,是被设计者选出的特殊标识符。对应到表中的主键。
- 描述符,非键的属性或者属性集合。
- 复合属性,聚合了其他属性的属性。
- 多值属性,一个实体对象可以对应多个值的属性。
在E-R图中,实体由矩形表示,属性由椭圆表示,多值属性和实体的链接用双线。
如果把实体和属性对应到表中,那么这是一张和实体同名的表,表的列对应到实体的简单单值属性(注意,复合属性本身并不变成表的列,而是构成复合属性的那些单值属性构成表的列),实体的实例都对应为表的行。原来的标识符对应到表中的候选键,而原来的主标识符对应到表的主键。
实体和关系
在E-R图中,关系用菱形框表示,并且连接到其他实体。关系也可以有自己的属性。如果一个实体有一个关系连接到自己,那么称为递归关系或者环。
实体和关系之间的数量关系可以用card表示,具体如下:
- max_card(E,R)=1 表示E中的一个实例最多连出一个关系线,也就是最多对应到一个F中的对象。称为E单值参与关系R
- max_card(E,R)=n 表示E中的一个实例可以连出多条关系线。称为E多值参与关系R
- min_card(E,R)=1 表示E中的一个对象最少连出一条关系线。称为E强制参与关系R
- min_card(E,R)=0 表示E中的一个对象可以不连关系线。称为E可选参与关系R
- card(E,R)=(0,n) 这样的表达式右面对应的数对第一个表示min_card(E,R),第二个表示max_card(E,R),也很好理解。
可以把card(E,R)的值(一个数对)写在实体和关系的连线上,就可以表示每个实体和关系间的数量对应关系。
一对一联系:指的是两个对象均单值参与
多对一联系:指的是两个对象一个单值参与一个多值参与。
多对多联系:指两个对象均多值参与
联系转化为表
- 多对多联系:转化成一张表,每行表示一个联系实例,列至少要有两个对象的主键属性,还有联系自身所具有的属性。
- 多对一联系:不转化为表,而是将多值参与的对象表的主键,作为外键加入单值参与的对象的表中。
- 一对一联系:如果两个对象分别是T和S,那么既可以在S的表中加入T的主键作为外键,也可以在T的表中加入S的主键作为外键,或者两者都要。如果同时这两个对象又都是强制参与联系,那么最好将两张表合并成一张表,这样可以避免使用外键。
6.3 其他E-R概念
属性的参数
表示一个对象实例可以对应多少个属性。
和联系是类似的,属性也有:
- (0,?)表示属性可选
- (1,?)表示属性强制
- (?,1)表示属性单值
- (?,N)表示属性多值
弱实体
如果一个实体的所有实例都通过联系R依赖于另一个实体存在,那么前者是弱实体,后者是强实体。
泛化层次,泛化联系
可以把很多具有相同公共属性的对象抽象出来他们公共的一部分作为超类型实体,类似于父类的存在。实体类型和泛化类型之间的联系通常被称为is_a联系。
案例学习
图书借阅管理数据库
背景
粗体表示主键
实体:
- 图书,有书号和书名。
- 读者,有借书证号,姓名,身份证号,住址,电话。
- 出版社,有名称,地址,电话。
联系:
- 每本书有一个出版社发行
- 读者可以借多本书
- 图书借阅要记录开始日期和归还日期
E-R图
表设计
- 图书表(书号,书名,出版社名)
- 出版社(名称,电话,地址)
- 读者(借书证号,姓名,身份证号,地址)
- 读者电话(借书证号,电话)
- 借阅(借书证号,书号,借阅日,归还日)
篮球联赛信息管理
背景
实体:
- 球员,有姓名,球衣号码,身高,体重,位置。
- 球队,有队名,主场体育场名。
关系:
- 每个球员效力于一个球队
- 比赛主客场多循环,需要记录日期和比分
方案1 E-R图
将比赛视为关系而不是实体
方案2 E-R图
将比赛也视为一个实体处理,有一个主键mid
表设计
方案二的表:
- 球员(姓名,…,球队名)
- 球队(球队名,…)
- 比赛(mid,日期,比分,主队名,客队名)
方案一的话比赛没有mid。
网络论坛聊天管理
背景
- 用户,有用户名,email,电话,地址。
- 帖子,有ID,标题,内容。
- 帖子的发帖用户,帖子之间有回复关系。
E-R图
表设计
- 用户(用户名,电话,地址,email)
- 帖子(ID,标题,内容,用户名,原贴ID)
也可以把回复关系新建一个表。
邮件信息管理
背景
- 用户,有email,用户名,电话,地址
- 邮件,有ID,标题,内容,收件人集合,抄送人集合
- 邮件之间有回复关系
E-R图
这个例子正说明,两个实体之间可以有多条关系存在。
表设计
- 用户(email,用户名,电话,地址)
- 邮件(ID,标题,内容,发件人email,原邮件ID)
- 接受(ID,收件人email)
- 抄送(ID,抄送人email)