2011-11-20 42 views
0

我正在爲社交網站設計數據庫,其中包含像twitter這樣的「followers」和「follow」功能。整個圈子裏有一些共同的關係,也就是我跟隨的人和我的追隨者。我有一張桌子跟着uid1和uid2。假設A如下B和B如下A和C.這將有像無法找出正確的數據庫設計

uid1 uid2 
A  B 
B  A 
B  C 

現在我想在同一個表中的第三個字段relationId這應該是唯一的一個關係條目A是否遵循B或B:一種像

uid1 uid2 relationId 
A  B  1 
B  A  1 
B  C  2 

這樣我就可以在另一個表中使用relationId作爲外鍵來存儲用戶整個圈子的共同特徵。 立即想到的一件事是,如果可以有一個交換公式來獲取給定兩個數字(uid1和uid2)的唯一編號(relationId)。但它可能是什麼?

編輯


我也有一個更加懷疑。由於我數據庫中的用戶名是唯一的。那麼我應該在整個數據庫中使用用戶名作爲主鍵還是使用一個數字作爲主鍵作爲uid在我的情況下使用表來解析用戶名和用戶名,從而獲得性能優勢?

回答

3

我會做類似你有它的方式:

Follows 
------- 
follower followed 
A  B 
B  A 
B  C 

這可能明顯有像followDate這是有道理的雙向信息。

那麼你也可以有:

Connected 
----------------- 
relationId uid1 uid2 
x   2 3 

relationId人工鍵(可能是INT AUTOINCREMENT,GUID等)

然而,連接將有一個約束條件(是否可以強制實施此在db層取決於你的系統)那uid1 < uid2。顯然,這也意味着你永遠都不會擁有它。

這是相對簡單,易於查詢,並應具有不錯的表現,在uid1uid2上有良好的複合唯一索引。在搜索關於關係的非方向信息時,您不必查看兩個方向的索引。

編輯:我會建議用戶使用人造的鑰匙。即使您現在不允許更改用戶名,您也可能希望稍後再進行更改。

編輯2:根據this,您可以通過將NOT NULL列設置爲NULL來拒絕trigger中的插入。兩個uid都應該不爲NULL,所以如果uid1 >= uid2可以設置爲NULL。

+0

我實際上只有1個表格,即「以下」,你認爲它們有兩個不同,但你想出了正確的解決方案。 :) – Terminal

+0

我已經更新了這個問題。你可以看看這個。 – Terminal

+0

我可以在MySql中實現這個約束uid1 Terminal