2009-04-27 38 views
29

如果您有例如> 5左联接的查询是一个代码味道,有...左侧是否加入代码味道太多?

  • 什么问题你的设计?
  • 你在一个查询中做得太多了吗?
  • 你的数据库过于规范化了吗?
+0

应该是社区维基 – cjk 2009-04-27 14:19:49

+10

@ck - 不,它不应该;这个问题是一个非主观的可回答的问题。 – 2009-04-27 14:39:28

+10

我的$ 0.02:在达到已知的性能问题并且已经用尽简单的优化之前,没有“过于标准化”的事情。在那个时候,做一些非常控制和非常规的非规范化可能是合理的。 – rmeador 2009-04-27 15:07:33

回答

30

这对某些设计来说是完全合法的解决方案。

说当你有一个层次一个对许多喜欢Customer关系 - Order - Basket - Item - Price等,它可以在任何级别上未配备:一Customer可能没有Orders,一个Order可以没有Baskets

在这种情况下,你发出这样的:

SELECT * 
FROM Customer c 
LEFT OUTER JOIN 
     Order o 
ON  o.CustomerID = c.ID 
LEFT OUTER JOIN 
     Basket b 
ON  b.OrderID = c.ID 
… 

注意,这可能是在某些情况下效率低下,并且可以与被替换或NOT EXISTS(如果您只想知道相应的记录存在或不存在于其他表格中)。

看到这篇文章在我的博客的性能细节:

12

更换LEFT JOIN的在这个意义上受益,它的东西,你可以/应该调查我说是的。通过考虑一些观点,你可能会得到更好的效用和维护。

从某种意义上说,它是“糟糕的代码”否,这可能很容易合理,特别是对于较大的数据库,现代数据库可能会优化任何低效率。

7

尽管如果你发现自己一次又一次地写同样的查询/程序,使用相同的连接到相同的表, 它可能是一个创建视图的候选人,只是为了简化你在将来查询,并减少你需要改变的触摸点的数量,如果你的架构变化

6

很多时候你可以通过创建帮助者视图来减轻视觉气味,我不认为有一个硬性规定多少左连接被认为是不好的。

与过程编码不同,将SQL细分为小块和小块可能导致查询效率低下。

2

某人回答这个问题几乎是不可能的,并试图创建这样一个任意的规则将毫无意义。

左连接是一种完全可以接受的连接类型,映射到一个非常普遍的需求:让我所有的x,如果他们有关联,然后获得这些。

2

您的结果我因人而异

任何不寻常的可能是一个代码气味的东西。像Quassnoi说,这可能是完全合法的。真正深入的报告并不少见,需要疯狂的连接才能正确拼凑信息。这并不意味着开发人员应该查看数据库的非规范化。

2

不,完全没有。构建一个在某些查询中使用大量左连接的数据库设计是完全合法的。

说了这么多我一般喜欢构建数据库,以便在需要外部连接的案件数量是有限的经验往往表明,使用起来都比较容易出错,有可能引起该(复杂)查询维护问题。作为一个有趣的历史遗留,IBM DB2的早期版本仅在大型机上运行时,不支持外部连接(Oracle和Ingress在当时都是一个主要卖点)。这导致了数据库设计中一些有趣的问题,因为有必要确保数据库的所有预期数据访问需求都可以使用内部连接来解决。

2

我认为必须使用许多联接(例如处理规范化的数据)不是代码异味,而是一种迹象表明,您可能无法在正确的位置工作。根据我的经验,那些担心查询中的连接数量的人在数据库中开发得太多,而在公开数据的应用程序和报表中却不足够。数据结构必须足够灵活以支持大量的用途,这就是为什么标准化在某种程度上很重要。

在构建当今的企业应用程序时,开发人员可以利用昨天的成就在高于SQL等甚至XML技术的抽象层次上工作,以便在减少工作量的同时提供更多价值。有一些工具,即报表编写器,代码生成器,ORM,实体框架等,它们将人工构建SQL的低级工作抽象出来,并将为您执行连接。大多数人都知道正在使用的SQL方言(例如,Oracle 9和MySQL 3),并且可以生成对该方言最有效的SQL语法;这意味着他们可以创建比您更好的连接。

但是,这些工具在没有足够标准化的关系环境中工作得很差或根本不工作。对我而言,这是一种“发展”气味表现出来的地方;如果一个已建立的数据访问工具无法理解我构建数据的关系,那么我可能需要寻找更加规范化的方式来创建这些关系,并从中获得远远超过使用该工具的好处。通常,第二和第三个normal form之间的某处是甜点;尽管总是存在小范围的关系数据,其中更高程度的标准化是有意义的并且增加了价值。

干杯, 特拉维斯