Sla topic_id
niet op in het paper
tafel. Maak in plaats daarvan een andere genormaliseerde (veel-op-veel) tabel die topic_id
. linkt naar 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)
);
Hiermee kunt u zoveel onderwerpen per papier opslaan als nodig is.
Om de onderwerpen voor een paper op te halen, gebruik:
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>
Het is bijna nooit een goed idee om te proberen meerdere waarden in één kolom op te slaan (zoals een door komma's gescheiden lijst van topic_id
in het paper
tafel). De reden is dat je, om ertegen te kunnen zoeken, FIND_IN_SET()
wat de complexiteit van het uitvoeren van joins verhoogt en het onmogelijk maakt om een kolomindex te gebruiken bij het opvragen.