Non memorizzare topic_id
nel paper
tavolo. Invece, crea un'altra tabella normalizzata (molti-a-molti) che collega topic_id
a 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)
);
Ciò ti consentirà di archiviare tutti gli argomenti necessari per foglio.
Per recuperare gli argomenti per un paper, usa:
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>
Non è quasi mai una buona idea tentare di memorizzare più valori in una colonna (come un elenco separato da virgole di topic_id
nel paper
tavolo). Il motivo è che per eseguire query su di esso, è necessario utilizzare FIND_IN_SET()
che aumenta la complessità dell'esecuzione dei join e rende impossibile l'utilizzo di un indice di colonna durante l'esecuzione di query.