【问题标题】:Table with a lot of columns有很多列的表
【发布时间】:2023-03-28 15:04:01
【问题描述】:

如果我的表有大量列(超过 80 列),我应该将其拆分为具有 1 对 1 关系的多个表还是保持原样?为什么?我主要关心的是性能。

PS - 我的表已经是第三范式了。

PS2 - 我使用的是 MS Sql Server 2008。

PS3 - 我不需要一次访问所有表数据,而是在该表中有 3 种不同类别的数据,我分别访问它们。它类似于:会员偏好、会员帐户、会员资料。

【问题讨论】:

  • 在通常情况下你需要全部 80 列吗?这些属性是否有与您的用例对应的逻辑组?
  • 是的,有 3 个逻辑组:prefereces、帐户详细信息、个人资料详细信息。
  • @docgnome 看起来您链接到的问题是关于根据行(数据)拆分表...这个问题是关于根据列拆分表。

标签: sql sql-server-2008 asp.net-3.5


【解决方案1】:

80 列确实不算多...

从性能的角度来看,我不会担心它。拥有一个表(如果您通常在标准操作中使用所有数据)可能会胜过具有 1-1 关系的多个表,尤其是在您正确索引的情况下。

不过,从维护的角度来看,我会(可能)担心这一点。单个表中的数据列越多,该表在您的宏伟计划中的作用就越难以理解。此外,如果您通常只使用一小部分数据,并且并不总是需要全部 80 列,则拆分为 2 个以上的表可能有助于提高性能。

【讨论】:

    【解决方案2】:

    关于性能问题 - 这取决于。行越大,一次读取可以从磁盘读取的行越少。如果您有很多行,并且您希望能够非常快速地从表中读取核心信息,那么可能值得将其拆分为两个表 - 一个只有可以快速读取的核心信息的小行,以及一个额外的表格,其中包含您很少使用的所有信息,您可以在需要时查找。

    【讨论】:

    • 我没有从这个角度考虑过,我完全同意你的说法。但是在我的情况下,我将始终只检索由主键指定的单行。
    • 如果您一次只检索一行,那么您可能不会遇到性能问题。不过,您可能出于非性能原因想要拆分它。即,如果经常有许多字段未被使用,您可以通过将它们从表中移到另一个表中来节省大量磁盘空间,并且只有在您拥有这些列的信息时才创建行。
    【解决方案3】:

    从维护和测试的角度来看,如果您说您在一个表中有 3 个不同的数据组,尽管它们都具有相同的唯一 ID(例如 member_id),那么将其拆分可能是有意义的到单独的表中。

    如果您需要添加字段来说明成员信息表的个人资料详细信息部分,您是否真的要冒必须重新测试应用程序的首选项和帐户详细信息元素以确保不敲门的风险影响。

    如果您想跟踪最后一个用户 ID/时间戳以更改成员数据,也可用于审计跟踪。如果管理应用程序允许单独更新首选项/帐户详细信息/个人资料详细信息,那么将它们放在单独的表中以便更轻松地跟踪更新是有意义的。

    不完全是 SQL/Performance 答案,但也许可以从 DB 和应用程序设计角度来看一些东西

    【讨论】:

      【解决方案4】:

      取决于这些列是什么。如果您有硬编码的重复字段,如 Colour1、Colour2、Colour3,那么这些是子表的候选者。我的一般经验法则是,如果有多个相同类型的字段(颜色),那么您最好为其中的 N 个进行编码,而不是一个固定的数字。

      罗伯。

      【讨论】:

      • 不。我没有这样的专栏。尊重第三范式。
      【解决方案5】:

      1-1 可能会更容易,如果你有说 Member_Info;会员偏好;成员_个人资料。如果你想要大量的 varchar(255),列太多可能会导致它运行,因为你可能会超过行大小限制,这只会让它太混乱。

      只要确保你有正确的 forgein key 约束等等,所以每个表中总是有 1 行具有相同的 member_id

      【讨论】:

        猜你喜欢
        • 2015-08-11
        • 1970-01-01
        • 2019-08-28
        • 2017-09-12
        • 2021-10-18
        • 1970-01-01
        • 2022-01-21
        • 2019-08-18
        • 2016-05-09
        相关资源
        最近更新 更多