2011-08-22 61 views
0

我正在編寫一個應用程序,它具有與Google圈子/ FB好友列表類似的某些功能。我應該如何構建這個組/角色模式?

  1. 用戶可以把他們知道的人到一羣人(家族,同事,朋友等) (現在組不能嵌套)
  2. 用戶可以將消息發送到組(S),設定每組隱私設置等
  3. 在一個職位組內共享,這些羣體的用戶可以發表評論,並看到其他人的評論,無論他們與其他人的關係(即組內)

現在,我們正在使用關係數據庫(mysql),因爲有些限制隨着時間和資源。無論如何,我試圖找到構建我們的數據庫來平衡性能和清晰度的最佳方式。下面是我們目前有:

users: 
    user_id 
    default_group_id 
    friend_group_id 

groups: 
    group_id 

groups_to_users: 
    user_id 
    group_id 

messages: 
    message_id 

messages_to_groups: 
    message_id 
    group_id 

galleries_to_groups: 
    gallery_id 
    group_id 

首次創建一個用戶,他/她將有2個基地羣:

  1. 將只包含單個用戶
  2. 的默認組朋友組,其中將包含他/她與朋友的所有人

我們將簡單地使用group_id來確定「許可」,而不是使用user_id。這樣我們可以跳過查詢2個表格的複雜性。

與此同時,通過上述結構,我們也遇到了查詢用戶收到的所有消息的障礙,因爲如果此用戶有100個朋友,我們可能必須查詢至少100個組。所以現在我們用這個相當黑客的方法來解決這個問題:

如果用戶發送消息給一個組,然後我們瀏覽這個組中的成員列表並保存每個用戶的記錄(message_id,(default_ )GROUP_ID)。問題是,如果這個組擁有1000多個成員,那麼我們將不得不爲每個發送到這個組的新消息插入1000多條記錄,並且當這個用戶對組成員進行任何修改時,我們也必須更新大量的記錄。

我想知道是否有更好的方法來構建我們的數據庫來提高性能?

回答

0

樹結構是合適的配合來表示這種分層數據

例如 { <用戶的> <GUID> UID1 </GUID > <消息> msgid2 < /消息> < /用戶> <用戶> <guid> uid2 </guid > </user > <組> <GUID> groupid1 </GUID > <構件> UID1 < /構件> < /組> <組> <GUID> groupid2 </GUID > <構件> UID1 < /構件> <構件> UID2 < /部件> <消息> msgid1 < /消息> < /組> } 使得數據模型可以是柔性的,以找到

  • 目標消息到單個用戶或一組消息的
  • 列表中的特定用戶是累積消息尋址到組的列表用戶的成員,給用戶的郵件直接
+0

Nageswara Rao,請您詳細說明如何將數據存儲在數據庫中?我有點慢在這裏 – mr1031011

+0

您可以通過在groups_to_users引入一些冗餘 例 users_to_groups --------------- USER_ID --->用戶ID <解決用例冗餘數據,以避免查詢用戶和組表> USER_ID --->組識別符號 messages_to_group ----------------- GROUP_ID - > MESSAGE_ID USER_ID --- > message_id 所以,如果你想讓一個組的成員通過group_id查詢groups_to_users –

1

你「哈克法」失敗,因爲你實際上是書面形式鏈接到個人,而不是使用它們的組成員合理化您的交易有團體的目的(即消息)。如果您關注的是性能,那麼你很可能不會通過100或1000

的一個因素,我認爲你應該與原設計堅持,並確保你的表格你寫相乘得到您讀了巨大的推動正確編入索引,以便DBMS可以完成它所要做的事情 - 快速高效地連接數據集。

如果您設計的表具有正確的主鍵和外鍵,並且您設計了查詢以便他們利用PK/FK索引,那麼您將如何優化性能。

+0

你是對的,沒有必要sen d 1000+這樣的消息,我們可以使用當前結構並使用join – mr1031011