【问题标题】:Database structure - To join or not to join数据库结构 - 加入或不加入
【发布时间】:2011-01-30 06:32:41
【问题描述】:

我们正在 mySQL Workbench 的帮助下为一个新的应用程序绘制数据库结构,并且随着多对多关系的增加,列出数据所需的连接数量急剧增加。

应用程序的读取量很大,每个表有几十万行。

问题:

  • 在需要的地方合并表从而减少连接真的有那么糟糕吗?

  • 我们应该开始研究水平分区吗? (结合合并表)

  • 有没有比数据透视表更好的方法来处理多对多关系?

  • 我们讨论了将所有数据存储在序列化文本列中并让应用程序而不是数据库进行排序,但这似乎是一个非常糟糕的主意,即使数据库将被大量缓存。你怎么看?

【问题讨论】:

    标签: mysql database-design data-structures relational-database database-relations


    【解决方案1】:

    如果您确保索引外键(您确实设置了外键,不是吗?)并且在查询中有适当的 where 子句,数据库应该可以轻松处理 10-15 个连接。尤其是这么少的行。我对具有数百万行的表进行了这么多连接的查询,并且它们运行良好。

    通常对数据进行分区比反规范化更好。

    就去规范化而言,除非您还制定了保持去规范化数据与父表同步的策略,否则不要这样做。

    至于您是否真的需要这么多表,或者您的设计是否糟糕,我们唯一可以评论的方法就是我们看到表结构。

    【讨论】:

      【解决方案2】:

      除非您有明确的证据表明性能因连接而受到影响,否则请保持正常化。否则,正如其他人所说,您将不得不担心多次更新。

      特别是如果数据库被大量缓存,如您所说,您会惊讶于 DBMS 做这种事情的速度之快——毕竟这是它的设计目的。

      除非是具有大量数据的怪物应用程序需要特殊的性能优化,否则您会发现减少开发、测试和后期维护工作将更为重要。

      连接通常很好,也不错。它们允许您将数据保留在应有的位置,从而为您提供最大的灵活性。

      正如已经多次说过的那样,过早的优化通常是坏的,不是好的。

      【讨论】:

      • 好吧,我们不是在构建新的 Facetube,但我们真的不想开始构建一个从第一天起就会受到结构不良影响的应用程序。您对何时合并表并将它们彼此分开有何看法?
      • @Industrial - 非规范化的时间通常是当您有明确的证据表明需要这样做时。除此之外,“从第一天开始的糟糕结构”更有可能来自于试图猜测你在优化方面比 DBMS 更好的地方。
      【解决方案3】:

      数据库旨在处理大量连接。使用此功能,因为它将使数据库中的多种数据操作变得更加容易。否则,为什么不直接使用平面文件呢?

      【讨论】:

      • 我一直被告知要规范化、规范化和再次规范化。然后加入的数量增加了,我被告知会立即杀死性能。
      • 当数据集增长时,连接过多会降低性能。除了能够进行连接之外,数据库显然还有许多其他优势......
      • @Kimble :当然取决于应用程序,但是您在哪里划定“连接过多”的界限?
      • @Industrial:我认为这个问题没有确切的答案。这在很大程度上取决于连接中包含的表中的数据量。 Digg.com 发表了很多关于他们在该领域的经验的文章/博客文章。
      • @Kimble 谢谢!将查看他们的博客以获取更多信息。如果您有任何具体的文章,请告诉我!
      【解决方案4】:

      使用数据库的规范化形式。对于大部分任务,您不需要超过 3 或 4 个联接,您仍然可以为最常见的联接编写视图。非规范化将让您在更改一个属性时始终考虑更新多个位置/表中的字段,并且肯定会导致更多的问题而不是好处。

      如果您担心报告性能,您仍然可以将数据分批提取到单独的表中,以获得报告查询所需的性能。如果是为了查询简单,您可以使用视图。

      【讨论】:

      • 谢谢!我们实际上已经在 8 到 9 个连接范围内,而且核心肯定会增加,所以未来 10 到 15 个连接可能不是完全不可能的......
      • 开始标准化。定义您对性能的要求。措施。如果你没有表现,战略性地去规范化,直到你满足你的要求。
      【解决方案5】:

      倒序:

      • 算了。使用数据库。人们说“在应用程序中实现它”通常是那些对编写数据库的工作量一无所知的人。

      • 取决于具体需要。

      • 取决于具体需要。 OLTP(事务处理) - 寻求第一种范式。 OLAP(分析处理)- 寻找适当的星图并进行非规范化以获得最佳性能。混合 - 算了。不适用于较大的安装,因为理论不同...除非您将数据库设置为 OLTP,然后使用特殊的 OLAP 多维数据集数据库(mySQL 没有)。

      【讨论】:

        【解决方案6】:

        与往常一样,这取决于您的应用程序,但一般来说,过多的非规范化可能会在以后再次出现并咬您一口。一个良好规范化的数据库意味着您应该能够以您以后可能需要的大多数方式查询您的数据,尤其是用于报告(这通常是事后才想到的)。

        如果您将所有数据粘贴在序列化的文本列中,并且您的客户要求一份报告显示所有具有特定属性的行,那么您将不得不进行一系列字符串操作才能获取这些数据。

        如果您担心查询的连接过多,可以考虑将某些数据集公开为视图...

        【讨论】:

          猜你喜欢
          • 2015-01-11
          • 1970-01-01
          • 1970-01-01
          • 2021-10-01
          • 2019-07-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多