Anda mungkin ingin mengatasinya sebagai berikut:
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)
);
Gabungan kunci utama
(comment_id, user_id)
di tabel persimpangan
comments_votes
akan mencegah pengguna memilih beberapa kali pada komentar yang sama.
Mari kita masukkan beberapa data dalam skema di atas:
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');
Sekarang mari tambahkan beberapa suara untuk pengguna 1:
INSERT INTO comments_votes VALUES (1, 1, 1);
INSERT INTO comments_votes VALUES (2, 1, 1);
Di atas berarti pengguna 1 memberikan suara tipe 1 pada komentar 1 dan 2.
Jika pengguna yang sama mencoba untuk memilih lagi pada salah satu komentar tersebut, database akan menolaknya:
INSERT INTO comments_votes VALUES (1, 1, 1);
ERROR 1062 (23000): Duplicate entry '1-1' for key 'PRIMARY'
Jika Anda akan menggunakan InnoDB
mesin penyimpanan, sebaiknya gunakan kunci asing
batasan pada comment_id
dan user_id
bidang tabel persimpangan. Namun perhatikan bahwa MyISAM
, mesin penyimpanan default di MySQL, tidak menerapkan batasan kunci asing:
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;
Kunci asing ini menjamin bahwa baris di comments_votes
tidak akan pernah memiliki comment_id
atau user_id
nilai yang tidak ada di comments
dan users
tabel, masing-masing. Kunci asing tidak diperlukan untuk memiliki database relasional yang berfungsi, tetapi sangat penting untuk menghindari hubungan yang rusak dan baris yatim piatu (mis. integritas referensial
).
Faktanya, integritas referensial adalah sesuatu yang akan sangat sulit diterapkan jika Anda menyimpan array serial ke dalam satu bidang database.