Sql设计问题

时间:2011-01-19 00:18:38

标签: sql database-design

我有一个包含25列的表,其中20列可以为某些(30-40%)行提供空值。 现在拥有20个空列的行的成本是多少?这样好吗?

使用另一个表来存储这20个列并在第一个表中添加ref是一个很好的设计吗? 这样我只会在有值时才写入第二个表。

我正在使用SQL Server 2005.将来会迁移到2008年。

只有20列是varchar,rest smallint,smalldate

我要存储的内容:   这些列存储它所属行的不同属性。这些属性有时可能为空。

该表将容纳数十亿行

请评论。

4 个答案:

答案 0 :(得分:2)

您应该描述要存储的数据类型。听起来有些列应该移到另一个表中。

例如,如果您有多个列代表同一类型数据的多个列,那么我会说将其移动到另一个表另一方面,如果您需要这么多列来描述不同类型的数据,那么你可能需要保持原样。

所以这取决于你的建模。

答案 1 :(得分:2)

在某些情况下,某些列是必需的吗?如果是这样,那么也许你应该使用某种形式的继承。例如,如果这是关于医院中患者的信息,并且有一些数据仅对女性患者有意义,那么您可以创建一个包含这些列的FemalePatients表。那些必须始终为女性患者收集的列可以在该单独的表中声明NOT NULL

答案 2 :(得分:2)

它取决于数据类型(40个可空的int将基本上占用与40个不可为空的int相同的空间,无论值如何)。在SQL Server中,使用普通技术,空间相当有效。在2008年,您确实拥有SPARSE功能。

如果您使用可选的1:1关系垂直拆分表,则可以使用视图包装这两个表,并在视图上添加触发器以使其可更新并隐藏底层实现。

因此有很多选项,其中许多选项可以在您看到数据加载和行为后实现。

答案 3 :(得分:1)

根据您拥有的不同属性集创建表。因此,如果您有一些数据,其中某些列不适用,那么将数据放在没有这些列的表中是有意义的。尽可能避免在多个表中重复相同的属性。确保你的数据至少在Boyce-Codd / 5th Normal Form中,你不会出错。