Heim > Datenbank > MySQL-Tutorial > Wie verhindert man doppelte Abstimmungen in MySQL beim Speichern von Benutzerabstimmungsdaten?

Wie verhindert man doppelte Abstimmungen in MySQL beim Speichern von Benutzerabstimmungsdaten?

Mary-Kate Olsen
Freigeben: 2024-10-29 20:18:03
Original
321 Leute haben es durchsucht

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

Speichern eines Arrays in MySQL zur Verhinderung mehrfacher Abstimmungen

Problemstellung

Sie möchten eine Tabelle in MySQL erstellen, um ein Array von Benutzer-IDs zu speichern die über Kommentare abgestimmt haben. Auf diese Weise möchten Sie verhindern, dass derselbe Benutzer mehrfach für denselben Kommentar abstimmt.

Lösung

Erwägen Sie die Verwendung einer separaten Tabelle, comments_votes, um eine Viele-zu-Viele-Beziehung zwischen ihnen herzustellen die Kommentar- und Benutzertabellen. Das folgende Schema bietet eine Grundlage:

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)
);
Nach dem Login kopieren

Der zusammengesetzte Primärschlüssel (comment_id, user_id) in comments_votes verhindert, dass Benutzer mehrmals über dieselben Kommentare abstimmen.

Beispielverwendung

Fügen Sie zur Veranschaulichung einige Daten ein:

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');
Nach dem Login kopieren

Fügen Sie Stimmen für Benutzer 1 hinzu:

INSERT INTO comments_votes VALUES (1, 1, 1);
INSERT INTO comments_votes VALUES (2, 1, 1);
Nach dem Login kopieren

Der Versuch, über einen zuvor abgestimmten Kommentar erneut abzustimmen, führt aufgrund der Eindeutigkeit zu einem Fehler Primärschlüsseleinschränkung:

INSERT INTO comments_votes VALUES (1, 1, 1);
ERROR 1062 (23000): Duplicate entry '1-1' for key 'PRIMARY'
Nach dem Login kopieren

Überlegungen zu Fremdschlüsseln (nur InnoDB)

Wenn Sie die InnoDB-Speicher-Engine verwenden, sollten Sie das Hinzufügen von Fremdschlüsseleinschränkungen in Betracht ziehen, um die referenzielle Integrität sicherzustellen:

...
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;
Nach dem Login kopieren

Diese Fremdschlüssel stellen sicher, dass comments_votes nur auf gültige Kommentar-IDs und Benutzer-IDs verweist.

Vorteile dieses Ansatzes

Diese Lösung bietet mehrere Vorteile gegenüber dem Speichern von Arrays in einem einzelnen Datenbankfeld:

  • Erzwingt referenzielle Integrität:Fremdschlüssel garantieren Datenkonsistenz und vermeiden unterbrochene Beziehungen.
  • Bietet Flexibilität:Die Spalte vote_type ermöglicht zukünftige Abstimmungserweiterungen ( B. Upvoting/Downvoting).
  • Verbessert die Leistung:Die Verwendung einer separaten Tabelle für Stimmen ermöglicht effiziente Abfragen und Indizierung.

Das obige ist der detaillierte Inhalt vonWie verhindert man doppelte Abstimmungen in MySQL beim Speichern von Benutzerabstimmungsdaten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage