📜  ER模型到关系模型(1)

📅  最后修改于: 2023-12-03 15:30:38.211000             🧑  作者: Mango

ER模型到关系模型

ER模型和关系模型是两种重要的数据库设计方法,其中ER模型是一种概念性的模型,表示实体和实体之间的关系,而关系模型是一种物理性的模型,表示如何在数据库中存储数据。本文将介绍ER模型到关系模型的转换,包括实体、属性、关系、子类型和继承。

实体到表

在ER模型中,实体用图形表示,如下图所示:

ER模型中的实体

每个实体代表一个对象,例如学生、教师、课程等,而在关系模型中,每个实体对应一个表。表包含若干个行和列,其中行用于存储具体的数据,而列用于表示属性。例如,以下是将学生实体转换为SQL表的示例:

CREATE TABLE students (
  student_id INTEGER PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  gender CHAR(1) NOT NULL,
  birthday DATE NOT NULL,
  department_id INTEGER NOT NULL
);

上述SQL代码将创建一个名为"students"的表,其中列分别对应实体的"id"、"name"、"gender"、"birthday"和"department_id"属性。"id"属性在表中作为主键,"department_id"属性表示学生所在的部门,需要引用另一个表中的"department_id"字段。

属性到列

ER模型中的属性表示实体的特征,例如在以下的雇员实体中,每个属性都表示雇员特有的信息:

ER模型中的属性

而在关系模型中,每个属性对应一个列,用于存储相应的数据。例如,以下是将雇员实体转换为SQL表的示例:

CREATE TABLE employees (
  employee_id INTEGER PRIMARY KEY,
  first_name VARCHAR(50) NOT NULL,
  last_name VARCHAR(50) NOT NULL,
  hire_date DATE NOT NULL,
  salary DECIMAL(10,2) NOT NULL,
  department_id INTEGER NOT NULL
);

上述SQL代码中,每个属性均转换为表中的一个列,其中"employee_id"属性作为主键,"salary"属性表示雇员的薪资,采用小数类型存储。"department_id"属性同样引用另一个表中的"department_id"字段,用于表示雇员所在的部门。

关系到外键

ER模型中的关系表示实体之间的联系,例如以下的雇佣关系:

ER模型中的关系

在关系模型中,每个关系对应一个外键,用于表达两个表之间的联系。例如将雇佣关系转换为SQL表的示例:

CREATE TABLE employees (
  employee_id INTEGER PRIMARY KEY,
  first_name VARCHAR(50) NOT NULL,
  last_name VARCHAR(50) NOT NULL,
  hire_date DATE NOT NULL,
  salary DECIMAL(10,2) NOT NULL,
  department_id INTEGER NOT NULL,
  manager_id INTEGER,
  FOREIGN KEY (department_id) REFERENCES departments (department_id),
  FOREIGN KEY (manager_id) REFERENCES employees (employee_id)
);

上述SQL代码中,"employees"表中新增了一个"manager_id"列,用于表示每个雇员的上级经理。"department_id"属性同样引用了部门表中的"department_id"列,而"manager_id"列则引用了"employees"表中的"employee_id"列,表示每个雇员的上级经理。其中,"FOREIGN KEY"语句用于声明外键,表达两个表之间的联系。

子类型到表继承关系

ER模型中的子类型表示实体与实体之间的继承关系,例如以下的人和员工实体:

ER模型中的子类型

在关系模型中,子类型可以用“表继承”来实现,即子表继承父表的列。例如将人和员工实体转换为SQL表的示例:

CREATE TABLE people (
  person_id INTEGER PRIMARY KEY,
  first_name VARCHAR(50) NOT NULL,
  last_name VARCHAR(50) NOT NULL,
  birth_date DATE NOT NULL
);

CREATE TABLE employees (
  employee_id INTEGER PRIMARY KEY,
  hire_date DATE NOT NULL,
  salary DECIMAL(10,2) NOT NULL,
  department_id INTEGER NOT NULL,
  manager_id INTEGER,
  FOREIGN KEY (department_id) REFERENCES departments (department_id),
  FOREIGN KEY (manager_id) REFERENCES employees (employee_id)
) INHERITS (people);

上述SQL代码中,"people"表成为父表,包含人实体的所有属性,而"employees"表成为子表,继承了人实体的所有属性,并新增了员工特有的属性,如"hire_date"、"salary"、"department_id"和"manager_id"等。"INHERITS"语句用于声明继承关系,将子表连接到父表。

继承到表继承

ER模型中的继承关系表示子类型与父类型之间的继承关系,例如以下的员工和管理者实体:

ER模型中的继承关系

在关系模型中,继承关系同样可以用“表继承”来实现。例如将员工和管理者实体转换为SQL表的示例:

CREATE TABLE employees (
  employee_id INTEGER PRIMARY KEY,
  hire_date DATE NOT NULL,
  salary DECIMAL(10,2) NOT NULL,
  department_id INTEGER NOT NULL,
  manager_id INTEGER,
  FOREIGN KEY (department_id) REFERENCES departments (department_id),
  FOREIGN KEY (manager_id) REFERENCES employees (employee_id)
);

CREATE TABLE managers (
  manager_id INTEGER PRIMARY KEY,
  stock_options INTEGER NOT NULL,
  FOREIGN KEY (manager_id) REFERENCES employees (employee_id)
) INHERITS (employees);

上述SQL代码中,"employees"表同样成为父表,包含员工和管理者共有的属性。而"managers"表成为子表,继承了员工实体的所有属性,并新增了管理者特有的属性"stock_options"。注意到,"manager_id"同为子表和父表的主键,在"managers"表中的"manager_id"列只是用于引用父表中的主键,而并不作为子表的主键。

总结

本文介绍了如何将ER模型转换为关系模型,包括实体到表的转换、属性到列的转换、关系到外键的转换以及子类型和继承到表继承的转换。熟练掌握这些知识将使数据库设计更加科学、规范和高效。