我正在重写一个当前链接到大小约为1GB的MySQL数据库的系统。有成千上万的文章,每篇文章都有一个贡献者列表(想想维基风格)。我还没有获得现有数据库架构的访问权限,但在等待的时候我已经集思广益了。
基本上,我想知道的是,如果有article_contributors
表是一种有效的处理方法,或者有更好的方法来处理这种情况。考虑到大约有200,000篇文章,如果每个文章有5个贡献者,则元表中的1,000,000行。
答案 0 :(得分:1)
我称之为一对多表,而不是“元”表。或者是多值属性。
将贡献者存储在单独的表中,每行一个,是设计关系数据库的正确方法。可能存在其他方式来存储数据,但它们不是关系数据。
考虑我对Is storing a delimited list in a database column really that bad?的回答将文章中的贡献者存储为文章表中的列表会导致许多常见的SQL查询中断或变得非常低效。如果您需要对这些数据进行各种查询,您会感谢自己以标准化的方式存储它。
另一方面,如果你从不查询除了作为不可分割单位的贡献者列表之外的任何内容,那么为什么不将它存储为非规范化(作为列表)?这也是一个有效的选择 - 但这取决于你将如何使用该表。
顺便说一下,根据某些人的标准,100万行不是一个大的MySQL数据库。这个星期我正在建议一个拥有9亿行表的客户。
答案 1 :(得分:1)
一个有趣的问题!
您将需要查看架构以获得有关此问题的直接答案。这是因为该模式可能体现了参考书目专家(参考图书管理员等)制定的一些核心决策。
如果你尝试使用连接表(articles_contributors
),这样你可以避免在她为多篇文章做出贡献时多次列出给定的贡献者,你隐含地声明你可以创建一个规范的贡献者列表,每个不同的人contributor_id
。
在书目和图书馆学的世界里,这种名单被称为“受控词汇”,它由“权威”控制。 (阅读:http://en.wikipedia.org/wiki/Authority_control)也就是说,某个组织有责任决定这个“简史密斯”是否与“简史密斯”不同。对于人们而言,这是非常难以做到的。
有关相对简单的受控词汇表的示例,请参阅“北美行业分类系统”(NAICS)。这有针对每种不同行业的代码。 http://www.census.gov/eos/www/naics/它由三个国家的国家委员会控制。许多涵盖行业的书目数据库都将这些术语作为对其内容进行分类的方法之一。
您即将接管的系统设计人员将对这些类型的受控词汇表做出决策。他们会为贡献者提供一个吗?你可以拭目以待,或者你可以问。但有一件事是肯定的:如果你在自己的权威下创造那种受控制的词汇,那么书目设计师就不会太高兴。
美国国会图书馆并不试图创建受控制的作者和贡献者名单。
修改强>
如果您确实有明确的贡献者列表,最好按照建议创建连接表articles_contributors
。您应该考虑以下列:
article_id primary key
contributor_id primary key
role primary key values like ("author", "illustrator", "editor", etc)
order 1, 2, 3 so contributors can be listed in proper order.
contact 1 or 0 indicating whether readers should contact this author for more info.