【发布时间】:2010-07-07 08:03:03
【问题描述】:
当将 ER 图映射到关系模式时,我的教科书说在步骤中……无论如何……应该为多值属性创建一个新的关系 S。但是如果多值属性是 R 的主键……那 R 没有主键,S 没有主键?
【问题讨论】:
当将 ER 图映射到关系模式时,我的教科书说在步骤中……无论如何……应该为多值属性创建一个新的关系 S。但是如果多值属性是 R 的主键……那 R 没有主键,S 没有主键?
【问题讨论】:
这是一个很好的问题,并且一直困扰着我关于如何消除“复杂”类型的教科书解释。
您需要问的问题是:这些值集标识了什么?你想建模什么?大多数使用 SQL 的数据库架构师可能会说您应该发明一个新属性来识别构成多值属性的事物集。
另一种解决方案是将“复杂”类型本身作为第一类属性——不是“多值”属性,而是可以像任何其他值一样作为单个值分配给变量的集合或数组。 Tutorial D 语言允许带有关系的关系值类型。例如:
VAR r BASE RELATION {foo RELATION {bar INTEGER} } KEY {foo};
其中 foo 是嵌套在 r 中的 relvar。
然而,SQL 不支持这样的东西。 SQL 支持嵌套表,但通常不允许作为键的一部分,因此在 SQL 中,您始终必须创建新的标识属性。在真正的 RDBMS 中,您可以说不必创建另一个属性,因为任何受支持的类型都应该支持成为键的一部分 - 如果不支持,那么您甚至无法投影该属性,因为结果不会t 包含一个键。
【讨论】: