2011-11-28 60 views
0

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

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

我的想法是在一个表中进行管理:

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 

你觉得呢?也许这是一个已知的模式 - 有没有链接可以找到更多关于这个?

编辑:重命名表“组”为“集团”,并更名为属性“GROUP_ID”到“组”,使之明显,在这个表中的记录是不是一组 - 这是一组与之间的联系会员。集团不是一个实体。

+1

成员可以属于超过1组? – Chris

+0

@Chris:是的,这是可能的。我已经增强了示例来演示它。 –

回答

1

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

+0

我的答案假设你也有一个组和一个成员表。 – Maess

+0

因为group_id不是外键,所以这是某种特殊的解决方案。没有组表。我将在原文中重新命名表格以避免这种误解。 –

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 
+0

你是对的,一个JOIN更好阅读,但它只是大多数数据库的语法糖。我已经编辑过我的帖子。是的,一个成员可以是多个组的一部分。 –

1

enter image description here

+0

我的模式中没有组实体 - 并且不应该要求。您的模式是解决不同问题的解决方案。 –