Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql设计问题_Sql_Database Design - Fatal编程技术网

Sql设计问题

Sql设计问题,sql,database-design,Sql,Database Design,我有一个25列的表,其中20列可以为某些(30-40%)行设置空值。 现在,拥有20个空列的行的成本是多少?这样行吗 或 使用另一个表来存储这20列并向第一个表中添加一个ref是一种好的设计吗? 这样,只有当有值时,我才会写入第二个表 我正在使用SQLServer2005。将在未来迁移到2008年 只有20列是varchar、rest smallint和smalldate 我存储的内容: 这些列存储它所属行的不同属性。这些属性有时可以为null 这张桌子可容纳约10亿行 请评论。您应该描述您存储

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

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

我正在使用SQLServer2005。将在未来迁移到2008年

只有20列是varchar、rest smallint和smalldate

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

这张桌子可容纳约10亿行


请评论。

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

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


因此,这在某种程度上取决于您建模的内容。

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

这取决于数据类型(40个可为NULL的int基本上与40个不可为NULL的int占用相同的空间,而不考虑其值)。在SQL Server中,使用普通技术,空间是相当有效的。在2008年,您确实具有稀疏特性

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


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

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

您使用的是哪台数据库服务器?SQL Server 2008支持稀疏列的概念,它以最小的影响支持您的场景。看看这个答案:您考虑过表继承吗?只是一个旁注:如果您的表不是那么大(比方说<1百万行),它在存储方面不会有多大影响,而单表解决方案会稍微快一点。用于描述数据的+1。。。如果我们知道有问题的栏目,我们可以就重组提供更好的建议(如果需要的话)。添加更多关于数据和数据的信息type@Projapati当前位置你似乎不愿提供太多细节。说这些列“存储它所属行的不同属性”并不能说明存储的数据类型。如果你想举一些例子,我可以告诉你我的想法。但我还需要更多。