【发布时间】:2012-03-31 01:18:29
【问题描述】:
我目前正在创建一个数据库,它允许用户上传一个出版物,该出版物存储在一个名为 paper 的表中,它存储 paper_id、标题、摘要文件名和 topic_id。我有一个名为 topic 的表,它有 topic_id 和我用于用户选择发布主题的 topic_name。但是我希望用户能够选择至少 3 个主题,这可以使用这个系统吗?我已经没有如何做到这一点的想法,我们将不胜感激
【问题讨论】:
标签: mysql
我目前正在创建一个数据库,它允许用户上传一个出版物,该出版物存储在一个名为 paper 的表中,它存储 paper_id、标题、摘要文件名和 topic_id。我有一个名为 topic 的表,它有 topic_id 和我用于用户选择发布主题的 topic_name。但是我希望用户能够选择至少 3 个主题,这可以使用这个系统吗?我已经没有如何做到这一点的想法,我们将不胜感激
【问题讨论】:
标签: mysql
不要将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(),这会增加执行连接的复杂性,并且在查询时无法使用列索引。
【讨论】:
INSERT INTO paper_topics (paper_id, topic_id) VALUES (<the paperid>, <the topicid>)
<the paperid> 等替换为变量$paperid,它指向您要插入的纸张ID。主题相同。
没问题,可以使用序列化,比如JSON。
【讨论】:
是的,这是可能的(论文和主题分别使用单独的表格)。论文和主题之间会有一对多的关系。
【讨论】: