sql >> Databasteknik >  >> RDS >> Mysql

Hur lagrar man en array i mysql?

Du kanske vill lösa detta på följande sätt:

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

Den sammansatta primärnyckeln (comment_id, user_id) i korsningstabellen comments_votes kommer att förhindra användare från att rösta flera gånger på samma kommentarer.

Låt oss infoga lite data i schemat ovan:

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

Låt oss nu lägga till några röster för användare 1:

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

Ovanstående betyder att användare 1 gav en röst av typ 1 på kommentar 1 och 2.

Om samma användare försöker rösta igen på en av dessa kommentarer, kommer databasen att avvisa den:

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

Om du kommer att använda InnoDB lagringsmotor, är det också klokt att använda främmande nyckel begränsningar på comment_id och user_id fälten i skärningstabellen. Observera dock att MyISAM , standardlagringsmotorn i MySQL, tillämpar inte begränsningar för främmande nyckel:

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;

Dessa främmande nycklar garanterar att en rad i comments_votes kommer aldrig att ha ett comment_id eller user_id värde som inte finns i comments och users tabeller. Främmande nycklar krävs inte för att ha en fungerande relationsdatabas, men de är definitivt viktiga för att undvika trasiga relationer och föräldralösa rader (dvs. referensintegritet ).

Faktum är att referensintegritet är något som skulle ha varit mycket svårt att upprätthålla om du skulle lagra serialiserade arrayer i ett enda databasfält.



  1. Hur man jämför två tabeller i MySQL

  2. Lista alla tabeller som innehåller ett givet kolumnnamn

  3. Använda SQL Server Profiler | SQL Server Performance Felsökning -5

  4. MS Access-korruption Del 1:Vanliga orsaker