Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Segurando vários itens em uma coluna no mysql


Não armazene topic_id no paper tabela. Em vez disso, crie outra tabela normalizada (muitos para muitos) que vincule topic_id para 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)
);

Isso permitirá que você armazene quantos tópicos por artigo forem necessários.

Para recuperar os tópicos de um artigo, use:
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>

Nunca é uma boa idéia tentar armazenar vários valores em uma coluna (como uma lista separada por vírgulas de topic_id no paper tabela). A razão é que, para consultar, você deve usar FIND_IN_SET() o que aumenta a complexidade da execução de junções e impossibilita a utilização de um índice de coluna ao consultar.