用于分组记录的数据库模式模式

时间:2011-11-28 20:43:57

标签: sql database-design relational-database database-schema

我正在寻找一种设计模式来管理属于一起的关系数据库中的记录,例如:分组多个联系人。该组织本身不需要是一个实体。一个小组应该有无限数量的成员。

应该可以运行查询以获取给定记录的其他组成员。

我的想法是在一张桌子中管理它:

GROUPINGS
  integer group
  integer member_id

primary_key (group, member_id)
foreign_key (member_id)

编辑:请注意,group 是外键。它只是一个唯一的标识符。应该为每个建立的成员组增加。

以下是一个示例内容:

GROUPINGS group | member_id
          -----------------
              1 | 10
              1 | 11
              1 | 12
              2 | 20
              2 | 21
              3 | 10
              3 | 40

这个例子包含三组:(10,11,12)和(20,21)和(10,40)。你看到10组包含在两组中。

要查询成员10的“邻居”,我们可以使用此SQL语句:

SELECT g2.member_id
FROM groupings g1
JOIN groupings g2 ON g1.group      = g2.group 
                 AND g1.member_id != g2.member_id
WHERE g1.member_id = 10

=> 11,12,40
你怎么看?也许这是一个已知的模式 - 是否有链接可以找到更多相关信息?

编辑:将表“groups”重命名为“groupings”并将属性“group_id”重命名为“group”,以使此表中的记录显然不是一个组 - 它是一个链接一个团体和一个成员。集团不是实体。

3 个答案:

答案 0 :(得分:2)

enter image description here

答案 1 :(得分:1)

您所概述的是一个非常标准的解决方案,两个实体之间的关系表 - 组和成员。我相信还有其他选择,但这是我要采用的解决方案。

答案 2 :(得分:1)

对我来说看起来很好 - 如果一个成员可以成为多个组的一部分,那么这是一个正常的解决方案,这可能是他们可以做到的。

我提出的唯一建议是使用SQL查询 - 我会使用JOIN代替,但这与您的架构无关:

SELECT g2.member_id
FROM groups g1
    INNER JOIN groups g2 ON g1.group_id = g2.group_id AND g1.member_id <> g2.member_id
WHERE g1.member_id = 10