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

Sosteniendo múltiples elementos en una columna en mysql

No almacenar topic_id en el paper mesa. En su lugar, cree otra tabla normalizada (muchos a muchos) que vincule topic_id a paper_id .

/* Each paper can exist in this table as many times as necessary for all its topics */
CREATE TABLE paper_topics (
  paper_id INT NOT NULL,
  topic_id INT NOT NULL,
  FOREIGN KEY (paper_id) REFERENCES paper (paper_id),
  FOREIGN KEY (topic_id) REFERENCES topic (topic_id),
  PRIMARY KEY (paper_id, topic_id)
);

Esto le permitirá almacenar tantos temas por trabajo como sea necesario.

Para recuperar los temas de un artículo, utilice:

SELECT 
  paper.*,
  topic_name
FROM 
  paper
  LEFT JOIN paper_topics ON paper.paper_id = topic.paper_id
  LEFT JOIN topic ON topic.topic_id = paper_topic.topic_id
WHERE paper.paper_id = <some paper id value>

Casi nunca es una buena idea intentar almacenar varios valores en una columna (como una lista separada por comas de topic_id en el paper mesa). La razón es que para consultarlo, debe usar FIND_IN_SET() lo que aumenta la complejidad de realizar uniones y hace que sea imposible utilizar un índice de columna al realizar consultas.