2016-09-14 15 views
-2

コンテキストのビット私は現在、http://www.clubsofa.orgと呼ばれるWebサイトで働いていますコンセプトは、人々が許可する意図でGoogleマップ上で友人検索の友人を行うことができるということです旅行中に2度目の友達と連絡をとる。 現在、セットアップはPostgreSQLであり、2つの一意のユーザーID(友人関係は一度だけ格納されます。たとえば、aという人物、bはbと友人、bはaの友達です)が格納されています。友人の友人に質問するとき、私は現在のユーザーのすべての友達を取得して、すべての友人を検索しますが、これは実行中のAWS ec2インスタンスではごくわずかな時間がかかります。 私が試したもう1つの方法は、友人関係を2つの方法で保存してから最初の列にインデックスを付けることですが、これはやや遅くなりました。 私が設定しようと考えていた方法のひとつは、person_detailsのエントリに人の友人をJSONオブジェクトとして格納しておき、これを遅延更新することでしたが、これをまだテストしていません。友人データベーステーブルのperformant友人を設計する方法

これを設定する方法はありますか? (friend_from、friend_to上のユニークなインデックス付き

あなたはより簡単にフォームのそれにビューを配置することによって、単に「一方向」で友情を格納したテーブルを照会することができ
+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_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

ありがとう!それは私がそれをすることを考えていなかった本当に良い考えです –

関連する問題