我应该将可选记录属性放在单独的表中吗?

时间:2012-08-27 04:49:37

标签: database ms-access database-design ms-access-2007 normalization

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

此表是数据库的核心,将占用大部分操作。虽然只有大约1,000条记录,但它并不多。

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

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

那么我应该创建一个单独的表来存储上述特征集,还是应该保留原样?

3 个答案:

答案 0 :(得分:4)

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

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

无论您是否移出这些可选字段,都可以为where / having / join中可能使用的字段添加索引。

答案 1 :(得分:1)

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

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

有关更正式的回答方法,请参阅第五范式和正交设计原理。如果您还没有意识到这些设计原则,那么您应该熟悉它们。

答案 2 :(得分:0)

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

除非有其他理由重新设计此表(你没有merge lookups不是吗?),你很高兴。