Sie können dies angehen wollen, wie folgt:
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)
);
Verbund primary key(comment_id, user_id)
auf dem intersection tablecomments_votes
wird verhindern, dass Benutzer mehrfach über dieselben Kommentare abstimmen.
Lassen Sie uns einige Daten in dem obigen Schema einfügen:
INSERT INTO comments_votes VALUES (1, 1, 1);
INSERT INTO comments_votes VALUES (2, 1, 1);
Die oben bedeutet, dass Benutzer 1 eine Stimme vom Typ 1 auf Kommentare gab:
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');
der einige Stimmen für Benutzer 1 Lassen Sie uns jetzt hinzufügen 1 und 2.
Wenn der gleiche Benutzer wieder zu stimmen versucht, auf einem dieser Kommentare, wird die Datenbank ablehnen:
INSERT INTO comments_votes VALUES (1, 1, 1);
ERROR 1062 (23000): Duplicate entry '1-1' for key 'PRIMARY'
Wenn Sie das InnoDB Speicher-Engine verwendet werden, wird es auch ratsam sein foreign key Einschränkungen für die comment_id
und user_id
Felder der Verknüpfungstabelle zu verwenden. Beachten Sie jedoch, dass MyISAM, Motor der Standard-Speicher in MySQL, keine Fremdschlüssel-Constraints erzwingen:
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;
Diese Fremdschlüssel garantieren, dass eine Zeile in comments_votes
nie einen comment_id
oder user_id
Wert hat, der nicht in der nicht existiert comments
und users
Tabellen jeweils. Fremdschlüssel müssen keine funktionierende relationale Datenbank haben, aber sie sind unbedingt erforderlich, um gebrochene Beziehungen und verwaiste Zeilen zu vermeiden (z. B. referential integrity).
In der Tat, referenzielle Integrität ist etwas, das sehr schwer zu erzwingen gewesen wäre, wenn Sie serialisierte Arrays in einem einzigen Datenbankfeld speichern würden.
Ich weiß, es ist eine einfache Aufgabe, mehrere Votings von einem Benutzer zu verhindern, aber ich brauche für den Benutzer deaktiviert Symbole anzuzeigen, die auf dem speziellen Kommentar bereits abgestimmt hat und so wenig mysql Abfragen wie möglich. Wie ich sehe, wird die Serialize-Funktion dieses Problem behandeln ... –
Gibt es einen Grund, warum Sie denken, dass es schwierig sein wird, wenn Sie den normalisierten Ansatz verwenden würden? –
@Daniel Vassallo Was meinst du mit normalisierten Ansatz? –