Nie przechowuj topic_id
w paper
stół. Zamiast tego utwórz kolejną znormalizowaną tabelę (wiele do wielu), która łączy topic_id
do 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)
);
Umożliwi to przechowywanie tylu tematów na papierze, ile potrzeba.
Aby pobrać tematy artykułu, użyj:
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>
Prawie nigdy nie jest dobrym pomysłem, aby próbować przechowywać wiele wartości w jednej kolumnie (takich jak rozdzielona przecinkami lista topic_id
w paper
stół). Powodem jest to, że aby wykonać zapytanie, musisz użyć FIND_IN_SET()
co zwiększa złożoność wykonywania złączeń i uniemożliwia wykorzystanie indeksu kolumn podczas zapytań.