[英]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_id
和creation_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.