【问题标题】:A table for each kind of object, or a single table with many columns: which is fastest?每种对象的表,或具有多列的单个表:哪个最快?
【发布时间】:2011-12-06 08:07:16
【问题描述】:

我必须在一个数据库中存储四种对象。这些对象具有相同的属性:

  • 名称 (varchar2)。
  • 说明 (varchar2)。
  • 文件(二进制 blob)。

也许我可以使用一个表来存储这些对象,添加一个列来识别对象的种类,但我需要存储很多对象(> 1,000,000 或更多)。

我的问题是哪种方案更能提高性能?存储所有对象的表或每种对象的表。

我将使用 SQL Server 2005 或 2008。

【问题讨论】:

    标签: sql-server database-design


    【解决方案1】:

    纯卷并不是将相似对象拆分为不同表的好理由,还有其他更好的方法来提高性能、索引、表分区。

    在表中添加类型列,维护和查询会更容易。

    【讨论】:

      【解决方案2】:

      如果您只有四种不同类型的对象,并且它们的大小和数量都大致相同,那么打破桌子不会做太多事情。您可以将表扫描的成本降低四倍,但无论如何您都不想进行全扫描。你会经过一个索引,然后就没有关系了。

      如果这四种类型在大小、数量或访问频率上完全不同,则将它们分开可能会使规模较小、数量较少的人受益。更频繁地查询的。但这需要很大的偏差才能在使用索引时对性能产生影响。

      如果您决定拆分表,则跨多种类型进行查询或稍后添加新类型会变得更加困难。

      另一方面,如果您从不需要跨多个类型进行查询(并且名称在所有对象类型中不是唯一的),则无需将它们保存在单个表中。

      我注意到您没有“类型”列。如果您需要区分这四种类型,您可能应该拥有一个。还是只看名字就可以了?

      名称是主键吗? 表大小对主键查找的性能影响很小。

      【讨论】:

      • 不,它将有一个列 id_object 作为主键。
      • 关于类型,该列将是一个名为 types 的表的外键。
      • 我想您只能通过 id_object 查找内容?那么你应该擅长一张大表和主键索引。
      • 是的,我将使用 id_object 进行查找。谢谢!
      • 表大小对主键查找的性能影响很小。你会“按名称或描述搜索”吗?
      【解决方案3】:

      这些对象是真正相同的还是只是巧合相似?通过将它们混为一谈,您可能会做出不合理的假设。稍后,当您决定其中一种对象类型需要其他对象不需要的其他属性时,您可能最终会执行相当大的重构任务或最终得到稀疏填充的行。

      还要怀疑任何称为“描述”的字段,这是一种难闻的气味,表明建模不足。它往往被用作缺失属性的全部捕获。我不提倡建模,但很多有用的结构可以这样被埋没。例如,我曾经不得不向产品数据库添加一些功能,该数据库基于“区域批准”进行了一些处理。但是没有领地认可属性???在与用户交谈后,很明显他们使用他们设计的特殊代码系统将领土数据存储在描述字段中。

      【讨论】:

        【解决方案4】:

        创建一个主查找表,其中包含不同类型对象的名称和 ID。然后使用 id 而不是 name 创建依赖表。您可以拥有一个表并根据对象类型(id)对其进行水平分区。

        使用整数 id 而不是名称的好处是您可以在其上创建索引,这将大大加快您的查询速度(特别是您提到的表大小)

        【讨论】:

          【解决方案5】:

          您的问题是关于性能,而不是便利性。 因此,最好为每个单独的表;这减少了每个索引中的记录数,您实际上是在通过选择正确的表自己进行过滤。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-05-30
            • 2019-02-01
            • 1970-01-01
            • 2015-08-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多