2011-02-04 53 views
25

尊敬的專家庫/程序員:'followers'和'followings'的數據庫設計?

我有一個MySQL表的用戶信息,如

id  user_id   name etc. 
1  userA    
2  userB 
3  userC 
..  .. 
..  .. 

我想創建一個像「關注」其他用戶的類似Twitter的功能。用戶A可以關注用戶B,或者用戶B可以關注用戶A,或者兩者都可以關注對方。 爲此,我要創建1臺,可以說追隨者

id  user_id  follower_id 
1   userA  userB 
2   userC  userA 
3   userA  userC 
4   userB  userC 
5   userX  userA 

現在我想找到誰是下一個用戶A。我很喜歡: 選擇*從追隨者哪裏user_id = userA 這將選擇userB和userC。那就是我需要的。

現在我想找到,用戶A是下列哪些人(例如,在上表中,用戶A是繼用戶C和用戶X,然後我應該運行與追隨者類似 選擇*其中follower_id =用戶A。

我問題是,這是數據庫設計正確,此問題(考慮到考慮到數據庫冗餘和優化?)也可以有比這更好的辦法?謝謝。

+0

順便說一句,下面的** s **是錯的 – 2018-02-12 18:07:49

回答

11

在一般情況下,你的設計是正確的。

但,如果user_id在「用戶」表中是唯一的,則不需要「用戶」中的列「id」。 (包含唯一「ID」的唯一表格是一個獨特的「user_id」,這非常不尋常。)您也不需要表格「followers」中的「id」列。

「追隨者」中的主鍵應該是(user_id,follower_id),並確保每個列在「用戶」中都有一個引用「user_id」的外鍵。

5

一般提示。使用整數而不是字符串。性能有顯着差異。因此,請刪除users.user_id,並將users.id重命名爲users.user_id。其次你的追隨者表應該在user_id和follower_id上有索引。再一次有顯着的性能優勢。我也喜歡在(user_id,follower_id)上擁有一個唯一索引,調用您的主鍵並放棄您的id列的想法。

+0

我同意你的主要觀點,整數是更好的主/外鍵。然而,我認爲他所稱的'user_id`可能是'登錄名'之類的東西(然後應該正確地重命名,但不能刪除),這兩者都是必需的,並且在系統內必須是唯一的。依照您的建議,'follow'表應該使用整數引用。 – 2011-02-04 15:46:37

1

是的,您的設計是處理多對多關係的常用方法。搜索「建模多對多數據庫」,你會發現很多資源給你這個例子。

將關係表中的外鍵添加到用戶表中。

如果你的關係涉及到額外的信息,你會把它作爲連接表中的列。例如,也許是一個用戶開始關注另一個用戶的日期。

如果您希望讓其他表引用您的表,則連接表中的單獨代理鍵(如已添加的ID列)會非常有用。

0

這是我的設計。

Id userId(PK) followerId  followedDate   unfollewedDate 
1  123   456   YYYY-MM-DD HH:MI:SS YYYY-MM-DD HH:MI:SS 
... ...   ...   ...     ... 

我認爲用戶id - followerId combiation是獨一無二的。日期可能有用。例如,我正在考慮如果用戶取消關注並在5分鐘後再次使用,則不會生成通知。我假設用戶犯了錯誤。我可以按日期分析以下靜態數據。