Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Тоу Д. -> "Настройка SQL. Для профессионалов" -> 107

Настройка SQL. Для профессионалов - Тоу Д.

Тоу Д. Настройка SQL. Для профессионалов — СПб.: Питер, 2004. — 333 c.
ISBN 5-94723-959-0
Скачать (прямая ссылка): nastroykasqldlyaprof2004.djvu
Предыдущая << 1 .. 101 102 103 104 105 106 < 107 > 108 109 110 111 112 113 .. 161 >> Следующая

Необычные диаграммы соединений

217

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

Соединения без первичных ключей

Я использую связи без стрелок на концах для обозначения соединений, на обеих сторонах которых не задействуются первичные ключи. В целом они представляют необычные соединения вида «многие ко многим», хотя в некоторых случаях они превращаются в «многие к нулю» или «многие к одному». Если они никогда не бывают вида «многие ко многим», то вы просто не заметили условие уникальности и должны добавить стрелку на уникальном конце соединения. Если хотя бы иногда эти соединения бывают вида «многие ко многим», то у вас появляются все те же проблемы (и, следовательно, те же решения), как и для диаграмм запросов с несколькими корневыми узлами. На рис. 7.14 показано соединение вида «многие ко многим» между Tl и Т2, где детальный коэффициент соединения на обоих концах больше 1,0. Главные коэффициенты соединения присутствуют только на уникальном конце связи, обозначенном стрелкой, поэтому у этой связи два детальных коэффициента соединения.

Рис. 7.14. Соединение вида «многие ко многим»

Этот случай встречается намного чаще, чем предыдущие примеры необычных диаграмм соединений. Хотя в нем есть все те же возможные источники проблем (и решения), как и в случае нескольких корневых узлов, подавляющее большинство соединений вида «многие ко многим» появляется просто из-за отсутствующих условий соединения. Начните с проверки, не нужно ли условия фильтрации в запросе считать частью соединения, потому что они завершают спецификацию полного первичного ключа для одной из сторон соединения. Пример 5.2 в главе 5 — это такой случай, в котором условие ОТ. Code_Type - ’ ORDER_STATUS' требуется для завершения уникального соединения с псевдонимом ОТ. Если бы я рассматривал это условие как простое фильтрующее условие для псевдонима ОТ, то соединение с ОТ превратилось бы в соединение вида «многие ко многим». Даже если вы не находите отсутствующую часть соединения среди фильтрующих условий запроса, всегда следует подозревать, что она по ошибке не была указана в запросе.

Такой случай отсутствующего условия соединения особенно часто встречается, когда дизайн базы данных разрешает существование нескольких типов сущностей или разбиений в пределах таблицы, а разработчик забывает ограничить разбиение или тип в запросе. Например, в предыдущем примере с таблицей Code_Transl ati ons для каждого Code_Type существовали различные типы сущностей преобразования (translation), и если бы условие для Code_Type не было указано, то соединение с Code_Translations превратилось бы в соединение вида «многие ко многим». Зачас-
218

7. Диаграммное изображение и настройка сложных SQL-запросов

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

По аналогии с диаграммами запросов с несколькими корневыми узлами решения для соединений вида «многие ко многим» соответствуют решениям различных диаграмм с несколькими корневыми узлами.

Соединения вида «один к одному»

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

Соединение вида «один к одному» с таблицей-подмножеством

На рис. 7.15 показано типичное соединение вида «один к одному», встроенное в большой запрос. В то время как у соединения вида «многие ко многим» на обоих концах детальные коэффициенты соединения, у соединения вида «один к одному» это главные коэффициенты соединения. Главные коэффициенты соединения в этом примере показывают, что соединение между Tl и Т2 в действительности бывает только «один к нулю» или «один к одному»; случай «один к нулю» возникает для 30 % строк из Tl.
Предыдущая << 1 .. 101 102 103 104 105 106 < 107 > 108 109 110 111 112 113 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100