2011-11-28 40 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

我的模式中沒有組實體 - 並且不應該要求。您的模式是解決不同問題的解決方案。 –