sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo almacenar una matriz en mysql?

Es posible que desee abordar esto de la siguiente manera:

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

La clave principal compuesta (comment_id, user_id) en la tabla de intersección comments_votes evitará que los usuarios voten varias veces sobre los mismos comentarios.

Insertemos algunos datos en el esquema anterior:

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

Ahora agreguemos algunos votos para el usuario 1:

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

Lo anterior significa que el usuario 1 dio un voto de tipo 1 en los comentarios 1 y 2.

Si el mismo usuario intenta votar nuevamente en uno de esos comentarios, la base de datos lo rechazará:

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

Si va a utilizar InnoDB motor de almacenamiento, también será aconsejable usar clave externa restricciones en el comment_id y user_id campos de la tabla de intersección. Sin embargo, tenga en cuenta que MyISAM , el motor de almacenamiento predeterminado en MySQL, no impone restricciones de clave externa:

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;

Estas claves foráneas garantizan que una fila en comments_votes nunca tendrá un comment_id o user_id valor que no existe en los comments y users tablas, respectivamente. No se requieren claves foráneas para tener una base de datos relacional que funcione, pero definitivamente son esenciales para evitar relaciones rotas y filas huérfanas (es decir, integridad referencial ).

De hecho, la integridad referencial es algo que habría sido muy difícil de aplicar si tuviera que almacenar arreglos serializados en un solo campo de base de datos.