Не съхранявайте topic_id
в paper
маса. Вместо това създайте друга нормализирана (много към много) таблица, която свързва 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)
);
Това ще ви позволи да съхранявате толкова теми на хартия, колкото е необходимо.
За да извлечете темите за статия, използвайте:
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>
Почти никога не е добра идея да се опитвате да съхранявате множество стойности в една колона (като разделен със запетая списък на topic_id
в paper
таблица). Причината е, че за да направите заявка срещу него, трябва да използвате FIND_IN_SET()
което засилва сложността на извършването на свързвания и прави невъзможно използването на индекс на колона при запитване.