Intereting Posts
SQL игнорирует часть WHERE, если параметр равен null Вставка значений HashMap в таблицу с использованием ibatis Выберите первую запись в соотношении «один-ко-многим», используя левое соединение Получение строки с данными из таблицы пар ключей и значений в MySQL Использование TUPLES для размещения более 1000 записей в предложении SQL IN Как разбить значение столбца на условие «IN»? Вычисление количества хостов в сетевой маске с использованием TSQL sqlite-эквивалент row_number () over (partition by …? Доступ к VBA для обрезки пространства вокруг определенного символа или слов (слов) в столбце Как объединить все целые массивы из всех записей в один массив в postgres C # подключиться к базе данных и перечислить базы данных выберите TOP n Rows из таблицы, где n находится в другой таблице? Создать представление, имеющее проблемы с JOINS Как подключить таблицу пользователей к таблице ролей (используя таблицу user_roles)? Одна таблица поиска или множество таблиц поиска?

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

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

  • что-то не так с вашим дизайном?
  • вы делаете слишком много в одном запросе?
  • у вас база данных слишком нормализована?

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

Скажите, что у вас есть иерархия отношений «один ко многим», таких как « CustomerOrder – « Basket – « ItemPrice и т. Д., Которые могут быть заполнены на любом уровне: у 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

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

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

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

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

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

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

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

Мои результаты

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

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

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

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

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

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

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

Приветствия, Тревис