假设我有两个强实体E1和E2由一对多关系R连接。
E1< --------- R ---------- E2
当我将上述ER图转换为数据库时,将创建多少个表?
我知道当E2完全参与时,答案将是2.因为,E2的主键将完美合并。我不确定上面。我见过多个地方,找到了不同的答案。我正在寻找一些有力的答案。
答案可以是2或3.我想知道哪个更正确。
答案 0 :(得分:0)
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
。
没有最终正确答案。概念,逻辑和物理建模解决了不同的问题,而未知的要求将影响您的模型并与您的决策相矛盾。在编程中,尽量保持简单,不断重构并希望最好。