表有很多列

时间:2009-06-18 00:15:22

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

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

PS - 我的桌子已经处于第3范式。

PS2 - 我正在使用MS Sql Server 2008。

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

5 个答案:

答案 0 :(得分:13)

80列真的不是那么多......

从性能的角度来看,我不担心。拥有单个表(如果您通常使用标准操作中的所有数据)可能会优于具有1-1关系的多个表,尤其是在您正确编制索引时。

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

答案 1 :(得分:6)

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

答案 2 :(得分:3)

采取另一种方法,从维护&测试的观点,如果你说你在一个表中有3个不同的数据组,尽管它们都具有相同的唯一ID(例如member_id),将它拆分成单独的表可能是有意义的。

如果您需要添加字段来说明成员信息表的个人资料详细信息部分,您是否真的想冒险重新测试偏好设置&帐户详细说明了您应用的元素,以确保不会产生影响。

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

不是一个SQL /性能答案,但可能需要从DB&应用程序设计pov

答案 3 :(得分:1)

取决于这些列是什么。如果你有像Colour1,Colour2,Colour3这样的硬编码重复字段,那么它们就是子表的候选者。我的一般经验法则是,如果有多个相同类型的字段(颜色),那么您也可以编码其中的N个,而不是固定数字。

罗布。

答案 4 :(得分:1)

如果你说会员信息,那么<1-1>可能会更容易; Member_Pref; Member_Profile。如果你想要大量的varchar(255),那么拥有太多的列可以使它运行,因为你可能会超过行数限制,这只会让它太混乱。

只要确保你有正确的forgein键约束和那么多,所以每个表中总有一行具有相同的member_id