在mysql的列中保存多个项目

时间:2012-03-30 17:09:06

标签: mysql

我目前正在创建一个数据库,它允许用户上传一个出版物,该出版物存储在一个名为paper的表中,它存储了paper_id,title,abstract filename和topic_id。我有一个名为topic的表,其中包含topic_id和topic_name,我用它为用户选择出版物的主题。但是我希望用户能够选择至少3个主题,这是否可以使用此系统?我已经完成了如何做到这一点的想法,非常感谢帮助

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)

是的,这是可能的(使用单独的表格分别为论文和主题)。论文和主题之间会有一对多的关系。

http://www.databaseprimer.com/relationship_1tox.html