respectifs
Vous pouvez aborder cela comme suit:
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)
);
Le composite primary key(comment_id, user_id)
sur le intersection tablecomments_votes
empêche les utilisateurs de voter plusieurs fois sur les mêmes commentaires.
Insérons des données dans le schéma ci-dessus:
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');
Maintenant, nous allons ajouter quelques votes pour l'utilisateur 1:
INSERT INTO comments_votes VALUES (1, 1, 1);
INSERT INTO comments_votes VALUES (2, 1, 1);
qui précède signifie que l'utilisateur 1 a donné un vote de type 1 sur les commentaires 1 et 2.
Si le même utilisateur essaie à nouveau de voter sur l'un de ces commentaires, la base de données le rejettera:
INSERT INTO comments_votes VALUES (1, 1, 1);
ERROR 1062 (23000): Duplicate entry '1-1' for key 'PRIMARY'
Si vous allez utiliser le moteur de stockage InnoDB, il sera également sage d'utiliser foreign key contraintes sur les champs comment_id
et user_id
de la table d'intersection. A noter toutefois que MyISAM, le moteur de stockage par défaut de MySQL, n'impose pas la clé étrangère:
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;
Ces clés étrangères garantissent qu'une ligne de comments_votes
aura jamais une valeur comment_id
ou user_id
qui n'existe pas dans la comments
et users
, respectivement. Les clés étrangères n'ont pas besoin d'une base de données relationnelle fonctionnelle, mais elles sont absolument essentielles pour éviter les relations rompues et les lignes orphelines (par exemple, referential integrity). En fait, l'intégrité référentielle est quelque chose qui aurait été très difficile à appliquer si vous deviez stocker des tableaux sérialisés dans un seul champ de base de données.
Je sais qu'il est une tâche facile à éviter que plusieurs votations d'un utilisateur, mais je dois afficher les icônes désactivées pour les utilisateurs qui ont déjà voté sur le commentaire particulier et utiliser aussi peu mysql requêtes que possible. Comme je vois la fonction sérialiser traitera ce problème ... –
Y at-il une raison pour laquelle vous pensez que ce sera difficile si vous utilisiez l'approche normalisée? –
@Daniel Vassallo Que voulez-vous dire par approche normalisée? –