4

友情をデータベースに保存したいのですが。私の考えは、user1がuser2と友達になったときに、その友情を保存して、必要に応じてどちらかのユーザーの友達をすべて取得できるようにすることです。最初は、1つの挿入でIDをテーブルに格納するだけだと思っていましたが、データベースのクエリ中にいくつかの問題について考えました。

ユーザーIDが10と20のユーザーが2人いる場合、友達になったときにデータベースに2つの挿入を行う必要があります

ID USER1 USER2
1  10    20
2  20    10

または、そのように1回だけ挿入した場合に、特定のユーザーの友達だけを取得するようにデータベースにクエリを実行する方法はありますか?

ID USER1 USER2
1  10    20

最初の方法で私が探しているものが確実に得られることはわかっていますが、これが良い習慣であるかどうか、そしてより良い代替案があるかどうかを知りたいと思います。そして、2番目の方法を照会して結果を取得できる場合は、ユーザー10のすべての友達のように探しています。

4

2 に答える 2

5

友情は双方向の絆です(すべての意図と目的のために)。別のリンク(一方向のメッセージなど)とは異なり、友情には1つのエントリしかありません。ただし、表示されている内容は正しいです。ユーザーの友達を取得するには、両方の列に対してクエリを実行する必要がありますが、それは十分に簡単です。

-- The uses of `1` below is where you'd insert the ID of
-- the person you're looking up friends on
SELECT      u.id, u.name
FROM        friendship f
  LEFT JOIN user u
  ON        (u.id = f.user1 OR u.id = f.user2)
    AND     u.id <> 1
WHERE       (f.user1 = 1 OR f.user2 = 1)

ここの例

于 2012-12-28T01:57:44.960 に答える
5

両方向でテーブルをクエリするというBradChristieの提案は良いものです。ORただし、MySQLはクエリの最適化があまり得意ではないため、使用UNION ALLする方が効率的かもしれません。

( SELECT u.id, u.name
  FROM friendship f, user u
  WHERE f.user1 = 1 AND f.user2 = u.id )
UNION ALL
( SELECT u.id, u.name
  FROM friendship f, user u
  WHERE f.user2 = 1 AND f.user1 = u.id )

これは、Bradの例に基づいたSQLFiddleです。friendship効率的なアクセスのために双方向インデックスを追加し、意味のないidを削除するようにテーブルを変更しました。もちろん、このような小さな例では、実際のパフォーマンスを実際にテストすることはできませんが、2つのバージョン間で実行プランを比較することは有益な場合があります。

于 2012-12-28T02:15:11.047 に答える