これは奇妙に思えるかもしれませんが、MySQL テーブルに値のリストを含むことができる列を持たせることができるかどうか疑問に思っています。たとえば、Facebook のような友達リストを表すテーブルがあるとします。テーブルでこれをどのようにシミュレートできますか? ユーザー名を属性列に追加できると思いますが、それが最善のアイデアなのか、それを行う方法なのかさえわかりません。これまたは代替手段を達成する方法に関する提案はありますか?
3 に答える
特定の状況下では、機能がENUM 型に似ているSET 型を使用できます。フィールドに 1 つ以上の定義済みの値を格納できます。ただし、Facebook の友達の場合は、新しいユーザーが作成されるたびに列の定義を更新する必要があるため、実用的ではありません。
Wolframのマッピングテーブルの提案は、1人のユーザーが削除されたときの参照整合性を保証する外部キー制約の使用も可能にするため、間違いなくより良いソリューションです(カスケードを使用すると仮定)。また、JOIN でリレーションシップを使用する必要がある場合は、マッピング テーブルが唯一の解決策です。
これは通常は素晴らしいアイデアではありませんが、MySQLには次のようなものがあります。
FIND_IN_SET('b','a,b,c,d')
SELECT ... FROM friends WHERE FIND_IN_SET('foo',friends_list) > 0;
だからあなたはあなたが尋ねたことをとても簡単に行うことができました。通常は推奨されません。
Facebook の例に合わせて、探しているのは、2 つの列を持つテーブルを持つことです。1 つ目はユーザーを識別し、2 つ目はそのユーザーの友達のリストですか?
私の知る限り、列を配列のように扱うことはできません。ダッシュで区切られたすべての個々の名前を含む文字列を作成することもできますが、それは堅牢ではありません。
私の提案は、どちらも varchars または string である 2 つの列を持つ friends テーブルを持つことです。各列には 1 人の名前または ID のみが含まれており、これはその 2 人の友情を示しています。
次に、foobar の友達のリストが必要な場合は、次のようにクエリします。
SELECT *
FROM friends
WHERE user_a == 'foobar' || user_b == 'foobar'
これで、実際には両方の列が得られます。そのうちの 1 つは foobar で、もう 1 つは彼/彼女の友達です。したがって、それを foobar の友達だけに分けるには少し工夫が必要かもしれませんが、コードに適した方法を見つけられると確信しています。