我想要設計一個非常簡單的表,用於存儲社區中朋友的數據。避免朋友表中的數據冗餘
因此,我分別存儲了2位朋友的userId
。
目標
用戶想要加載他/她的朋友列表。
t_friends選項1:
查詢
SELECT * FROM t_friend WHRE user_id = 10
10
是正在尋找他的朋友列表中的用戶的當前userId
和他有1個朋友userId(20)
這種方式userId (10)
找到他的朋友(20)
但是如果userId(20)
找他的朋友呢? 該查詢結合userId
。
這使我到包含冗餘數據的另一種設計:
t_friends選項2:現在
userId (10)
負載:
SELECT * FROM t_friend WHRE user_id=10
類同,查詢因此userId(20)
將是:
SELECT * FROM t_friend WHRE user_id=20
但是冗餘怎麼樣?這導致我然後使用表設計選項1的查詢:
SELECT * FROM t_friend WHERE user_id=10 OR friend_id=10
我有一種感覺,有一個更聰明的方法來解決這個問題。你對這種結構有任何經驗嗎?
感謝
什麼冗餘?你所做的完全沒問題,不管有什麼人會寫關於它的東西,都沒有更聰明的辦法。您查詢用戶的朋友。你的數據是正常化的,一切都很完美。如果你可以通過嘗試「優化」來實現任何目標,那麼它就會破壞整個事情,產生不必要的複雜查詢並使系統難以維護。無論用戶使用SQL有什麼經驗或者有什麼經驗,當人們看到你創建的桌面時,乍看起來一切都很合理。 TL; DR:不要改變任何東西。 – Mjh
謝謝@Mjh。但是通過這種方式,我們可以獲得更多的數據。而不是有例如10GB你將有20GB的掃描等。 –
@bub您使用的最終查詢完全正確,在我看來,問題正在被過度思考。每個關係一行,使用OR查詢,完成。你可以在那裏拋出一個IF來避免它在php中:'SELECT IF(user_id = 10,friend_id,user_id)AS target_id FROM t_friend WHERE user_id = 10或friend_id = 10' –