Може да искате да се справите с това, както следва:
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 за коментари 1 и 2.
Ако същият потребител се опита да гласува отново за един от тези коментари, базата данни ще го отхвърли:
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
таблици, респ. Не се изисква външни ключове да имат работеща релационна база данни, но те определено са от съществено значение, за да се избегнат прекъснати връзки и сираци (т.е. интегритет на препратка
).
Всъщност референтната цялост е нещо, което би било много трудно за прилагане, ако трябваше да съхранявате сериализирани масиви в едно поле на базата данни.