数据库设计和ER模型【数据库原理】

一、数据库设计过程

两个活动:

  • 数据库设计(数据)
  • 应用设计(功能)

本章重点关注数据库设计

  • 为数据库应用设计概念模式(conceptual schema)

应用设计关注程序和连接数据库的而接口

  • 通常是作为软件工程的一部分来考虑
    在这里插入图片描述

二、例子:COMPANY数据库
我们需要根据COMPANY数据库的需求来构造数据库模式:
The company is organized into DEPARTMENTs. Each department has a name, number and an employee who manages the department. We keep track of the start date of the department manager. A department may have several locations.
公司是由部门构成的。每个部门都有一个名字、编号和管理这个部门的员工。我们还需要记录每个部门经历开始管理这个部门的起始时间。一个部门可能有多个地点。
Each department controls a number of PROJECTs. Each project has a unique name, unique number and is located at a single location.
每个部门负责多个项目。每个项目有唯一的名称、唯一的编号并位于一个单独的位置。
We store each EMPLOYEE’s social security number, address, salary, sex, and birthdate.
Each employee works for one department but may work on several projects.
我们存储每个员工的SSN,地址,薪资,性别和出生日期。
每个员工都在一个部门工作但是可以参与多个项目。
We keep track of the number of hours per week that an employee currently works on each project.
We also keep track of the direct supervisor of each employee.
我们要记录每个员工在现阶段参与的项目上花费的时间,我们同时要记录每个员工的直接指导老师。
Each employee may have a number of DEPENDENTs.
For each dependent, we keep track of their name, sex, birthdate, and relationship to the employee.
每个员工可能有多个家属。对于每个家属,我们要记录他们的姓名,性别,生日和与员工的关系

三、ER模式的概念

实体和属性

  • 实体就是在一个局部应用领域里特殊的对象或事物
    例如:员工:Smith,部门:research,项目:productX

  • 属性就是用来描述实体的特性
    例如:EMPLOYEE实体有属性:Name,SSN,Address,Sex,BirthDate

  • 对于每一个特定的实体它的每一个属性都会有一个特定的值
    例如:员工Name=‘Smith’,SSN=‘123456789’

  • 每个属性有一个值域(数据类型)
    比如int,char

1、属性的类型
Simple(简单):

  • 每个实体的属性是原子的。例如SSN或者SEX

Composite(组合):

  • 由若干个简单值构成。例如:Address(Apt#,House#,Street,City)
    Name(fisrtname,lastname)
    在这里插入图片描述

Multi-valued(多值):

  • 一个实体的属性可能有多个值。例如:汽车的颜色:有红色、黑色。

2、实体类型与键属性
实体有相同的基本属性,把这些实体组合起来就形成了一个实体类

  • 例如:SMITH是一个实体,SIMTH和JOHN和ALICE这些实体组合在一起形成实体类EMPLOYEE

实体类的每个属性应该都有一个值,如果这个值是唯一的,那么就称这个属性为实体类的键属性

  • 例如,SSN是EMPLOYEE类的键属性

一个键属性可能是组合的

  • 实体类CAR的键属性是Vehicle TagNumber是由Number和State构成的。

一个实体类可能会有超过两个键

  • 例如:CAR实体可能有VIN和Vehicle TagNumber两个键。

每个键都用下划线标出

3、在ER图中表示实体类
在ER图中,有矩形框来表示一个实体
用椭圆来表示属性

  • 每个属性和实体类联系
  • 组合属性把椭圆连接起来表示
  • 键属性用下划线标出
  • 多值属性用双线椭圆表示

在这里插入图片描述
4、实体集
每个实体类都有一个存储在数据库里的实体集。实体个人的集合形成实体集,我们把它抽象出来变成实体类。
如上图所示,CAR1,CAR2,CAR3这都是实体实例,把他们放在一起形成实体集

5、COMPANY实体类的数据库模式初始设计
基于需求,我们得到如下4个实体类:

  • DEPARTMENT
  • PROJECT
  • EMPLOYEE
  • DEPENDENT

在这里插入图片描述
四、关系
初始的设计是典型的但并不完整
有些抽象的需求,我们需要用关系表示
ER模型包含三方面:

  • 实体(和他们的实体类,实体集)
  • 属性(简单的,组合的,多值的)
  • 关系(关系类,关系集)

1、关系和关系类

关系通过一个特定的意义将两个或多个不同的实体联系起来

  • 例如:EMPLOYEE John Smith works on the ProductX PROJECT,or EMPLOYEE Franklin Wong manages the Research DEPARTMENT

相同类型的关系被组合抽象成关系类

  • 例如:EMPLOYEE实体类和PROJECT实体类之间抽象出WORKS_ON关系

关系类的度(degree)是参与这个关系的实体的数量

  • 例如:WORKS_ON是一个二元联系

Relationship instances of the WORKS_FOR N:1 relationship between EMPLOYEE and DEPARTMENT
在这里插入图片描述
这里r1,r2,r3…是关系实体。一个员工对应一个部门,但是一个部门最多可以有N个对应的员工。

Relationship instances of the M:N WORKS_ON relationship between EMPLOYEE and PROJECT
在这里插入图片描述
这里一个员工最多可以参与N个项目,一个项目最多对应M个员工,e1既参与p1项目有参与p4项目

2、关系类和关系集
关系类:

  • 关系模式的描述
  • 标识参与联系的实体类之间的关系名称
  • 标识特定关系的约束

关系集:

  • 当前的关系实例
  • 是关系类的一种当前的状态

在ER图中,我们用菱形表示关系类,用实线把参与关系的实体连接起来

我们引入关系来细化我们的COMPANY数据库
我们得到如下的关系:

WORKS_FOR (between EMPLOYEE, DEPARTMENT)
MANAGES (also between EMPLOYEE, DEPARTMENT)
CONTROLS (between DEPARTMENT, PROJECT)
WORKS_ON (between EMPLOYEE, PROJECT)
SUPERVISION (between EMPLOYEE (as subordinate), EMPLOYEE (as supervisor))
DEPENDENTS_OF (between EMPLOYEE, DEPENDENT)

细化后的ER图在这里插入图片描述
双线表示一定参与,比如家属的关系,一个家属(双线)必须要有一个对应的员工,一个员工(单线)可能对应0个家属,最多对应N个家属

3、弱实体类(双线矩形框表示)
弱实体没有键属性
弱实体参与关系,它的存在依赖于另一个实体
比如上图所示的,弱实体是家属,它依赖于员工实体

4、关系的约束
一对一、一对多、多对一、多对多
(min,max)
在这里插入图片描述
第一行表示一个员工最多管理一个部门,最少管理0个部门;一个部门最多由一个员工来管理,最少由0个员工的来管理。
第二行表示一个员工最多在一个部门工作,最少在一个部门工作;一个部门最多有N个员工,最少有1个员工。
这与下图中的1:1,1:N,N:M相反
在这里插入图片描述 这里的WORKS_FOR关系中的N表示一个部门对应最多N个员工,这里的1表示一个员工对应一个部门