在实践中有多少连接是可行的

时间:2012-06-29 06:57:40

标签: sql database join feasibility

这个问题可能更适合于程序员.stackexchange。如果是,请迁移。

我目前正在思考典型数据模型的复杂性。每个人都知道数据模型应该被标准化,但另一方面,标准化数据模型将需要相当多的连接来重新组装数据。并且连接可能是昂贵的操作,具体取决于所涉及的表的大小。所以我想弄清楚的问题是人们通常会如何进行这种权衡?即实际上,在设计数据模型时,您会发现在典型查询中可以接受多少个连接?在单个查询中计算多个连接时,这将特别有趣。

作为一个例子,假设我们有拥有房屋的用户,其中有房间,其中有抽屉,其中包含物品。通过上面解释的用户,房屋,房间,抽屉和物品的表格对其进行简单的标准化,后来要求我在获得属于特定用户的所有项目时加入五个表格。这对我来说似乎非常复杂。

很可能也会涉及表格的大小。使用少量数据连接五个表并不像具有数百万行的三个表一样糟糕。或者这种考虑是错误的?

4 个答案:

答案 0 :(得分:5)

规范化数据库本身就是一种艺术形式 如果正确构建连接,则只能获取所需的列 运行具有多个表的数百万条记录的查询并加入所需的字段应该快得多,如果您说一个或两个表包含所有记录,那么它会更快。 在第二个例子中,您正在检索所有数据,并通过它进行排序将是一个编码噩梦 MySQL非常好只检索请求的数据 仅仅因为查询很长并不意味着它更慢 我已经看到超过20行代码的查询语句非常快
对你写的查询有信心,如果你不编写测试脚本,请自己尝试。

答案 1 :(得分:5)

reasons for the Database Normalizations,我看到有超过20个表和子查询连接在一起的查询,工作很长时间。我发现规范化的概念是一个巨大的胜利,因为它允许我引入新功能以添加到现有的工作应用程序中,而不会影响到目前为止的工作部分。

数据库具有不同的功能,可以让您的生活更轻松:

  • 您可以为最常用的查询创建视图(尽管这不是视图的唯一用例);
  • 一些RDBMS提供Common Table Expressions(CTE),允许您使用命名子查询和递归查询;
  • 一些RDBMS提供了扩展语言(如PL / SQL或PL / pgSQL),它允许您开发自己的函数来隐藏模式的复杂性,并仅使用API​​调用来操作数据。

前段时间How does a SQL statement containing mutiple joins work?有某种相关的问题。也值得研究一下。

使用规范化数据库开发应用程序更容易,'通过适当的方法,您可以通过视图/函数隔离您的模式,并使您的应用程序代码免受模式更改的影响。如果您要进行非规范化设计,可能会发生设计更改会影响大量代码,因为非规范化系统往往会以变更可能性为代价进行高性能优化。

答案 2 :(得分:3)

完全规范化的数据模型在性能方面具有更高的成本,但对变化更具弹性。对于一个查询调整的数据模型将会更好,但是当规格发生变化时,您将不得不支付价格。

那么问题可能是您的数据模型(查询)的使用会发生很大变化吗?如果不;不要对它们进行规范化,只针对特定查询进行调整(请咨询您的DBA)。否则,如果您使用多个联接,则通过查询执行计划进行规范化,我无法为您提供特定的数字。

答案 3 :(得分:1)

要解决您的问题,答案就在:

http://en.wikipedia.org/wiki/Database_normalization

如果性能成为使用非规范化的问题,则可以解决这些问题。不应该事先考虑这个步骤(除非你已经有一个可预期的负载)。在真正需要时并根据测量值进行非规范化。