实体关系(ER)图是数据库中数据的图形表示,它显示了数据是如何相关的。
注意:本文适用于那些已经知道什么是 ER 图以及如何绘制 ER 图的人。
1) 当ER 图中存在一对多基数时。
例如,一个学生只能注册一个课程,但一个课程可以被多个学生注册
对于 Student(SID, Name),SID 是主键。对于 Course ( CID, C_name ),CID 是主键
Student Course
(SID Name) ( CID C_name )
-------------- -----------------
1 A c1 Z
2 B c2 Y
3 C c3 X
4 D
Enroll
(SID CID)
----------
1 C1
2 C1
3 c3
4 C2
现在的问题是,Enroll SID 或 CID 或组合的主键应该是什么。我们不能将 CID 作为主键,正如您在注册同一 CID 时看到的那样,我们有多个 SID。 (SID, CID) 可以唯一区分表,但不是最小值。所以 SID 是关系注册的主键。
对于上面的ER图,我们考虑了数据库中的三个表
Student
Enroll
Course
但是我们可以将 Student 和 Enroll 表合并,重命名为 Student_enroll。
Student_Enroll
( SID Name CID )
---------------------
1 A c1
2 B c1
3 C c3
4 D c2
Student 和 enroll 表现在合并了。
因此,Student_enroll 和 Course 至少需要两个 DBMS 表。
注意:在一对多关系中,我们至少可以有两个表。
2. 当ER 图中存在多对多基数时。
让我们考虑上面的例子,现在一个学生也可以注册 1 门以上的课程。
Student Course
( SID Name) ( CID C_name )
-------------- -----------------
1 A c1 Z
2 B c2 Y
3 C c3 X
4 D
Enroll
( SID CID )
----------
1 C1
1 C2
2 C1
2 C2
3 c3
4 C2
现在,同样的问题,Enroll 关系的主键是什么,如果我们仔细分析 Enroll 的主键为 Enroll
该表是 ( SID, CID )。
但在这种情况下,我们无法将 Enroll 表与 Student 和 Course 中的任何一个合并。如果我们尝试将 Enroll 与 Student 和 Course 中的任何一个合并,它将创建冗余数据。
注意:多对多关系中至少需要三个表。
3. 一对一关系
有两种可能
A) 如果我们有一对一的关系并且我们至少在一端完全参与。
例如,考虑下面的 ER 图。
A1和B1分别是E1和E2的主键。
在上图中,我们在 E1 端完全参与。
在这种情况下只需要一个表,将 E1 的主键作为其主键。
由于E1是全参与,E1中的每个条目只与E2中的一个条目相关,但并非所有E2中的条目都与E1中的一个条目相关。
应该允许 E1 的主键作为缩减表的主键,因为如果使用 E2 的主键,它在缩减表中的许多条目可能具有空值。
注意:只需要一张桌子。
B) 没有完全参与的一对一关系。
A1和B1分别是E1和E2的主键。
R 的主键可以是 A1 或 B1,但我们仍然不能将所有三个表合并为一个。如果我们这样做,那么组合表中的某些条目可能具有 NULL 条目。所以将三张表合二为一的想法并不好。
但是我们可以将 R 合并为 E1 或 E2。所以至少需要 2 个表。
下面是 Gate 上一年的问题。
https://www.geeksforgeeks.org/gate-gate-cs-2008-question-82/
https://www.geeksforgeeks.org/gate-gate-cs-2008-question-83/