Gem ikke topic_id
i paper
bord. Opret i stedet en anden normaliseret (mange-til-mange) tabel, som linker topic_id
til 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)
);
Dette giver dig mulighed for at gemme så mange emner pr. papir som nødvendigt.
For at hente emnerne til et papir, skal du bruge:
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>
Det er næsten aldrig en god idé at forsøge at gemme flere værdier i én kolonne (såsom en kommasepareret liste over topic_id
i paper
bord). Årsagen er, at for at forespørge imod det, skal du bruge FIND_IN_SET()
hvilket øger kompleksiteten ved at udføre joinforbindelser og gør det umuligt at bruge et kolonneindeks ved forespørgsler.