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>
1つの列に複数の値を格納しようとすることは決して良い考えではありません(topic_id
のコンマ区切りのリストなど)。 paper
テーブル)。その理由は、それに対してクエリを実行するには、 FIND_IN_SET()
これにより、結合の実行が複雑になり、クエリ時に列インデックスを利用できなくなります。