我们在概要设计阶段解决了客户的需求,并绘制了 E-R图。逻辑结构设计的任务,就是把在概要结构设计阶段建立的基本 E-R 图,按选定的关系数据模型的原则转换成相应的数据库模型图。
本节将介绍如何将 E-R图转化为关系模型和数据库模型图,下一节我们介绍如何判断数据表结构设计是否规范。
用二维表的形式表示实体与实体间关系的数据模型称为关系模型。关系数据库模式是对关系数据库结构的描述,或者说是对关系数据库框架的描述。一个关系通常对应一张表。
一般情况下,我们把关系模式表示为 R(U) 或 R(A,B)。其中,R 表示关系名,U 表示属性集合,A、B 代表 U 中的属性。
将 E-R 图转换为关系模式的步骤如下。
以酒店管理系统为例,实体“客人”和“客房”分别可以使用关系模式表示如下。
实体间的关系分成一对一、一对多、多对多三种,当两个实体各自转化为关系模式后,实体间关系的转换如下。
酒店管理系统中客房与客人的关系为一对多关系,转换后的结果如下。
上述关系模式中含有下划线的属性代表主属性,在表中作为主键,加粗属性为外键。
数据库模型图主要用来说明数据库有哪些表,表中有哪些属性以及表与表之间的关联关系。
将 E-R 图转化为数据库模型图主要执行以下 4 步:
添加实体之间的映射关系,具体步骤如下:
为了数据编码的兼容性,建议使用英文字段。为了直观可见,我们在英文括号内注明了对应的中文含义。下面将 E-R 图中的“客房”和“客人”两个实体转换为数据库模型图,如下图所示。
图中的 PK 表示表的主键列,FK 表示外键列。需要注意的是,表中的 ID 编号列只能用作主键或外键,否则该列没有实际含义。如客人表中的 GuestID 列,客房表中添加的 RoomID 列。
在数据库模型图中也可以很好的体现实体之间的映射关系。比如,客房和客人之间是一对多关系,对于一对多关系的两个实体,一般会各自转换为一张表,并且后者对应的表引用前者对应的表,即客人(GuestRecord)表中的客房号来自客房(Room)表中的客房号,它们之间应建立主键、外键关系,如上图所示。
一般来说,一对多关系是一个表中的主键对应另一个表中可重复字段,主键的值是不能重复的,而关联的字段是可以重复的,这样就会存在一个值对应一个值或者一个值对应多个值。在一对一关系中,一般是一个主键对应一个不可重复的字段,显然只能一个值对应一个值。
多对多映射关系也是比较常见的。要表示多对多关系,除了将多对多关系中的两个实体各自转换为表外,一般还会创建第三个表,称为连接表。它将多对多关系划分为两个一对多关系,并且将这两个表的主键都插入到第三个表中。
例如,订单表和产品表有多对多关系,这种关系通常通过与“订单明细”表建立两个一对多关系来定义。一个订单可以有多个产品,每个产品可以出现在多个订单中。关于这一点可以在以后的数据库设计实例中慢慢理解。