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()
जो जॉइन करने की जटिलता को बढ़ाता है और क्वेरी करते समय कॉलम इंडेक्स का उपयोग करना असंभव बना देता है।