8

我有一个大约 1,000 条记录的表。其中大约一半将使用一组包含某些特征的字段。大约有10个相关领​​域。另一半记录不需要填写该信息。

该表是数据库的中心,将承担大部分操作。虽然只有大约 1,000 条记录,但数量并不多。

存储数据库的硬件又旧又慢(旋转硬盘驱动器不是 SSD ......)所以我想要一个相当优化的结构来充分利用它。显然,由于空白字段而单独增加的数据库大小并不是主要问题,但如果它减慢查询速度,那就不好了。

我想我应该描述一下设置。目前是 Access 2007 客户端和 Access 后端,不过后端很快会迁移到 SQL Server。目前后端位于主服务器机架上,但当移动到 SQL Server 时,它将获得自己的旧服务器机架。

那么我应该制作一个单独的表来存储上述一组特征,还是应该保持原样?

4

3 回答 3

6

将可选字段放入单独的表中然后使用连接的查询开销对大小或数据管理没有太大好处。特别是如果它像您的示例中那样是一对一的对于大小,可选字段将 NULL 不会对您产生太大影响。是的,75% 是一个很好的随机阈值,当你应该开始移出东西时,但即便如此,你实际上并没有通过移出可选字段来规范任何东西(如果它们与记录是一对一的,你将永远将其与主记录一起获取)。

值得注意的是:对于大多数数据库,在单个查询中获取大行比几个小查询要好……以防您以后有在单独查询中获取第二个表中的可选数据的冲动。不过,在 Access 2007 中,这可能不太重要。

并且无论您是否将这些可选字段移出,为您可能在where/ having/中使用的那些字段添加索引join

于 2012-08-27T07:45:46.080 回答
1

你所说的我的印象是你应该使用单独的表格。您要表示的依赖关系和数据完整性的需求(“业务规则”)应确定任何属性进入哪个表。

在你的情况下,听起来你有两种事实要表达。这些事实类型具有不同的属性集,因此它们属于不同的表。如果您将两种不同的事实类型组合到一个表中并使一组属性可以为空,那么您可能会损害数据完整性:即,当业务规则不需要此类值时允许某些属性的值,而当业务规则时允许某个值不存在事实上需要它。

有关回答此问题的更正式方式,请参阅第五范式和正交设计原理。如果您还不了解这些设计原则,那么您应该熟悉它们。

于 2012-08-27T09:40:51.393 回答
0

垂直分区对于大型数据集是有意义的,可以提高缓存的效率。即使在相当旧的硬件上,1000 行也不符合“大”的条件。

因此,除非有其他原因需要重新设计此表(您没有合并查找,不是吗?),否则您可以继续。

于 2012-08-27T10:31:24.057 回答