我应该为具有类似结构的数据制作单独的表

时间:2014-10-25 13:01:26

标签: mysql sql database database-design

我有很多表包含其"类型/类别/组"的字段。该字段引用其各自的表,例如:

项目 - > item_category,queue - > queue_group,stock - > stock_type,account - > account_type,patient - > patient_type等。所有这些都具有完全相同的表结构。这是一个简单的例子:

+---------------+---------------+
| name          | type          |
+---------------+---------------+
| id            | INT(AI)       |
| name          | VARCHAR(255)  |
| description   | TEXT          |
+---------------+-------------- +

问题是,我应该为每个数据引用创建单独的表(item_category,queue_group,stock_type,account_type,patient_type等),还是应该为所有这些数据创建单个引用表? 例如:

+---------------+---------------+
| name          | type          |
+---------------+---------------+
| id            | INT(AI)       |
| source        | INT           |
| name          | VARCHAR(255)  |
| description   | TEXT          |
+---------------+-------------- +

"来源" field是一个简单的实现示例,用于定义记录所属的表。

目的是使那些项目,类别,队列等数据可以查找他们的"类型/类别/组"在同一个表格中的字段,以获得更少的表格。我应该使用什么以及每种方法的优缺点是什么?

1 个答案:

答案 0 :(得分:1)

一个或多个参考表的选择实际上是相当随意的。遵循规范化规则,“正确”选择是为每个引用表分别有一个表。这是一种非常合理的方法。

将所有名称放在一个表中可能有助于或阻碍性能。假设名称数量为数百甚至几千,那么索引将提供足够的性能 - 单个较大表的性能影响应与多个表的性能影响大致相同。某些查询的性能实际上有可能增益。小型参考表通常比数据页小得多,因此一堆小型表占用的页数大于大型表。再一次,虽然对性能有好处,但从性能角度来看,缓存中几页的丢失通常不会非常明显。

使用单个表的一个重要原因是管理此类代码。例如,如果有国际化计划(支持多种语言),那么将代码放在一个地方非常有帮助。同样,如果您决定对描述做出一揽子决定(例如,不允许使用缩写,或者您希望添加简短描述),将它们放在一个地方是有帮助的。或者,如果您决定将描述从单字节字符更改为国家字符集,那么将它们放在一个位置是一种帮助。

我的结论是,为此目的使用单个引用表与多个引用表对性能的影响最小(除非您处理大量代码)。默认方法是单独的表,在规范化方面是“正确的”方式。但是,如果你有理由在一个地方想要所有的代码,这是非常可行的,也是一个合理的解决方案。