Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да съхранявам масив в mysql?

Може да искате да се справите с това, както следва:

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

Съставният първичен ключ (comment_id, user_id) в таблицата на пресечната точка comments_votes ще попречи на потребителите да гласуват няколко пъти за едни и същи коментари.

Нека вмъкнем някои данни в горната схема:

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

Сега нека добавим няколко гласа за потребител 1:

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

Горното означава, че потребител 1 е гласувал от тип 1 за коментари 1 и 2.

Ако същият потребител се опита да гласува отново за един от тези коментари, базата данни ще го отхвърли:

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

Ако ще използвате InnoDB устройство за съхранение, също така ще бъде разумно да използвате външен ключ ограничения за comment_id и user_id полета на пресечната таблица. Все пак имайте предвид, че MyISAM , машината за съхранение по подразбиране в MySQL, не налага ограничения на външния ключ:

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;

Тези външни ключове гарантират, че има ред в comments_votes никога няма да има comment_id или user_id стойност, която не съществува в comments и users таблици, респ. Не се изисква външни ключове да имат работеща релационна база данни, но те определено са от съществено значение, за да се избегнат прекъснати връзки и сираци (т.е. интегритет на препратка ).

Всъщност референтната цялост е нещо, което би било много трудно за прилагане, ако трябваше да съхранявате сериализирани масиви в едно поле на базата данни.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql - преместване на редове от една таблица в друга

  2. Как да коригирам:Не е намерен подходящ драйвер за грешка jdbc:mysql://localhost/dbname при използване на пулове?

  3. Драйверът на MySQL ODBC 5.1 връща грешен тип данни към ADODB

  4. Предотвратяване на SQL инжектиране в C

  5. Как да използвате анотации за хибернация, за да добавите индекс към Lob / Clob / tinyblob