我有一个包含25列的表,其中20列可以为某些(30-40%)行提供空值。 现在拥有20个空列的行的成本是多少?这样好吗?
或
使用另一个表来存储这20个列并在第一个表中添加ref是一个很好的设计吗? 这样我只会在有值时才写入第二个表。
我正在使用SQL Server 2005.将来会迁移到2008年。
只有20列是varchar,rest smallint,smalldate
我要存储的内容: 这些列存储它所属行的不同属性。这些属性有时可能为空。
该表将容纳数十亿行
请评论。
答案 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中,你不会出错。