数据库逻辑结构设计阶段
我们在概要设计阶段解决了客户的需求,并绘制了 E-R图。逻辑结构设计的任务,就是把在概要结构设计阶段建立的基本 E-R 图,按选定的关系数据模型的原则转换成相应的数据库模型图。
本节将介绍如何将 E-R图转化为关系模型和数据库模型图,下一节我们介绍如何判断数据表结构设计是否规范。
一般情况下,我们把关系模式表示为
将 E-R 图转换为关系模式的步骤如下。
酒店管理系统中客房与客人的关系为一对多关系,转换后的结果如下。
上述关系模式中含有下划线的属性代表主属性,在表中作为主键,加粗属性为外键。
将 E-R 图转化为数据库模型图主要执行以下 4 步:
添加实体之间的映射关系,具体步骤如下:
为了数据编码的兼容性,建议使用英文字段。为了直观可见,我们在英文括号内注明了对应的中文含义。下面将 E-R 图中的“客房”和“客人”两个实体转换为数据库模型图,如下图所示。
在数据库模型图中也可以很好的体现实体之间的映射关系。比如,客房和客人之间是一对多关系,对于一对多关系的两个实体,一般会各自转换为一张表,并且后者对应的表引用前者对应的表,即客人(GuestRecord)表中的客房号来自客房(Room)表中的客房号,它们之间应建立主键、外键关系,如上图所示。
一般来说,一对多关系是一个表中的主键对应另一个表中可重复字段,主键的值是不能重复的,而关联的字段是可以重复的,这样就会存在一个值对应一个值或者一个值对应多个值。在一对一关系中,一般是一个主键对应一个不可重复的字段,显然只能一个值对应一个值。
多对多映射关系也是比较常见的。要表示多对多关系,除了将多对多关系中的两个实体各自转换为表外,一般还会创建第三个表,称为连接表。它将多对多关系划分为两个一对多关系,并且将这两个表的主键都插入到第三个表中。
例如,订单表和产品表有多对多关系,这种关系通常通过与“订单明细”表建立两个一对多关系来定义。一个订单可以有多个产品,每个产品可以出现在多个订单中。关于这一点可以在以后的数据库设计实例中慢慢理解。
本节将介绍如何将 E-R图转化为关系模型和数据库模型图,下一节我们介绍如何判断数据表结构设计是否规范。
关系数据库模式
用二维表的形式表示实体与实体间关系的数据模型称为关系模型。关系数据库模式是对关系数据库结构的描述,或者说是对关系数据库框架的描述。一个关系通常对应一张表。一般情况下,我们把关系模式表示为
R(U)
或 R(A,B)
。其中,R 表示关系名,U 表示属性集合,A、B 代表 U 中的属性。将 E-R 图转换为关系模式的步骤如下。
1)把每个实体都转化为关系模式 R(A,B) 形式
以酒店管理系统为例,实体“客人”和“客房”分别可以使用关系模式表示如下。- 客房(客房号,客房描述,客房类型,客房状态,床位数,入住人数,价格)。
- 客人(客人编号,客人姓名,身份证号,入住日期,结账日期,押金,总金额)。
2)建立实体间关系的转换
实体间的关系分成一对一、一对多、多对多三种,当两个实体各自转化为关系模式后,实体间关系的转换如下。- 一对一的转换:把任意实体的主键放到另一个实体的关系模式中。
- 一对多的转换:把关系数量为 1 的实体的主键放到关系数量为 N 的实体关系模式中。
- 多对多的转换:把两个实体中的主键和关系的属性放到另一个关系模式中,会多生成一个关系模式。
酒店管理系统中客房与客人的关系为一对多关系,转换后的结果如下。
- 客房(客房号,客房描述,客房类型,客房状态,床位数,入住人数,价格)。
- 客人(客人编号,客人姓名,身份证号,入住日期,结账日期,押金,总金额,客房号)。
上述关系模式中含有下划线的属性代表主属性,在表中作为主键,加粗属性为外键。
数据库模型图
数据库模型图主要用来说明数据库有哪些表,表中有哪些属性以及表与表之间的关联关系。将 E-R 图转化为数据库模型图主要执行以下 4 步:
- 在 Visio 中新建数据库模型图
- 添加实体,将 E-R图中各实体转化为对应的表
- 将各属性转化为各表对应的列,定义字段名称、数据类型等
- 添加实体之间的映射关系
添加实体之间的映射关系,具体步骤如下:
- 添加 GuestRecord(客人)实体和 Room(客房)实体。
- 为 GuestRecord 表添加外键约束列 RoomID(客房号),对应 Room 表中的 RoomID 列。
为了数据编码的兼容性,建议使用英文字段。为了直观可见,我们在英文括号内注明了对应的中文含义。下面将 E-R 图中的“客房”和“客人”两个实体转换为数据库模型图,如下图所示。
图中的 PK 表示表的主键列,FK 表示外键列。需要注意的是,表中的 ID 编号列只能用作主键或外键,否则该列没有实际含义。如客人表中的 GuestID 列,客房表中添加的 RoomID 列。
在数据库模型图中也可以很好的体现实体之间的映射关系。比如,客房和客人之间是一对多关系,对于一对多关系的两个实体,一般会各自转换为一张表,并且后者对应的表引用前者对应的表,即客人(GuestRecord)表中的客房号来自客房(Room)表中的客房号,它们之间应建立主键、外键关系,如上图所示。
一般来说,一对多关系是一个表中的主键对应另一个表中可重复字段,主键的值是不能重复的,而关联的字段是可以重复的,这样就会存在一个值对应一个值或者一个值对应多个值。在一对一关系中,一般是一个主键对应一个不可重复的字段,显然只能一个值对应一个值。
多对多映射关系也是比较常见的。要表示多对多关系,除了将多对多关系中的两个实体各自转换为表外,一般还会创建第三个表,称为连接表。它将多对多关系划分为两个一对多关系,并且将这两个表的主键都插入到第三个表中。
例如,订单表和产品表有多对多关系,这种关系通常通过与“订单明细”表建立两个一对多关系来定义。一个订单可以有多个产品,每个产品可以出现在多个订单中。关于这一点可以在以后的数据库设计实例中慢慢理解。
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算