簡體   English   中英

存儲朋友和檢索特定用戶的朋友的更好方法

[英]better way store friends and retrieve friends of a particular user

這些mysql存儲方法中的哪種存儲方法查詢更快(檢索特定用戶的朋友說@anyid):

Table: Friends

Columns: friend1 friend2

每個友誼僅插入一行,並查詢為

select friend1 
from FRIENDS 
where friend2=@anyid
UNION ALL
select friend2 
from FRIENDS 
where friend1=@anyid

要么

在每個友誼中插入兩行(插入為friend1 friend2,然后插入交換的條目,例如1,2和2,1),然后簡單地查詢為

select friend2 from FRIENDS where friend1=@anyid

在我看來,第二種方法會更好地執行,因為它只需要對單個列friend1和單個查詢建立索引。 第一種方法可能要求兩個列都被索引,並且需要運行兩個子查詢。 但是在某些帖子中,我看到人們聲稱第一種方法可能會更好。 從好的方面來說,與第二種方法相比,第一種方法將占據一半的存儲空間,對於百萬條記錄而言,這將產生巨大的差異。

還有另一件事,是否需要為上述兩個方法中的任何一個存儲單獨的relationship_idcreation_date 除了給我建立關系的時間或順序,我還能得到什么特殊的好處,我想大多數人應該能夠沒有它嗎?

感謝您的任何答案!

對我來說,基本的問題是:“數據庫中有多少個朋友?” 如果只有A和B是朋友,則數字是“ 1”或“ 2”。 這個答案決定了您如何理解友誼實體,以及如何實現它。

兩種方法肯定有區別。 要以第一種方式計算朋友數:

select count(*)
from friends
where USERID in (friend1, friend2);

與:

select count(*)
from friends
where USERID = friend1;

第二個可以更輕松地利用friend1上的索引,並且可以優化為比第一個更快。

另一方面,插入記錄需要兩倍的時間。 而尋找朋友的朋友(等等)需要處理更多的數據,因此需要更多的處理時間。

友誼關系確實具有其他特征,例如誰發起了請求(在第一種方法中,通常是friend1 )。 或者是友誼被要求和接受的時代。 這樣的附加信息表明了消除數據重復的第一種方法。

換句話說,關於數據結構的問題(幾乎與所有此類問題一樣)都由您如何理解實體以及如何使用它們來回答。

暫無
暫無

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

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