2011-08-25 68 views
0

我有一個小項目,我的數據有一些SQL設計問題。MySQL中的電子郵件組

讓說我有2臺在我的DB:

Contacts 
ID 
name 
privateemail1 
privateemail2 
office email 

,我有組

ID 
Groupname 

什麼是一起他們分發列表,我將能夠鏈接的最佳方式也使用Groups中的Groups?

如果我做一個成員表

ID 
GroupID 
ContactID 

我看不出如何適應嵌入羣爲主。

諸如

的羣體主要羣體例如管絃樂隊的球員;歌手
子組例如風的球員,絃樂演奏,男歌手,女歌手等

修訂問題:上面的例子不能涵蓋所有的變化......任何羣體都能成爲子或主,如Outlook通訊組列表?

只是看着我非常感謝的評論,能夠看到一個CREATE,SELECT和所有組以及一個DELETE示例會很好。這會帶來更多的關注,並希望有更多的結果。

我希望這不是太假的問題,但作爲一個初學者我已經花了幾個小時之前,我張貼此...感謝提前

+0

感謝我正要固定同樣的問題。 –

+0

這個小組來自哪裏?是在組?或者有另一個註冊的細節? – ajreal

+0

子組是正常組的唯一方式,您可以使用任何組作爲主要或子組。 –

回答

2

我有雙重用途的表解決了這個:

表:groupMemberships

id 
groupID 
linktype 
linkID 

linktype可以是一個文本字段(「用戶」,「集團」),這是好的, (如果你正在做自己的SQL訪問,它可能值得小小的性能打擊),或者你可以使用一個INT字段,其中(1,2)每個字符對你來說意味着什麼。

要查找所有用戶羣2:

SELECT linkID as userID FROM groupMemberships 
WHERE groupID=2 AND linktype='user'; 

要查找所有子組:

SELECT linkID as groupID FROM groupMemberships 
WHERE groupID=2 AND linktype='group'; 

一個具有雙重表的問題,像這樣的,當你想-say - 獲得所有組用戶,但你不知道他們可能有多少個子組。如果你可以肯定會只有子組的一個級別,你可以這樣做:

SELECT linkID as userID FROM groupMemberships 
WHERE groupID=2 and linktype='user' 
UNION 
SELECT sg.linkID as userID FROM groupMemberships g,groupMemberships sg 
WHERE g.groupID=2 AND g.linktype='group' 
    AND sg.groupID=g.linkID AND sg.linktype='user' 

如果您有子組的兩個層次,你需要兩個工會等。當你有n子組時,你需要N個聯合,這是一個痛苦的寫作和效率不高。

另一種解決方案是讓你的contactsgroups表相同,只是鏈接聯繫人到組 - 表contactsGroups

ID 
groupID 
userID 

現在代碼側(外側的數據庫),當您將用戶添加到組(windplayers),您還可以自動將它們添加到任何父組(管絃樂隊),以便用戶實際獲得contactsGroups表中的兩個條目。這具有相同的存儲信息,但使數據檢索更容易。你甚至可以將這個子組信息存儲在數據庫中,儘管你已經在代碼端使用了對象繼承或類似的東西。

+0

感謝您的詳細解釋。我打算建立它,看看我能否實現它。 –

+0

感謝Rudu,有一個「隨機」的關係,一個人可以成爲一名歌手和一個角色球員,所以這個紀錄將分組到樂團,風,Orch Trustees,Hornists,Soloist,歌手,合唱團成員,低音歌手,所以我不確定是否我可以在編碼之外做。 –

0

的幫助通過了解你的問題,你要鏈接表給自己,然後你可以通過在組再增加一個欄鏈接到表,讓說的Pid * ,這將是相同的數據類型 *爲這個Id在組,然後使它作爲在同一個表中的foriegn鍵引用ID。我認爲它會解決你的問題。

+0

謝謝你的答案。我並沒有把它作爲初學者,但我相信這和Rudu的答案一樣好。再次感謝您的努力。 (對不起,我的英語) –

+0

嗨,我一直在尋找正確的解決方案。你可以寫下創建代碼並選擇並刪除SQL命令嗎?謝謝 –

+1

當然,例如:你有樂隊演奏者和歌手在組1和2,然後插入子組,(小提琴(知道這是在管絃樂隊,猜測)),查詢插入是:插入組(groupname,Pid)值('Violin PLayers',1);用於選擇子組從Pid = 1的組中選擇組名;並用於從Pid = 1的組中刪除刪除;我想你明白。 – IamVishnu

3

我認爲,user911882意思是有這樣一個模式:

Contacts 
- ID 
- name 
- privateemail1 
- privateemail2 
- office 
- email 

Groups 
- ID 
- Groupname 
- ParentGroupID **foreign key which references Groups.ID** 

Memberships 
- ID 
- GroupID 
- ContactID 
+0

感謝我現在看到的評論。 –