将 ER 模型转换为关系2025年4月6日 | 阅读 7 分钟 在本文中,我们将详细介绍如何将实体关系模型转换为关系(即表),并辅以各种示例。 引言一旦设计了实体关系模型,之后您就可以创建关系。 转换强实体 对于实体关系图中的每个强实体,创建一个关系。选择实体的 [主键] 作为关系的 [主键]。 例如:在下图所示的实体关系图中,强实体 Student 被转换为 Student 关系。 ![]() 转换简单属性 为每个简单属性在关系中创建一个字段。 例如: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 实体之间存在的一对多关系的例子。 ![]() 假设一门课程可以由一位老师教授,因此 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) ![]() 转换多对多关系 在实体 E1 和 E2 之间的每种多对多关系类型 R,创建一个名为 R 的新关系,并将 E1 和 E2 的主键以及关系中的简单属性和复合属性添加到 R 中。如果 PK1 和 PK2 分别是 E1 和 E2 关系的主键,则 PK1 和 PK2 的组合将作为关系 R 的主键。 例如:考虑 Newspaper 实体和 Matrimonial 实体之间存在的多对多关系 advertises。 ![]() 创建一个名为 Advertises 的新关系,其字段包括 Newspaper 和 Matrimonial 关系的主键以及 adv_charges 字段。因此,Advertises 关系如下: Advertises (News_id, Mat_id, adv_charges) 转换 n 元关系 对于每个 n 元关系(n > 2),创建一个新关系。将每个参与实体的主键作为外键添加到新关系中。所有这些外键的组合构成新关系中的主键。将 n 元关系的所有简单属性和复合属性添加到新关系中。 例如:考虑下图所示的三元关系。 ![]() registers 关系将通过 Registers 关系来表示,其主键字段将是 Staff、client 和 branch 关系主键的组合。它表示如下: Registers (Staff_id, Client_id, Branch_id) 转换递归关系 递归关系的表示取决于其基数。如果是一对一或一对多关系,则用 [外键] 表示。否则,如果是多对多关系,则使用单独的表来表示。设计者可以选择适合应用的任何方法,权衡灵活性和效率。 例如:考虑 Student 实体之间存在的一对一递归关系 Roommate。 ![]() 我们可以使用单独的表或使用外键。 Roommate (Stu_id, roommate_StId) Student (Stu_id, name, course, roommate_StId) 选择合适的方法取决于设计应用程序的设计者的选择。使用单独的表提供了灵活性,因为可以轻松更改关联,但连接表所涉及的开销可能会导致性能下降。 转换弱实体 为每个弱实体创建一个新关系。将拥有实体的 [主键] 与新关系中的 [外键] 结合起来,并包含关系中的简单属性和复合属性。该关系的主键是其拥有关系的主键与部分键(partial key)的组合。 例如:payment 是一个弱实体,它的拥有实体是 loan 实体。因此,payment 关系可以转换为如下: ![]() 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) 如果原始表中存在多个多值属性,我们可以为每个属性创建一个新表。应该优先为这些表命名,以便新表的名称是多值属性的复数形式。 以一家中等规模的、从事计算机工业应用的公司为例,设计其关系数据库的实体关系图。该公司向客户提供各种产品,从单个应用程序到包含定制软件的完整硬件安装。公司雇佣了各种专家、顾问和支持人员。所有员工都长期工作。公司分为由部门经理领导的部门,所有项目都以跨学科的方式进行。对于每个项目,从各个部门的员工群体中选出一个项目团队,并任命一位项目经理,该经理全权负责项目的控制。 以下是该公司采用的政策的简要说明:
根据上述要求绘制实体关系图,我们得出以下实体集、它们的属性以及它们之间的关系:
在上表中,加粗的属性是主键,实体之间的加粗关系是它们的关系。 从实体关系图得到以下表: ![]() 让我们看一个 Department 表的例子
让我们看一个 Employee 关系表的例子
让我们看一个 Project 表的例子
让我们看一个 Skills 表的例子
让我们看一个 Team 表的例子
以上表中的主键是: Department 表中的 Dept_code Project 表中的 Proj_Id Employee 表中的 Emp_Id Skills 表中的 Emp_Id 和 Skill_name Team 关系中的 Emp_Id, Emp_role 和 Proj_id 下一主题基于可恢复性特征调度(DBMS) |
我们请求您订阅我们的新闻通讯以获取最新更新。