我目前正在创建一个数据库,它允许用户上传一个出版物,该出版物存储在一个名为paper的表中,它存储了paper_id,title,abstract filename和topic_id。我有一个名为topic的表,其中包含topic_id和topic_name,我用它为用户选择出版物的主题。但是我希望用户能够选择至少3个主题,这是否可以使用此系统?我已经完成了如何做到这一点的想法,非常感谢帮助
答案 0 :(得分:8)
不要将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()
,这会增加执行连接的复杂性,并且在查询时无法使用列索引。
答案 1 :(得分:0)
没问题,您可以使用序列化,例如JSON。
答案 2 :(得分:0)
是的,这是可能的(使用单独的表格分别为论文和主题)。论文和主题之间会有一对多的关系。