mysql - MySQL 中的元表

标签 mysql sql database database-design relational-database

我正在重写一个当前链接到大约 1GB 大小的 MySQL 数据库的系统。有数十万篇文章,每篇都有贡献者列表(想想 Wiki 风格)。我尚未获得对现有数据库架构的访问权限,但在等待期间我一直在集思广益。

基本上,我想知道是否有一个 article_contributors 表是处理此问题的有效方法,或者是否有更好的方法来处理这种情况。考虑到大约有 200,000 篇文章,如果每篇文章有 5 位撰稿人,元表中就有 1,000,000 行。

最佳答案

我将其称为一对多表,而不是“元”表。或者多值属性。

将贡献者存储在单独的表中,每行一个,是设计关系数据库的正确方法。可能有其他方式来存储数据,但它们不是关系型的。

考虑我对 Is storing a delimited list in a database column really that bad? 的回答将贡献者作为列表存储在文章表中会导致许多常见的 SQL 查询中断或变得非常低效。如果您需要对这些数据进行各种查询,您会感谢自己以规范化的方式存储它。

另一方面,如果您从不查询除了贡献者列表之外的任何东西作为一个不可分割的单元,那么为什么不将其非规范化存储(作为列表)?这也是一个有效的选择 - 但这取决于您将如何使用表格。

顺便说一句,按照某些人的标准,100 万行并不是一个大型 MySQL 数据库。这周我要为一位拥有 9 亿行表的客户提供建议。

关于mysql - MySQL 中的元表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26410730/

相关文章:

java - 以伪随机顺序选择表记录

linux - 使用变量作为非sudo用户+创建数据库

database - 错误 : Could not find or load main class org. h2.tools.RunScript

php - 如何在mysql数据库中存储拼音

php - 如何在预定时间运行 PHP 脚本

SQL连接两个表以从第二个表中拆分电子邮件

mysql - 如何从这组给定的值中选择第一次

mysql - SELECT 语句之间有一个逗号

使用 "before"触发器插入后的 MySQL PDO LastInsertID 返回错误值

android - SQLite 中单击按钮即可动态创建表