Maison > base de données > tutoriel mysql > le corps du texte

Comment éviter les votes en double dans MySQL lors du stockage des données de vote des utilisateurs ?

Mary-Kate Olsen
Libérer: 2024-10-29 20:18:03
original
245 Les gens l'ont consulté

How to Prevent Duplicate Votes in MySQL When Storing User Voting Data?

Stockage d'un tableau dans MySQL pour la prévention des votes multiples

Énoncé du problème

Vous cherchez à créer une table dans MySQL pour stocker un tableau d'ID utilisateur qui ont voté sur les commentaires. Ce faisant, vous souhaitez empêcher plusieurs votes du même utilisateur sur le même commentaire.

Solution

Envisagez d'utiliser une table distincte, comments_votes, pour établir une relation plusieurs-à-plusieurs entre les tableaux des commentaires et des utilisateurs. Le schéma suivant fournit une base :

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)
);
Copier après la connexion

La clé primaire composite (comment_id, user_id) dans comments_votes empêche les utilisateurs de voter plusieurs fois sur les mêmes commentaires.

Exemple d'utilisation

Insérez quelques données pour démontrer :

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');
Copier après la connexion

Ajouter des votes pour l'utilisateur 1 :

INSERT INTO comments_votes VALUES (1, 1, 1);
INSERT INTO comments_votes VALUES (2, 1, 1);
Copier après la connexion

Tenter de voter à nouveau sur un commentaire précédemment voté entraînera une erreur en raison de l'unique contrainte de clé primaire :

INSERT INTO comments_votes VALUES (1, 1, 1);
ERROR 1062 (23000): Duplicate entry '1-1' for key 'PRIMARY'
Copier après la connexion

Considérations sur les clés étrangères (InnoDB uniquement)

Si vous utilisez le moteur de stockage InnoDB, envisagez d'ajouter des contraintes de clé étrangère pour garantir l'intégrité référentielle :

...
CREATE TABLE comments (
    ...
) ENGINE=INNODB;

CREATE TABLE users (
    ...
) ENGINE=INNODB;

CREATE TABLE comments_votes (
    ...
    FOREIGN KEY (comment_id) REFERENCES comments (comment_id),
    FOREIGN KEY (user_id) REFERENCES users (user_id)
) ENGINE=INNODB;
Copier après la connexion

Ces clés étrangères garantissent que comments_votes fait référence uniquement à des ID de commentaire et à des ID d'utilisateur valides.

Avantages de cette approche

Cette solution offre plusieurs avantages par rapport au stockage de tableaux dans un seul champ de base de données :

  • Applique l'intégrité référentielle : Les clés étrangères garantissent la cohérence des données et évitent les relations rompues.
  • Offre de la flexibilité : La colonne vote_type permet de futures extensions de vote ( par exemple, vote positif/vote négatif).
  • Améliore les performances : L'utilisation d'un tableau séparé pour les votes permet des requêtes et une indexation efficaces.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!