2014-02-14 74 views
1

首先是什麼條件。我有屬於「小」組的人。 (換句話說,每個人都有「small_group_id」,然後「小」組形成「大」組(換句話說,「small_groups」可能有或沒有「big_group_id」,這取決於小組是否屬於大組)。SQL:尋求建議表結構等

我想創建一個表結構(這將被用於PHP)保持並顯示以下兩個方面:

  • 公共消息(指不管是誰regestered甚至不就能看到它只是短信的作者可以編輯/刪除這很容易:)
  • 私人消息WITH定義它是多麼私密。這意味着私人消息應該具有以下特性:a)小羣體可以看到它b)大羣體可以看到它(假定大羣體的所有成員都有權查看它)。

基本上,我面臨的挑戰是如何設計和以後使用這些私人信息的可見性。 我的第一個雖然是像表:msgID, msgBody, small_groups_list, big_group_list, authorID因此,我存儲在'small_groups_id'之類的東西就像'id_1; id_4; id_10'等等,對於大團體也是類似的。但是,我不知道如何通過這樣的存儲列表進行搜索,例如,屬於small_group_id = 10的人應該看到那個消息。還有什麼應該是列small_groups_listbig_group_list defenitions /類型。

也許有更好的方式來存儲這些東西,並使用它們? 這就是我來這裏的原因。對於這些要求,更好的做法是什麼?

(這將是在MySQL實現)

預先感謝您。

我很擅長SQL和數據庫事務。請在回答時考慮這一點。

+0

查看公共消息和私人消息的示例以及您打算如何使用它們將很有用。如果您試圖根據試圖訪問某些內容的羣組「ID」向某人顯示一行數據作爲消息,那麼您如何確定誰有資格查看內容? –

回答

2

第一:不要用「數組」列對數據進行非規範化處理。這使得查詢很恐怖,並且更糟糕的是更新。

相反,您需要兩個單獨的表格:small_group_visibilitybig_group_visibility。這兩個表格中的每一個將包含msgIDgroupID。基本上,這是一個多對多的關係,它指出了組和它所關心的信息。

這是一個很常見的數據庫模式。

要查詢要顯示的消息,請想象我們有一個用戶,其小組爲(1,2,3),其大組爲(10,20)。

SELECT DISTINCT msgID, msgSubject, msgBody -- and so on 
FROM messages m 
LEFT JOIN small_group_visibility sg 
    ON sg.msg_id = m.msg_id 
LEFT JOIN big_group_visibility bg 
    ON bg.msg_id = m.msg_id 
WHERE 
    sg.group_id IN (1, 2, 3) OR 
    bg.group_id IN (10, 20); 
+0

我試圖理解你在說什麼:)聽起來像每個私人消息可能有你在談論的每個表中的記錄數量?然後,當我的PHP需要弄清楚是或否,以便用戶查看消息時,我只需在兩個表中搜索大型和小型用戶組的msgID,並且如果發現任何 - >顯示帶有該ID的消息? – user2997497

+0

正確。一條消息可以在任一表中具有任意數量的記錄。您可以擁有用戶相關組的列表(即他們的小組和大組),並且可以針對兩個組表進行聯合。我會給答案添加一個例子。 – syrion

+0

我瞭解你的解決方案的美麗。非常感謝你! – user2997497