0

MySQL では、ユーザーごとに行があり、列には友達の名前が\nで区切られています。

eg.
Friend1
Friend2
Friend3

Friends フィールドに Friend2 が含まれているすべてのユーザーをすばやく検索できるようにしたいと考えています。

私は見つけましFIND_IN_SETたが、それはコンマに対してのみ機能し、データにはコンマと外国の文字が含まれる可能性があります。

明らかに正規表現で検索すると遅くなります。私は相互参照全体に慣れていないので、データをすばやく見つけられるようにデータを構造化するための最良の方法について助けていただければ幸いです。

前もって感謝します。

編集:わかりました、データがゲームからのものであり、友人の名前がローカルに保存されており、別のユーザー ID へのリンクがないことを忘れていました。したがって、文字列。彼らが接続するたびに、ゲームを一致させるためにバックグラウンドで使用する友人の名前のダンプが与えられます.

4

3 に答える 3

2

この種のデータに最も一般的に使用される構造は、通常、追加のテーブルを追加することです。いえ

user
    id,
    name
    email,
    e.t.c.

user_friend
    user_id
    friend_id

これを照会することは、テーブルを照会することの問題です。いえ

ユーザーの友達の名前をすべてリストします。

SELECT friend_id
FROM user_friend 
WHERE user_id = :theUser

編集:OPの編集について。名前だけを保存することも可能です。この場合、テーブル構造は次のようになります。

user_friend
    user_id
    friend_name

そしてクエリ:

SELECT friend_name 
FROM user_friend 
WHERE user_id = :theUser
于 2013-01-29T02:03:08.843 に答える
1

なぜ友達の名前をテキストのままにしているのですか? これは、ユーザーが友達を削除したり、名前を変更したりするなどの編集には非効率的です。それは別のことです。友人の名前をデータベースに auto_increment id キーで保存する必要があります。特に非常に大規模なデータベースでは、文字列よりも整数を検索する方がはるかに高速です。次のような友達テーブルを設定する必要があります

 Column 1: connectionid auto_increment key
 Column 2: user1id int
 Column 3: user2id int
 Column 4: date added date

など...

次に、上記の接続テーブルで user が user1id または user2id であるすべての行を検索し、そこから他のユーザーのリストを取得できます。

于 2013-01-29T02:04:18.997 に答える
1

私のデータベースはまだいっぱいになっていないので、データを保存する形式と構造を簡単に変更できます。

はい、データベースを少し正規化する必要があります。現在の構造では、検索が非常に遅くなり、より多くのスペースを消費します。

正規化に関する詳細なヘルプについては、このwikiを参照してください。

friends テーブルと users テーブルを分離し、外部キー制約または内部結合のいずれかによって両方をリンクできます。

構造は次のようになります。

ユーザー テーブル

  • id: AUTO_INCRMENT PK
  • 名前
  • その他の列

友達テーブル

  • id: AUTO_INCREMENT (必須ではありませんが、パーティショニングに適しています)
  • ユーザーID:
  • 友達ID
  • 追加日
  • 必要に応じてその他の情報。
于 2013-01-29T02:05:36.417 に答える