Mysql
 sql >> Base de données >  >> RDS >> Mysql

Conserver plusieurs éléments dans une colonne sur mysql

Ne stockez pas topic_id dans le paper table. Au lieu de cela, créez une autre table normalisée (plusieurs à plusieurs) qui relie topic_id à 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)
);

Cela vous permettra de stocker autant de sujets par article que nécessaire.

Pour récupérer les sujets d'un article, utilisez :

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>

Ce n'est presque jamais une bonne idée d'essayer de stocker plusieurs valeurs dans une colonne (comme une liste séparée par des virgules de topic_id dans le paper table). La raison en est que pour l'interroger, vous devez utiliser FIND_IN_SET() ce qui augmente la complexité de l'exécution des jointures et rend impossible l'utilisation d'un index de colonne lors de l'interrogation.