簡體   English   中英

設計社交網站的好友表

[英]Design a friends table for a social networking site

嗨,我面臨有關用於存儲用戶所有好友列表的表結構的問題。 在下表中,如果用戶84請求與用戶7074保持友誼,那么我使用的表是用戶84 ,朋友是70和74 ,反之亦然。 類似地,用戶77具有84

在此處輸入圖片說明

但是問題是,如果我想找出用戶84(即用戶( 70,74,77 ))的所有朋友及其詳細信息。

我是否應該輸入重復的記錄(如圖片2 Ex):如果用戶84在用戶70接受請求時向用戶70發送好友請求,則將插入另一行,例如user_id 70和friend_id 84

或是否有任何基於Friends表的列值的mysql查詢與users表聯接。 就像如果user_id為84一樣 ,它將基於friend_id進行聯接 ,如果friend_id為84則它將通過使用user_id列與用戶表聯接

在此處輸入圖片說明

我不建議這樣做,而是使用以下結構來解決此問題。 創建兩個不同的表。 即1-友誼2-友誼狀態

1- 在此處輸入圖片說明

2 在此處輸入圖片說明

在友誼表中,當userId1向userId2發送好友請求時,然后以狀態1插入recoed。當userId2接受好友請求時,狀態變為2。如果userid2已取消請求,則狀態變為3。即使您要獲取數據。 supposeu想找到誰是用戶ID為3的朋友。然后使用如下查詢:

SELECT userId1, userId2 from friendship where userId2=3 OR userId1 =3 AND status =2

無需輸入重復的條目。

您可以使用聯接查詢來獲取結果。 無需添加重復條目

基於第一個表設計,您可以為此使用UNION以獲得特定用戶ID的所有朋友:

SELECT f.friend_id FROM friends f WHERE f.user_id = 84
UNION ALL
SELECT f.user_id FROM friends f WHERE f.friend_id = 84

輸出為:

+-----------+
| friend_id |
+-----------+
|        70 |
|        74 |
|        77 |
+-----------+
3 rows in set

我假設在您的系統中友誼是對稱的,即如果A是與B的朋友,則意味着B也是與A的朋友。在這種情況下,建議您更改Friend表的列以反映兩個人平等的事實。關系中的地位,例如

友人

  • @ User1_Id
  • @ User2_Id

有了它,您可以執行類似這樣的查詢

SELECT * FROM User WHERE User.UserId IN (
    (SELECT User1_Id FROM Friend WHERE User2_Id = MY_USER_ID)
    UNION
    (SELECT User2_Id FROM Friend WHERE User1_Id = MY_USER_ID)
)

這將使用子選擇而不是聯接,再加上並集,以根據朋友表中列出的圍繞用戶的方式來獲得朋友的用戶ID的單個列表。 子查詢和並集的文檔。

可能值得這樣保存,而不是通過在Friends表中為每種關系分配兩行來簡化代碼(A,B和B,A)。 如果您有N個用戶,則如果重復,則Friends表最多具有N *(N-1)行,如果沒有,則有一半。

SELECT * FROM friends AS f 
LEFT JOIN users AS u ON f.user_id = u.user_id 
     AND f.friend_id = u.user_id 
WHERE f.friend_id = 84 OR f.user_id = 84

我沒有嘗試過,但是希望對您有用。

該查詢將為您提供包括用戶XXXX的朋友的所有條目

select * from friendshipTable where user_id = XXXX or friend_id = XXXX

經過很長一段時間的搜索,我找到了使用以下聯接操作並且無需輸入重復條目來解決問題的最佳方法。 這是我的查詢

SELECT  users.*  FROM friends  
  LEFT JOIN users  ON  
    (users.`id` = friends.`user_id` OR  users.`id` = friends.`friend_id`) 
        AND  
    users.`id` != '84'   
WHERE     
    friends.`user_id` = '84'   
        OR  
    friends.`friend_id`='84'

我已經將user_id = 84設為靜態,因此可以根據需要使它成為動態的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM