【问题标题】:Holding multiple items in a column on mysql在mysql的一列中保存多个项目
【发布时间】:2012-03-31 01:18:29
【问题描述】:

我目前正在创建一个数据库,它允许用户上传一个出版物,该出版物存储在一个名为 paper 的表中,它存储 paper_id、标题、摘要文件名和 topic_id。我有一个名为 topic 的表,它有 topic_id 和我用于用户选择发布主题的 topic_name。但是我希望用户能够选择至少 3 个主题,这可以使用这个系统吗?我已经没有如何做到这一点的想法,我们将不胜感激

【问题讨论】:

    标签: mysql


    【解决方案1】:

    不要将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>
    

    尝试将多个值存储在一个列中几乎不是一个好主意(例如paper 表中topic_id 的逗号分隔列表)。原因是为了查询它,您必须使用FIND_IN_SET(),这会增加执行连接的复杂性,并且在查询时无法使用列索引。

    【讨论】:

    • 谢谢,如何在 paper_topics 表中添加论文及其主题?
    • @NickPocock INSERT INTO paper_topics (paper_id, topic_id) VALUES (&lt;the paperid&gt;, &lt;the topicid&gt;)
    • 有没有办法用php做到这一点?
    • @NickPocock 与 PHP 中的任何其他查询一样。将&lt;the paperid&gt; 等替换为变量$paperid,它指向您要插入的纸张ID。主题相同。
    【解决方案2】:

    没问题,可以使用序列化,比如JSON

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2014-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-07
        • 1970-01-01
        相关资源
        最近更新 更多