Подтвердить что ты не робот

Слишком много левых присоединяется к запаху кода?

Если у вас есть, например, > 5 левых объединений в запросе - это запах кода, который есть...

  • что-то не так с вашим дизайном?
  • Вы делаете слишком много в одном запросе?
  • У вас слишком нормальная база данных?
4b9b3361

Ответ 1

Это совершенно законное решение для некоторых проектов.

Скажите, что у вас есть иерархия отношений "один ко многим" типа Customer - Order - Basket - Item - Price и т.д., которые могут быть незаполнены на любом уровне: a Customer может не иметь Orders, a 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 (если вы хотите узнать, что соответствующие записи существуют или не существуют в других таблицах).

См. эту статью в своем блоге для подробностей о производительности:

Ответ 2

В том смысле, что это то, что вы могли/должны исследовать, я бы сказал "да". Вероятно, вы можете получить более полезную техническую поддержку и поддержку, отвлекая некоторые из них.

В том смысле, что это "плохой код" нет, это может быть легко разумным, особенно для больших БД, и современные базы данных, скорее всего, оптимизируют любую неэффективность.

Ответ 3

Нет, это прекрасно, но если вы снова и снова повторяете одни и те же запросы/процедуры, используя те же соединения, что и в тех же таблицах, возможно, это кандидат на создание представления, чтобы упростить ваши запросы в будущем и уменьшить количество точек касания, которые вам нужно изменить, если вы измените схему.

Ответ 4

Много раз вы можете облегчить визуальный запах, создав вспомогательные представления, я не думаю, что существует жесткое и быстрое правило того, сколько левых объединений считается плохим.

В отличие от процедурного кодирования, разбиение SQL на маленькие биты и фрагменты может привести к неэффективным запросам.

Ответ 5

Вряд ли кто-то может ответить на вопрос как общий, и это попытка создать такое произвольное правило бессмысленно.

Левые соединения - вполне приемлемый тип соединения, который накладывается на очень общую потребность: получите все x, если они связаны с y, затем получите их.

Ответ 6

Ваши результаты Моя минута

Ничто из обычного не может быть запахом кода для чего-либо. Как сказал Квасной, это может быть совершенно законным. Это не редкость для действительно углубленных отчетов, требующих сумасшедшего количества объединений для правильной сборки информации. Это не означает, что разработчик должен искать денормализацию своей базы данных.

Ответ 7

Нет, совсем нет. Совершенно легитимно построить проект базы данных, в котором для некоторых запросов используется значительное количество левых объединений.

Сказав, что я обычно предпочитаю строить базу данных, так что количество случаев, когда внешние соединения требуются, ограничено, поскольку опыт имеет тенденцию предполагать, что (сложные) запросы, которые их используют, более подвержены ошибкам и могут привести к возникновению проблемы с обслуживанием.

Как интересный исторический момент, ранние версии IBM DB2, когда они работали только на мэйнфреймах, не поддерживали внешние соединения (Oracle и Ingress оба делали в то время, что было главной точкой продаж). Это привело к некоторым интересным проблемам проектирования баз данных, поскольку необходимо было обеспечить, чтобы все ожидаемые требования к доступу к данным для базы данных могли быть решены с использованием только внутренних соединений.

Ответ 8

Я бы утверждал, что использование многих объединений (например, сделка с нормализованными данными) не является запахом кода, а скорее показанием, что вы не можете работать в нужном месте. По моему опыту, те, кто обеспокоен количеством подключений в запросах, слишком сильно развиваются в базе данных и недостаточно в приложениях и отчетах, которые раскрывают данные. Структуры данных должны быть достаточно гибкими, чтобы поддерживать множество применений, и поэтому нормализация в той или иной степени важна.

При создании корпоративных приложений сегодня разработчики могут использовать вчерашние достижения для работы на абстрактных уровнях, высоко над такими технологиями, как SQL и даже XML, чтобы обеспечить большую ценность при меньших затратах. Существуют инструменты, то есть сценаристы отчетов, генераторы кода, ORM, инфраструктура сущностей и т.д., Которые абстрагируют работу низкоуровневого построения SQL вручную и будут выполнять объединения для вас. Большинство из них знают о используемом диалекте SQL (например, Oracle 9 vs MySQL 3) и могут генерировать синтаксис SQL, который наиболее эффективен для этого диалекта; что означает, что они могут создать соединения лучше, чем вы можете.

Однако эти инструменты работают очень плохо или вообще не работают в реляционной среде без достаточной нормализации. Для меня это проявляет "запах развития"; если установленный инструмент доступа к данным не может понять отношения, в которых я структурировал свои данные, мне, вероятно, нужно искать более нормализованный способ создания этих отношений, а выгоды от этого полезного использования намного превосходят просто использование этого инструмента. Как правило, где-то между 2-й и 3-й нормальная форма является сладким пятном; хотя неизменно существуют, как правило, небольшие области реляционных данных, где более высокая степень нормализации имеет смысл и добавляет ценность.

Cheers, Travis