如果您有例如>查询中的5个左连接是代码味道有......
答案 0 :(得分:38)
对于某些设计来说,这是一个完全合法的解决方案。
假设您有一对多关系的层次结构,例如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
…
请注意,在某些情况下可能效率低下,可能会被EXISTS
或NOT EXISTS
替换(如果您只想知道相应的记录存在或在其他表中不存在)
请参阅我的博客中有关效果详情的文章:
LEFT JOIN
替换NOT EXISTS
来获益答案 1 :(得分:12)
从某种意义上说,你可以/应该调查我会说是的。通过考虑一些观点,你可能会获得更好的效用和维护。
从某种意义上说,它是“坏代码”否,这很容易合理,特别是对于大型数据库而言,现代数据库可能会优化任何低效率。
答案 2 :(得分:8)
没有这样做是完全可以的,但是如果你发现自己一遍又一遍地使用相同的连接写相同的查询/程序, 它可能是创建视图的候选者,只是为了简化您将来的查询,并减少在架构更改时需要更改的触点数
答案 3 :(得分:7)
很多时候你可以通过创建帮助视图来缓解视觉气味,我认为没有一个严格的快速规则来确定有多少左连接被认为是坏的。
与过程编码不同,将SQL分解成一些小块可能会导致查询效率低下。
答案 4 :(得分:2)
有些人几乎不可能像这样回答一般性的问题,并试图制造这样一个任意的规则毫无意义。
左连接是一种完全可以接受的连接类型,它可以映射到一个非常常见的需求:给我所有的x,如果它们有关联的y,那么也可以得到它们。
答案 5 :(得分:2)
您的结果我的变化
任何与众不同的东西都可能是代码味道。像Quassnoi说的那样可能是完全合法的。对于真正深入的报告来说,需要大量的连接才能正确地拼凑信息并不罕见。这并不意味着开发人员应该考虑对数据库进行非规范化。
答案 6 :(得分:2)
不,一点也不。构建一个在某些查询中使用大量左连接的数据库设计是完全合法的。
话虽如此,我通常更喜欢构建数据库,以便需要外连接的情况数量有限,因为经验往往表明使用它们的(复杂)查询更容易出错并且可能会产生维修问题。
作为一个有趣的历史,IBM早期版本的DB2只在大型机上运行时,不支持外连接(Oracle和Ingress都是当时的主要卖点)。这导致了数据库设计中的一些有趣问题,因为有必要确保只使用内部连接来解决数据库的所有预期数据访问要求。
答案 7 :(得分:2)
我认为必须使用多个连接(例如处理规范化数据)不是代码气味,而是表明您可能无法在正确的位置工作。根据我的经验,那些担心查询中的连接数量的人在数据库中开发得太多,而在公开数据的应用程序和报告中则不够。数据结构必须足够灵活,以支持无数的用途,这就是为什么规范化在某种程度上很重要。
在构建当今的企业应用程序时,开发人员可以利用昨天的成就,在高于SQL,甚至XML等技术的抽象层次上工作,以便以更少的工作提供更多价值。有一些工具,即报表编写器,代码生成器,ORM,实体框架等,它们抽象了手动构建SQL的低级工作,并将为您执行连接。大多数人都知道正在使用的SQL方言(例如,Oracle 9与MySQL 3),并且可以生成对该方言最有效的SQL语法;这意味着他们可能会比你更好地创建连接。
但是,在没有充分规范化的关系环境中,这些工具的工作效果很差,或根本不工作。对我来说,这就是“发展”气味的表现;如果已建立的数据访问工具无法理解我构建数据的关系,我可能需要寻找一种更加规范化的方式来创建这些关系,并从中获得远远超过该工具使用的好处。通常情况下,介于第2和第3 normal form之间的地方是最佳点;虽然总是存在一小部分关系数据,其中更高程度的归一化是有意义的并且增加了价值。
干杯, 特拉维斯