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.