关系数据库中的关系“OR”

时间:2011-10-02 10:28:27

标签: database database-schema relational

我猜这个问题非常简单。但尽管如此, 例如,我有实体:用户(id,名称),组(id,name),user_group(user_id,group_id)和gallery(id,name,owner_id)。 图库的所有者可以是用户或组

关系数据库中最好的解决方案是什么?

谢谢!

PS如果有人知道关系代数和模式优化。它会是什么样子?

我在考虑所有者(id,user_id,group_id),但我不知道如何在关系代数方面显示“OR”关系。

4 个答案:

答案 0 :(得分:1)

最简单的解决方案是关系Owner(id, user_id, group_id),其中可以设置user_idgroup_id - 使用适当的约束来保护它。

GroupUser折叠到一个表中会将数据库中的一些一致性检查拖入应用程序逻辑中:

  • 一个群组不仅可以拥有用户,还可以拥有其他群组(前面的递归和/或无限循环)。
  • 如果在更多地方使用UserGroup,则可能需要进行更多调整。
  • 数据库不再强制执行数据一致性。

答案 1 :(得分:0)

将所有者和群组合并到一个表中。所有者和组只应根据它们在此表中的属性或者在连接此新表与自身的关系表中是否存在行(“是成员”)来区分。

答案 2 :(得分:0)

用户和组之间没有技术差异(只是概念性的)。

将它们放在同一个表(user)中,并在第二个字段中标记行的类型(组或用户)。

使用应用程序逻辑确保{{1>}表中只有一行类型 group 可能“有子节点”。

答案 3 :(得分:0)

引入新实体OWNER并使其成为GROUP的所有者。然后制作USER和GROUP类别(即“继承”它们)OWNER。

你的ER模型看起来像这样(只显示PK字段):

enter image description here

理论上,有三种主要方法可以在物理数据库中实现一个类别。所有这些都有利有弊,但对于您的模型,解决方案1 ​​可能是最合适的:

  1. 为OWNER,USER和GROUP使用单独的表,并通过FOREIGN KEY连接它们。
    • 在这种情况下,您可能会或可能不会在OWNER中使用鉴别器(即类型标识符)。
  2. 将USER和GROUP放在单独的表格中,两者都有OWNER字段。
  3. 将OWNER,USER和GROUP放在同一张表中。