複数の ID をテーブルのフィールドに保存するか、別のテーブルを追加して ID を保存する必要があります。
各メンバーは基本的にお気に入りの記事を持っています。各記事には、ユーザーが [お気に入りに追加] ボタンをクリックしたときに保存される ID があります。
私の質問は:
フィールドを作成し、このフィールドに複数の ID を追加しますか?それとも、これらの ID を追加するテーブルを作成しますか?
これを行う最善の方法は何ですか?
これは多対多の関係です。user_id と article_id のペア (それぞれ user テーブルと article テーブルの主キー) を格納する追加のテーブルが必要です。
単一の列にカンマ区切りの値を含めるのではなく、新しいテーブルを作成する必要があります。
データベースを正規化してください。
別のテーブルを作成します。これがリレーショナル データベースでの動作です。もう 1 つの解決策 (1 つの列にコンマで区切られた ID のリスト) では、データベースが維持できなくなります。たとえば、記事がお気に入りに追加された回数を知りたい場合はどうすればよいでしょうか? このような列にクエリを書くことはできません。
テーブルには、ユーザーの ID と記事の ID を格納する必要があります。これらは、対応するテーブルの主キーを参照します。クエリには、JOIN
s またはネストされたSELECT
クエリを使用できます。
lafor がすでに指摘しているように、これは多対多の関係であり、ユーザー、記事、お気に入りの 3 つのテーブルが作成されます。
CREATE TABLE user(
id INT NOT NULL,
...
PRIMARY KEY (id)
) ENGINE=INNODB;
CREATE TABLE article (
id INT NOT NULL,
...
PRIMARY KEY (id)
) ENGINE=INNODB;
CREATE TABLE favorite (
userID INT NOT NULL,
articleID INT NOT NULL,
FOREIGN KEY (userID) REFERENCES user(id) ON DELETE CASCADE,
FOREIGN KEY (articleID) REFERENCES article(id) ON DELETE CASCADE,
PRIMARY KEY (userID, articleID)
) ENGINE=INNODB;
次に、すべてのユーザーのお気に入りの記事を選択する場合は、JOIN を使用します。
SELECT * FROM favorite f JOIN article a ON f.articleID = a.id WHERE f.userID = ?
このスキーマを使用する理由を知りたい場合は、データベースの正規化について読むことをお勧めします。1 つのフィールドに複数の ID があると、第 1 正規形に違反することさえあり、苦痛の世界に陥ります...