假设我有两个强实体 E1 和 E2 由一对多关系 R 连接。
E1 <--------- R ---------- E2
当我将上述 ER 图转换为数据库时,将创建多少个表?
我知道当 E2 完全参与时,答案将是 2。因为,E2 的主键将完美合并。我不确定以上。我看过多个地方并找到了不同的答案。我正在寻找一些可靠的论据和答案。
答案可以是 2 或 3。我想知道哪个更正确。
假设我有两个强实体 E1 和 E2 由一对多关系 R 连接。
E1 <--------- R ---------- E2
当我将上述 ER 图转换为数据库时,将创建多少个表?
我知道当 E2 完全参与时,答案将是 2。因为,E2 的主键将完美合并。我不确定以上。我看过多个地方并找到了不同的答案。我正在寻找一些可靠的论据和答案。
答案可以是 2 或 3。我想知道哪个更正确。
Chen的原始方法将每个实体关系和关系关系映射到一个单独的表。这将产生 3 个表:
E1 (e1 PK)
E2 (e2 PK)
R (e2 PK, e1)
完全参与E1
或者E2
可以由 FK 约束来处理。
如您所见,E2
和R
行列式/PK 相同。这允许我们将两个关系组合到一个表中,如果部分参与关系,则使用可为空的e1
列,如果E2
完全参与,则使用不可为空的列。完全参与E1
仍然需要一个 FK 约束:
E1 (e1 PK)
E2 (e2 PK, e1)
我想知道哪个更正确。
从逻辑上讲,这两种解决方案几乎是等价的。
制作 3 个表可以保持概念 (ER) 模型的结构,但会生成更多表,这会以一种方式增加复杂性。另一方面,它避免了产生自身复杂性的空值。
制作 2 个表会减少表的数量,但会引入空值。此外,我们必须诉诸不同的机制(可空列与 FK 约束)来实现单一概念(完全参与)。
其他要求也会影响决策。如果我有 50 个可选属性,我当然不想处理 50 个不同的表!但是,如果我想创建另一个R2
仅适用于E2
已经参与其中的值的关系 ( ) R
,我可以使用 FK 约束在第一个设计中强制执行该约束R2 (e2) referencing R (e2)
:在第二种设计中,我需要使用触发器,因为我只想允许对e2
具有非空e1
值的引用。
没有最终正确的答案。概念、逻辑和物理建模解决了不同的问题,而未知的需求将影响您的模型并与您的决策相矛盾。就像在编程中一样,尽量保持简单,不断重构并希望最好。