将 ER 模型转换为关系

2025年4月6日 | 阅读 7 分钟

在本文中,我们将详细介绍如何将实体关系模型转换为关系(即表),并辅以各种示例。

引言

一旦设计了实体关系模型,之后您就可以创建关系。

转换强实体

对于实体关系图中的每个强实体,创建一个关系。选择实体的 [主键] 作为关系的 [主键]。

例如:在下图所示的实体关系图中,强实体 Student 被转换为 Student 关系。

Converting ER Model into Relations

转换简单属性

为每个简单属性在关系中创建一个字段。

例如:Students 为了转换 Student 实体中的简单属性 rollno、birthdate 和 email,在 student 关系中创建了 rollno、birthdate 和 email 等字段。

转换复合属性

对于每个复合属性,为复合属性中的每个简单属性创建一个字段。

例如:为了转换 Student 实体中的复合属性 Name,在 Student 关系中创建了 Fname 和 Lname 等字段。因此,下面显示的 Student 实体可以转换为关系如下:

Student (Rollno, Fname, Lname Birthdate, email)

转换关系

与实体类似,实体之间的关系也可以转换为关系。关系表包含主键字段(来自关联关系),以及任何关系描述属性的字段。

转换一对多关系

在实体 E1 和 E2 之间的每种一对多关系类型中,选择基数(cardinality)为“多”的实体作为目标 E2。将 E1(基数是“一”)的主键属性作为外键添加到 E2。将关系中的简单属性和复合属性添加到 E2。

例如:让我们看一个 Teacher 实体和 Class 实体之间存在的一对多关系的例子。

Converting ER Model into Relations

假设一门课程可以由一位老师教授,因此 teaches 关系是一对多类型。要转换它,将 Teacher 关系的主键属性作为外键添加到 class 关系中。因此,class 和 teacher 关系如下:

Class (Class_no, Room, Teach_Id)

Teacher (Teach_Id, Teach_name, Qual , Salary)

转换一对一关系

一对一关系类型在实体 E1 和 E2 之间,选择非参与实体(non-participating entities)较少的实体 E2 作为目标。将 E1 的主键属性作为外键添加到 E2,并将关系中的简单属性和复合属性添加到 E2。

例如:考虑 Student 实体和 Account 实体之间存在的一对一关系 owns。

由于每个账户都属于一个学生,所以应该选择账户作为目标。将 Student 关系的主键作为外键添加到 Account 关系中,并将关系属性添加到 account 关系。现在,student 和 account 之间的关系如下:

Account (Acc_no, Acc_type, Balance, Rollno, Since)

Student (Rollno, Fname , Lname Birthdate , email)

Converting ER Model into Relations

转换多对多关系

在实体 E1 和 E2 之间的每种多对多关系类型 R,创建一个名为 R 的新关系,并将 E1 和 E2 的主键以及关系中的简单属性和复合属性添加到 R 中。如果 PK1 和 PK2 分别是 E1 和 E2 关系的主键,则 PK1 和 PK2 的组合将作为关系 R 的主键。

例如:考虑 Newspaper 实体和 Matrimonial 实体之间存在的多对多关系 advertises。

Converting ER Model into Relations

创建一个名为 Advertises 的新关系,其字段包括 Newspaper 和 Matrimonial 关系的主键以及 adv_charges 字段。因此,Advertises 关系如下:

Advertises (News_id, Mat_id, adv_charges)

转换 n 元关系

对于每个 n 元关系(n > 2),创建一个新关系。将每个参与实体的主键作为外键添加到新关系中。所有这些外键的组合构成新关系中的主键。将 n 元关系的所有简单属性和复合属性添加到新关系中。

例如:考虑下图所示的三元关系。

Converting ER Model into Relations

registers 关系将通过 Registers 关系来表示,其主键字段将是 Staff、client 和 branch 关系主键的组合。它表示如下:

Registers (Staff_id, Client_id, Branch_id)

转换递归关系

递归关系的表示取决于其基数。如果是一对一或一对多关系,则用 [外键] 表示。否则,如果是多对多关系,则使用单独的表来表示。设计者可以选择适合应用的任何方法,权衡灵活性和效率。

例如:考虑 Student 实体之间存在的一对一递归关系 Roommate。

Converting ER Model into Relations

我们可以使用单独的表或使用外键。

Roommate (Stu_id, roommate_StId)

Student (Stu_id, name, course, roommate_StId)

选择合适的方法取决于设计应用程序的设计者的选择。使用单独的表提供了灵活性,因为可以轻松更改关联,但连接表所涉及的开销可能会导致性能下降。

转换弱实体

为每个弱实体创建一个新关系。将拥有实体的 [主键] 与新关系中的 [外键] 结合起来,并包含关系中的简单属性和复合属性。该关系的主键是其拥有关系的主键与部分键(partial key)的组合。

例如:payment 是一个弱实体,它的拥有实体是 loan 实体。因此,payment 关系可以转换为如下:

Converting ER Model into Relations

Payment (Loan_no, Pay_no, Pay_amt, Pay_date)

转换多值属性

为每个多值属性创建一个新关系。该关系包含包含多值属性的关系的主键以及多值属性本身。

例如:考虑一个具有 Ph_no 多值属性的 Person 实体,在这种情况下,我们将创建两个表,一个用于 person 实体,一个用于多值属性。

Person (Id, firstname, lastname, sex) 和

Ph_no (Id, mobile_no, home_no, office_no)

如果原始表中存在多个多值属性,我们可以为每个属性创建一个新表。应该优先为这些表命名,以便新表的名称是多值属性的复数形式。

以一家中等规模的、从事计算机工业应用的公司为例,设计其关系数据库的实体关系图。该公司向客户提供各种产品,从单个应用程序到包含定制软件的完整硬件安装。公司雇佣了各种专家、顾问和支持人员。所有员工都长期工作。公司分为由部门经理领导的部门,所有项目都以跨学科的方式进行。对于每个项目,从各个部门的员工群体中选出一个项目团队,并任命一位项目经理,该经理全权负责项目的控制。

以下是该公司采用的政策的简要说明:

  • 每位员工都属于某个部门。
  • 每位员工可以拥有多种技能。
  • 每位经理都是一名员工。
  • 一个部门可以参与零个/一个/多个项目。
  • 至少有一个部门参与一个项目。
  • 一名员工不能参与零个/一个/多个项目(此处描述可能存在歧义,通常指参与项目的情况,根据上下文理解为“每名员工都必须参与至少一个项目,但可以参与多个”或“每名员工只参与一个项目”,后文更支持后者)。
  • 项目团队至少由一名成员组成。
  • 一名员工只属于一个团队。

根据上述要求绘制实体关系图,我们得出以下实体集、它们的属性以及它们之间的关系:

Entities (实体)属性关系
部门(Dept_code, Dept_name, Mang_Id)Department employs Employee
项目(Proj_Id, Title,Start_Date, Due_Date, Cost, PMang_Id)Employee is member of Team
员工(Emp_Id, Name, Job_Title)Project is carried out by Team
技能(Skill_Name, Proficiency)Employee possess Skills
团队(Emp_Id, Emp_role, Proj_Id)Employee works for Employee

在上表中,加粗的属性是主键,实体之间的加粗关系是它们的关系。

从实体关系图得到以下表:

Converting ER Model into Relations

让我们看一个 Department 表的例子

Dept_codeDept_nameMang_Id
D101设计M101
D102销售M102
D103融资M103
D104M103M104
D105销售M105

让我们看一个 Employee 关系表的例子

员工 IDE_NameJob_titleDept_Id
E101Deepak程序员D101
E102Salman管理者D102
E103FarahTesterD103
E104Promod开发者D104
E105Urmila内容撰写人D105
E106Satish程序员D106

让我们看一个 Project 表的例子

Proj_Id标题Start_DateDue_Date费用PMang_Id
P101Exam_System2024年3月1日2024年3月21日10000M101
P102Stu_Database2024年5月11日2024年5月21日25000M102
P103Bank_System2024年5月21日2024年11月15日45000M103
P104Exam_System2024年3月1日2024年3月21日10000M104

让我们看一个 Skills 表的例子

员工 IDSkill_nameProficiency
E101设计图形
E102编程语言MATLAB
E103设计图形
E104测试手动
E105DevelopingPython
E106编程语言JAVA

让我们看一个 Team 表的例子

员工 IDEmp_RoleProj_Id
E101程序员P101
E102管理者P102
E103TesterP103
E104开发者P104
E105内容撰写人P105
E106程序员P106

以上表中的主键是:

Department 表中的 Dept_code

Project 表中的 Proj_Id

Employee 表中的 Emp_Id

Skills 表中的 Emp_Id 和 Skill_name

Team 关系中的 Emp_Id, Emp_role 和 Proj_id