0

私はmysqlデータベースを持っています。ユーザーのテーブルがあります。「あるユーザーは別のユーザーの友達ですか?」という質問に答えたいと思います。これらは一方通行の友人関係です。2 つのオプションがあると思いますが、よりパフォーマンスの高いソリューションが必要です。

1) 友人関係のテーブルを保持します。2 つの列:

username | friend_username
--------------------------
 mary        john
 mary        steve
 mary        kate
 ...

友情の質問に答えるには、2 つの列がユーザー名 1 と 2 に一致する数を選択するだけです。

2) 再び 2 つの列を持つテーブル:

username | friends_serialized
-----------------------------
mary       john,steve,kate,

したがって、「friends_serialized」列には (カンマ) で区切られた文字列が保持されます。メアリーが誰かと友達かどうか知りたい場合は、次のようにできます。

select count from xxx where username="mary" AND friends_serialized LIKE "%,steve,%"

(構文がわかりません)。それは本当に最初の実装よりも私に何かを勝ち取るでしょうか? 少なくともよりコンパクトであり、友人のリストをユーザーに配信する必要がある場合、一致するすべての列を選択するのではなく (#1 のように)、1 つの列を読み取るだけでリストを取得できます。

私の問題: ユーザーがゲームをプレイするために互いに招待を送信できるゲーム サービスを実行しています。見知らぬ人が友達以外の招待状を送信できないようにしたい. そのため、別のユーザーに招待状を送信したユーザーが実際に共通の友達であるかどうかをすばやく (そしてコンパクトに) 確認できるようにしたいと考えています。

ありがとう

4

4 に答える 4

3

絶対に最初のアプローチを使用する必要があります。2 番目のアプローチは、リレーショナル データベースの第 1 正規形にも違反しています (1 つのフィールドに複数の値 (この場合は友情) を格納しないでください)。

于 2012-07-14T04:31:58.577 に答える
0

あなたが言及した最初のものは最良の答えです.2番目のものでは、文字列を取得した後、それを分析して友人について見つける必要がありますが、最初のものはより直接的です!

于 2012-07-14T04:31:31.337 に答える
0

文字列ではなく ID を使用します。

ジャンクション テーブルを作成します。

ID  PersonID FriendID
0    1        2
1    4        2
2    2        3
.....

人物 2 は人物 1 と人物 4 の両方の友人です。人物 3 は人物 2 の友人です。

于 2012-07-14T04:31:57.923 に答える
0

最初の解決策に進みます。次のようなテーブルを作成します。

CREATE TABLE friendships (
   user varchar(64) NOT NULL,
   friend varchar(64) NOT NULL,
   PRIMARY KEY (user, friend)
   FOREIGN KEY (user) REFERENCES users (user_name) 
      ON DELETE CASCADE ON UPDATE CASCADE,
   FOREIGN KEY (friend) REFERENCES users (user_name)
      ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;

friendshipsこれにより、両方のユーザー名 (userおよびfriend) がテーブルに存在しない場合、行をテーブルに挿入できないことが保証されusersます。また、ユーザーを削除すると、そのユーザーのフレンドシップはすべて削除されます。ユーザー名を更新した場合と同じです (許可している場合)。さらに、フレンドシップは一方向であり、特定のユーザーが別のユーザーとフレンドになるのは 1 回だけなので、両方の列をPRIMARY KEY.

次に、特定のユーザーの友達を見つけるのは非常に簡単なクエリです。

SELECT friend FROM friendships WHERE user='username'

于 2012-07-14T04:38:53.130 に答える