2010-08-12 22 views
1

我將爲我的項目創建友誼系統。我無法決定是否應將朋友存儲在用戶行的列中,或者創建好友表並在其中存儲用戶ID?要清除哪個用法更好:Php爲用戶的朋友展開或獨特的Mysql表?

用戶表應該是這樣嗎?

+-----------+-----------+---------------+ 
+ id  + username + friends + 
+-----------+-----------+---------------+ 
+ 11  + user_x + 12;23;15;3;7 + 
+-----------+-----------+---------------+ 

<?php explode(';',$friends); ?> 

或; 我可以創建一個這樣的朋友表嗎?

+-----------+-----------+---------------+ 
+ id  + user +  friend + 
+-----------+-----------+---------------+ 
+ 1  + 11  +  12  + 
+-----------+-----------+---------------+ 
+ 2  + 11  +  23  + 
+-----------+-----------+---------------+ 
+ 3  + 11  +  15  + 
+-----------+-----------+---------------+ 
+ 4  + 11  +  3  + 
+-----------+-----------+---------------+ 
+ 5  + 11  +  7  + 
+-----------+-----------+---------------+ 

SELECT friend FROM friends WHERE user = 11 

哪一個更好?謝謝

回答

1

第二種方式更加靈活,例如,它可以讓您輕鬆查詢「曾經和你交過朋友的人」。無需朋友只需要刪除一行而不是操縱一個字符串。您可以輕鬆生成多少朋友擁有的等級統計信息等等......

如果這對您很重要,您仍然可以實現第一個選項的效果。只需使用GROUP_CONCAT即可獲取列表中的所有朋友ID,例如

SELECT id,foo,bar,GROUP_CONCAT(friend_id) as friends 
FROM user 
LEFT JOIN friends ON(user.id=friends.user) 
GROUP BY user.id; 
1

後者。它允許你更多的靈活性。想象一下諸如刪除朋友,或者計算某人有多少朋友,或者看着兩個人並看到他們共同擁有什麼朋友的情況。對於第二個系統來說,所有這些都是微不足道的,而不是第一個系統。

+0

謝謝Visage,這真的很有幫助。 – Kemal 2010-08-13 10:47:43

0

這取決於您的使用情況。如果你只是要顯示朋友列表並且從不搜索它(例如,14是11的朋友?),那麼也許第一個可能就足夠了。刪除或插入它需要先獲取朋友列表,更改它,然後用整個新列表更新記錄。

但是,除了這個簡單的用法之外,只要用戶和朋友都正確索引,第二個靈活得多。

+0

感謝Fanis。我會用第二個。 – Kemal 2010-08-13 10:48:21