1

この構造で構築しているソーシャルタイプのネットワークにフレンドテーブルがあります。

uid binary(16) 
memberid int 
friendid int 
datefriended datetime 
isactive bool

このようにして、リレーションシップとその他のデータを 1 つのテーブルにのみ格納します。しかし、私が友人 ( memberid ) であるか、友人 ( friendid ) であるかに関係なく、すべての友人を取得する必要があるとしたら、メンバーテーブルからユーザー名を取得する必要があります。クエリは次のとおりです。

SELECT m.name FROM members m
INNER JOIN friends f on m.memberid = f.friendid
WHERE f.memberid = 1

UNION ALL

SELECT m.name from members m
INNER JOIN friends f on m.memberid = f.memberid
WHERE f.friendid = 1

多くのユーザーや友人がこのデータをプルしている場合、これはデータベースへのリソース集約的な呼び出しになる可能性があるように思えます。友人関係ごとにエントリのペアを作成するオプションがあることは知っていますが、一度のクエリでこれを実行しようとしています。クエリまたはテーブル構造を改善してパフォーマンスを向上させる方法について何か考えはありますか? それとも、私が予測しているほど悪くはないのでしょうか?

4

1 に答える 1

5

上記の私のコメントに加えて、friends.memberidfriends.friendidおよびmembers.memberidにインデックスを作成するようにアドバイスしていますが、まったく必要ありませんUNION

SELECT m.name
FROM members AS m JOIN friends AS f
  ON (m.memberid, 1) IN ((f.friendid, f.memberid), (f.memberid, f.friendid))
于 2012-05-11T23:00:35.070 に答える