回答
这对某些设计来说是完全合法的解决方案。
说当你有一个层次一个对许多喜欢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
(如果您只想知道相应的记录存在或不存在于其他表格中)。
看到这篇文章在我的博客的性能细节:
- Finding incomplete orders - 如何从
NOT EXISTS
更换LEFT JOIN
的在这个意义上受益,它的东西,你可以/应该调查我说是的。通过考虑一些观点,你可能会得到更好的效用和维护。
从某种意义上说,它是“糟糕的代码”否,这可能很容易合理,特别是对于较大的数据库,现代数据库可能会优化任何低效率。
尽管如果你发现自己一次又一次地写同样的查询/程序,使用相同的连接到相同的表, 它可能是一个创建视图的候选人,只是为了简化你在将来查询,并减少你需要改变的触摸点的数量,如果你的架构变化
很多时候你可以通过创建帮助者视图来减轻视觉气味,我不认为有一个硬性规定多少左连接被认为是不好的。
与过程编码不同,将SQL细分为小块和小块可能导致查询效率低下。
某人回答这个问题几乎是不可能的,并试图创建这样一个任意的规则将毫无意义。
左连接是一种完全可以接受的连接类型,映射到一个非常普遍的需求:让我所有的x,如果他们有关联,然后获得这些。
您的结果我因人而异
任何不寻常的可能是一个代码气味的东西。像Quassnoi说,这可能是完全合法的。真正深入的报告并不少见,需要疯狂的连接才能正确拼凑信息。这并不意味着开发人员应该查看数据库的非规范化。
不,完全没有。构建一个在某些查询中使用大量左连接的数据库设计是完全合法的。
说了这么多我一般喜欢构建数据库,以便在需要外部连接的案件数量是有限的经验往往表明,使用起来都比较容易出错,有可能引起该(复杂)查询维护问题。作为一个有趣的历史遗留,IBM DB2的早期版本仅在大型机上运行时,不支持外部连接(Oracle和Ingress在当时都是一个主要卖点)。这导致了数据库设计中一些有趣的问题,因为有必要确保数据库的所有预期数据访问需求都可以使用内部连接来解决。
我认为必须使用许多联接(例如处理规范化的数据)不是代码异味,而是一种迹象表明,您可能无法在正确的位置工作。根据我的经验,那些担心查询中的连接数量的人在数据库中开发得太多,而在公开数据的应用程序和报表中却不足够。数据结构必须足够灵活以支持大量的用途,这就是为什么标准化在某种程度上很重要。
在构建当今的企业应用程序时,开发人员可以利用昨天的成就在高于SQL等甚至XML技术的抽象层次上工作,以便在减少工作量的同时提供更多价值。有一些工具,即报表编写器,代码生成器,ORM,实体框架等,它们将人工构建SQL的低级工作抽象出来,并将为您执行连接。大多数人都知道正在使用的SQL方言(例如,Oracle 9和MySQL 3),并且可以生成对该方言最有效的SQL语法;这意味着他们可以创建比您更好的连接。
但是,这些工具在没有足够标准化的关系环境中工作得很差或根本不工作。对我而言,这是一种“发展”气味表现出来的地方;如果一个已建立的数据访问工具无法理解我构建数据的关系,那么我可能需要寻找更加规范化的方式来创建这些关系,并从中获得远远超过使用该工具的好处。通常,第二和第三个normal form之间的某处是甜点;尽管总是存在小范围的关系数据,其中更高程度的标准化是有意义的并且增加了价值。
干杯, 特拉维斯
- 1. “太多的依赖”代码味道?
- 2. 空接口代码味道?
- 3. 同步代码味道?
- 4. 类名称中的“助手”一词是否有代码味道?
- 5. 此方法是否违反SOLID或有代码味道?
- 6. Parse.com上的左侧加入
- 7. 左侧和右侧加入查询
- 8. NHibernate一对多的例子。这是代码味道吗?
- 9. 如何知道我是否将鼠标移动到左侧或右侧
- 10. VIM:将代码行左侧移动%s?
- 11. XCode 4.5 - 左侧的缩进代码
- 12. 太多导入垃圾我的代码
- 13. 默认类名 - 代码味道?
- 14. 这段代码有味道吗?
- 15. 是html.renderaction代码气味
- 16. 我如何知道多边形的内部是否位于顶点的右侧或左侧?
- 17. 左侧加入显示所有行
- 18. MAX在左侧加入(日期)
- 19. MySQL左侧加入单个字段
- 20. Laravel:排序在左侧一列加入
- 21. MySQL从左侧选择全部加入
- 22. SQL - 左侧没有空加入
- 23. Backbone JS代码味道 - 嵌入子视图的更好方法?
- 24. LinearLayout的左侧是TextView,右侧是RadioButton?
- 25. Microsoft Access 97/XP左侧加入多列失败 - Vista/7正常
- 26. 太多相同的代码
- 27. Android内部的getter/setter真的是代码味道吗?
- 28. “拥有”与“是” - 代码味道来决定
- 29. 帮手铸造功能 - 它是一种代码味道?
- 30. 确定顶点是否位于相机的左侧或右侧
应该是社区维基 – cjk 2009-04-27 14:19:49
@ck - 不,它不应该;这个问题是一个非主观的可回答的问题。 – 2009-04-27 14:39:28
我的$ 0.02:在达到已知的性能问题并且已经用尽简单的优化之前,没有“过于标准化”的事情。在那个时候,做一些非常控制和非常规的非规范化可能是合理的。 – rmeador 2009-04-27 15:07:33