列数太多了多少列?

时间:2010-07-06 08:00:11

标签: database database-design database-performance

我注意到很多人在这里列出了20多个(我已经看到多达55个)列的表。现在我不假装成为数据库设计专家,但我总是听说这是一个可怕的做法。当我看到这一点时,我通常建议分成两个具有一对一关系的表:一个包含最常用的数据,另一个包含最少使用的数据。虽然同时存在性能问题(更少的JOIN等)。所以我的问题是:

当涉及到真正的大规模数据库时,拥有大量列实际上是否有优势,尽管这通常会导致许多NULL值?

哪个更受性能影响:很多列有很多NULL,或者有很多JOIN的列?

10 个答案:

答案 0 :(得分:51)

表的设计取决于它需要存储的实体。如果所有数据都属于一起,则50列(甚至100)可能是正确的事情。

只要表格为normalized,除了数据库功能和优化需求之外,没有关于大小的经验法则。

答案 1 :(得分:7)

我同意Oded的观点。我看过其中有500列的表格,其中的所有列都在正确的位置。只要考虑一下人们可能想要存储的关于日常物品的事实数量,你很快就会明白为什么。

如果证明选择所有这些列不方便,或者当您只对其中的一小部分感兴趣时指定要选择哪些列,您可能会发现定义视图是值得的。

答案 2 :(得分:7)

  

列数太多了多少列?

如果您认为不再有意义,或者添加其他专栏是正确的。

一般取决于申请。

答案 3 :(得分:2)

odbc的角色限制为8000 ....所以这是一个物理限制,超出这个限制会让事情变得非常令人沮丧。

我在一张有138列的桌子上工作..它写得非常糟糕,可以归一化。虽然这个数据库似乎是有人想知道为什么数据库设计中有惯例并决定一次测试它们。

当您进入数据仓库和报告服务器时,具有非常宽的扁平表是相当常见的。它们的速度要快得多,这意味着您不必将数据库entirley存储在ram中以提高性能。

答案 4 :(得分:1)

根据我的经验,最好少加入,因为那些往往经常发生,特别是在大数据库中。只要您的数据库表被设计为存储单个实体(学生,教师等),这应该没问题。因此,稍后将在代码中将其表示为对象。因此,如果将实体拆分为多个表,则必须使用多个连接才能在以后填充对象。此外,如果您使用ORM生成数据访问层(例如.Net中的Linq),将为每个表生成单独的类(当然,它们之间仍然存在关系),这将更难使用。

另一件事是您可以指定在查询中返回哪些列,这将减少传递给您的应用程序的数据,但如果您需要来自另一个表的单个列,则必须进行连接。在大多数情况下,由于您拥有如此多的列,因此存储在数据库中的大量数据的可能性很高。所以这个连接比NULL更容易受到伤害。

我参与的每个项目都不同,所以你应该找到每个故事的平衡点。

答案 5 :(得分:1)

列太多导致很多空(邪恶)和表映射到的一个笨重的对象。这会损害IDE中的可读性并妨碍维护(增加开发成本)。如果在某些情况下需要快速读取,请使用非规范化表格,例如仅用于报告或查询(搜索“CQRS”模式)。是“Person”有一百万个属性,但您可以分解这些单一表(设计先于规范化)以匹配较小的实体(“地址”,“电话”,“爱好”),而不是为每个新用例添加新列。具有较小尺寸的物体(和桌子)带来了许多优点;它们支持单元测试,OOP和SOLID实践。

此外,由于它涉及聚集众多列以避免连接,我认为通过索引维护来避免连接的性能提升,假设读取和写入的典型工作负载。为了读取性能而在字段上添加索引可能表示需要将这些字段移动到它们自己的表中。

答案 6 :(得分:0)

  

这更受欢迎:   很多有很多NULL的列,或者   有很多JOIN的列数较少?

这完全取决于您存储的数据,您制作的索引等。在不知道你存储的是什么的情况下,没有人可以确保你比另一个更好。通常,规范化规则将“强制”您将数据分离到不同的表和用户FKeys(如果您有大表)但我不同意它总是比一个大表执行得更好。您可以在数十个查询中以6-7级联接结束,这些联接有时会导致错误,因为在更大的查询中有更多机会在简单的查询中创建错误。

如果您发布了一些您正在做的事情的要求,我们可以帮助您正确设计数据库。

答案 7 :(得分:0)

它还高度依赖于您桌子的用例。如果你想优化它以便阅读,那么最好将它们放在一个表中。

在NO-SQL世界中(例如cassandra / hbase)对列数没有限制,实际上它被认为是一个很好的做法,有很多列。这也来自它的存储方式(无间隙)。值得一试。

答案 8 :(得分:-2)

什么业务需要在任何数据集中需要60多个列,更不用说TSQL表了?如果有这样的业务需求,则需要进行数据透视,并且列应为行。例如,在采矿业中,分析中可能进行600次不同的测量。每个度量的名称可以是列名称。但是,为什么要创建一个具有600列和行的测量值的表?一位地质学家也许每天都会测量该矿山,并在一行中填写600列的日志。在我看来,这就像地质学家会失去理智,而他找不到足够长的纸张。也许可以进行滚动,但是随后他将不得不展开该卷并将其重新卷回。

答案 9 :(得分:-3)

使用单个表可以避免在查询时使用连接,这取决于列是相同实体还是不同实体。

例如,假设您正在为工作流程进行数据库设计,其中某些字段将由初级工作人员编辑,而某些字段将由高级工作人员编辑。在这种情况下,最好将所有列放在一个表中。