次のようにこれに取り組むことをお勧めします:
CREATE TABLE comments (
comment_id int,
body varchar(100),
PRIMARY KEY (comment_id)
);
CREATE TABLE users (
user_id int,
username varchar(20),
PRIMARY KEY (user_id)
);
CREATE TABLE comments_votes (
comment_id int,
user_id int,
vote_type int,
PRIMARY KEY (comment_id, user_id)
);
複合(comment_id, user_id)
交差テーブル
comments_votes
ユーザーが同じコメントに複数回投票するのを防ぎます。
上記のスキーマにいくつかのデータを挿入しましょう:
INSERT INTO comments VALUES (1, 'first comment');
INSERT INTO comments VALUES (2, 'second comment');
INSERT INTO comments VALUES (3, 'third comment');
INSERT INTO users VALUES (1, 'user_a');
INSERT INTO users VALUES (2, 'user_b');
INSERT INTO users VALUES (3, 'user_c');
それでは、ユーザー1に投票を追加しましょう:
INSERT INTO comments_votes VALUES (1, 1, 1);
INSERT INTO comments_votes VALUES (2, 1, 1);
上記は、ユーザー1がコメント1と2にタイプ1の投票をしたことを意味します。
同じユーザーがこれらのコメントの1つに再度投票しようとすると、データベースはそれを拒否します。
INSERT INTO comments_votes VALUES (1, 1, 1);
ERROR 1062 (23000): Duplicate entry '1-1' for key 'PRIMARY'
InnoDB
を使用する場合 ストレージエンジンの場合は、外部キー
を使用することも賢明です。 comment_id
の制約 およびuser_id
交差テーブルのフィールド。ただし、MyISAM
に注意してください。 、MySQLのデフォルトのストレージエンジンは、外部キー制約を強制しません:
CREATE TABLE comments (
comment_id int,
body varchar(100),
PRIMARY KEY (comment_id)
) ENGINE=INNODB;
CREATE TABLE users (
user_id int,
username varchar(20),
PRIMARY KEY (user_id)
) ENGINE=INNODB;
CREATE TABLE comments_votes (
comment_id int,
user_id int,
vote_type int,
PRIMARY KEY (comment_id, user_id),
FOREIGN KEY (comment_id) REFERENCES comments (comment_id),
FOREIGN KEY (user_id) REFERENCES users (user_id)
) ENGINE=INNODB;
これらの外部キーは、comments_votes
の行を保証します comment_id
はありません またはuser_id
comments
に存在しない値 およびusers
それぞれテーブル。外部キーは、機能するリレーショナルデータベースを持っている必要はありませんが、壊れた関係や孤立した行を回避するために絶対に不可欠です(つまり、参照整合性
。
実際、参照整合性は、シリアル化された配列を単一のデータベースフィールドに格納する場合、実施するのが非常に困難であったものです。