2016-09-14 49 views
-2

對於一點上下文,我目前正在一個名爲http://www.clubsofa.org的網站上工作,其中的概念是人們可以在谷歌地圖上搜索朋友的朋友,目的是允許他們在旅途中與二級朋友聯繫。 目前的設置是PostgreSQL,有一個名爲friends的表,它存儲了兩個唯一的用戶id(友誼只存儲一次,例如a,b表明a是b的朋友,b是a的朋友)。在查詢朋友的朋友時,我得到當前用戶的所有朋友,然後搜索他們的所有朋友,但這需要很長時間,而運行AWS EC2實例的用戶很少。 我嘗試過的另一種方法是通過兩種方式存儲朋友關係,然後在第一列上編制索引,但是,這稍微慢一些。 我正在考慮設置它的一種方式是將一個人朋友作爲JSON對象存儲在他們的user_details條目中,然後懶洋洋地更新它,但還沒有到這裏來測試它。如何設計一個高性能朋友的數據庫表

有沒有什麼好的方法來設置它?

+0

如果您使用的是Postgres,那麼朋友們存儲在SQLish方式,與每個朋友列一個表的朋友。 –

+0

我目前已經得到了,它非常緩慢。沒有更好的方法來做到這一點嗎? –

+2

「*且速度非常慢*」 - 向我們顯示您當前的表格定義(作爲'create table'語句)您正在使用和閱讀的查詢:http://wiki.postgresql.org/wiki/SlowQueryQuestions –

回答

1

你可以更方便地查詢您在其中放置一個觀點就可以了形式存放在只是「一個方向」友誼表...

create view all_friendships 
as 
select friend_from, 
     friend_to 
from friendships 
union all 
select friend_to, 
     friend_from 
from friendships; 

隨着(friend_from,friend_to唯一索引)和(friend_to,friend_from),這應該很容易維護和查詢。

因此讓朋友的朋友將是:

select distinct 
     f2.friend_to 
from all_friendships f1 join 
     all_friendships f2 on (f2.friend_from = f1.friend_to) 
where f1.friend_from = 12345 and 
     f2.friend_to != 12345; 
+0

謝謝!這是一個非常好的想法,我沒有想過這樣做 –

相關問題