2013-02-28 107 views
1

我想實現一個關注/最喜歡的系統。我可以想到兩種實現數據庫/表格結構的方式,但我不確定要實施哪一種。哪一個將被視爲最佳實踐,最重要的是爲什麼?關注者的MySQL數據庫結構

我把所有的追隨者都放在一個字符串中。通過將所有追隨者放入單個字符串中,可以減少冗餘行的數量。

Ex。

id(1)|| user_id(1)|| follower_ids(2,3,45)

'CREATE TABLE `users` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     `username` varchar(20) NOT NULL, 
     PRIMARY KEY (`id`) 
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1'; 

'CREATE TABLE `follow` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     `user_id` int(10) unsigned NOT NULL, 
     `follower_ids` text NOT NULL, 
     PRIMARY KEY (`id`) 
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1'; 

OR

我把各自獨立follow_id但由具有對於相同的USER_ID 3行添加冗餘。

Ex。

id(1)|| user_id(1)|| follower_id(2)

id(2)|| user_id(1)|| follower_id(3)

id(3)|| user_id(1)|| follower_id(45)

'CREATE TABLE `users` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     `username` varchar(20) NOT NULL, 
     PRIMARY KEY (`id`) 
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1'; 

'CREATE TABLE `follow` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     `user_id` int(10) unsigned NOT NULL, 
     `follower_id` int(10) unsigned NOT NULL, 
     PRIMARY KEY (`id`) 
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1'; 
+0

非他們。他們都錯過了索引,可能是最重要的。 – 2013-02-28 23:11:32

回答

4

您的第二個選項是對字段名稱稍作修改,因爲跟隨者和跟隨者都是user_id。如John所述,將外鍵添加到下表中的兩個* _user_id字段。

此外,從來沒有複數表名稱。 '用戶'和'關注'就足夠了。我個人比較喜歡像'follow'這樣的表格,它有一個像'xref_'這樣的前綴,這樣我就知道它只是一個允許多對多關係的交叉引用表(一個用戶可以關注很多用戶,而一個用戶可能有很多關注用戶)。

'CREATE TABLE `user` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     `username` varchar(20) NOT NULL, 
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1'; 

'CREATE TABLE `follow` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     `followed_user_id` int(10) unsigned NOT NULL, 
     `follower_user_id` int(10) unsigned NOT NULL, 
     PRIMARY KEY (`id`) 
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1'; 
4

最好的方法是既不。你應該在關注表和追隨者表之間有一箇中間表。中間表只有兩列。 follow_id和followers_id。 通過這種方法,您可以省略您提到的兩種解決方案的缺點。你不必處理一個字符串,並且你沒有重複的條目,只有索引的表演速度非常快。

'CREATE TABLE `follow` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     PRIMARY KEY (`id`) 
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1'; 

'CREATE TABLE `user` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     `username` varchar(255) unsigned NOT NULL, 
     .... 
     PRIMARY KEY (`id`) 
     ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1'; 
'CREATE TABLE `follow_user` (
     `user_id` int(10) unsigned NOT NULL, 
     `follower_id` int(10) unsigned NOT NULL, 
) 

因爲你改變你的文章很多,我認爲你的第二種方法更好,如果追隨者是與用戶相同。因爲您只存儲follow和用戶的indexex以及一個很好的select查詢來查看單個用戶遵循的內容比解析和搜索字符串更好重複的條目沒有問題,因爲它們只是索引,並且沒有問題。

+0

你可以給我一個表結構的例子,這樣我可以更好地掌握? – user1307016 2013-02-28 23:16:36

+0

我添加了代碼。還有什麼你想要的嗎? – MIIB 2013-02-28 23:22:25

+0

那麼你如何去查詢這些信息呢?像例如添加一個追隨者? 我不完全確定爲什麼當你已經有一個用戶表與所有用戶(你命名你的用戶表遵循)時,你需要一個關注者表? – user1307016 2013-02-28 23:26:16