【问题标题】:Sql Design QuestionSql 设计问题
【发布时间】:2011-01-19 20:08:17
【问题描述】:

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

或者

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

我使用的是 SQL Server 2005。将来会迁移到 2008。

只有20列是varchar、rest smallint、smalldate

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

该表将容纳〜十亿行

请发表评论。

【问题讨论】:

标签: sql database-design


【解决方案1】:

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

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

所以这在某种程度上取决于您要建模的内容。

【讨论】:

  • +1 用于描述数据...如果我们知道有问题的列,我们可以就重组提供更好的建议(如果需要)
  • 添加了有关数据和类型的更多信息
  • @Projapati:您似乎不愿意提供太多细节。说这些列“存储它所属行的不同属性”并没有告诉我你正在存储的数据类型。如果你想提供一些例子,我可以告诉你我的想法。但我还需要更多。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2010-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 2010-12-29
        • 1970-01-01
        相关资源
        最近更新 更多