Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie speichere ich ein Array in MySQL?

Sie können dies wie folgt angehen:

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)
);

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

Lassen Sie uns einige Daten in das obige Schema einfügen:

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');

Lassen Sie uns nun einige Stimmen für Benutzer 1 hinzufügen:

INSERT INTO comments_votes VALUES (1, 1, 1);
INSERT INTO comments_votes VALUES (2, 1, 1);

Das Obige bedeutet, dass Benutzer 1 eine Stimme vom Typ 1 für die Kommentare 1 und 2 abgegeben hat.

Wenn derselbe Benutzer erneut versucht, über einen dieser Kommentare abzustimmen, wird die Datenbank ihn ablehnen:

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

Wenn Sie InnoDB verwenden Speicher-Engine ist es auch ratsam, Fremdschlüssel zu verwenden Einschränkungen für die comment_id und user_id Felder der Schnitttabelle. Beachten Sie jedoch, dass MyISAM , die standardmäßige Speicher-Engine in MySQL, erzwingt keine Fremdschlüsseleinschränkungen:

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 wird niemals eine comment_id haben oder user_id Wert, der in den comments nicht vorhanden ist und users Tabellen bzw. Fremdschlüssel sind nicht erforderlich, um eine funktionierende relationale Datenbank zu haben, aber sie sind definitiv unerlässlich, um unterbrochene Beziehungen und verwaiste Zeilen zu vermeiden (z. B. Referentielle Integrität ).

Tatsächlich wäre die referenzielle Integrität etwas, das sehr schwierig durchzusetzen wäre, wenn Sie serialisierte Arrays in einem einzigen Datenbankfeld speichern würden.