|
Программирование >> Хронологические базы данных
в частности, пустое множество деталей, поставляемых поставщиком с номером S5, на рис. 18.4 представлено именно в виде пустого множества, а не в виде каких-то неопределенных значений (NULL), как это было в случае, показанном на рис. 18.3. Представление пустого множества в виде пустого множества, похоже, является удачной идеей. Действительно, при должной поддержке атрибутов, значениями которых могут быть отношения, операция внешнего соединения может оказаться совершенно излишней. При более внимательном изучении этого вопроса можно заметить, что имеет место проблема интерпретации неопределенных значений (NULL), которые появляются в результирующем отношении операции внешнего соединения. Например, что представляют собой неопределенные значения, показанные на рис. 18.3? Несомненно, они не означают значение неизвестно или значение неприменимо . На самом деле единственная логически обоснованная интерпретация их смысла следующая: Значение является пустым множеством . Более подробно эта проблема обсуждается в [18.7]. В заключение раздела заметим, что существует возможность определить внешние версии других операторов реляционной алгебры, в частности операторов объединения, пересечения и вычитания [13.6]. И вновь Кодд рассматривает по крайней мере один из таких операторов, а именно - внешнее объединение, как неотъемлемую часть его реляционной модели [5.2]. Подобные версии операторов позволяют выполнять объединение двух отношений и другие операции, даже если данные отношения несовместимы по типу. Основной принцип работы таких операторов состоит в расширении каждого из операндов за счет добавления атрибутов, свойственных другому операнду, с помещением неопределенных значений (NULL) в каждый такой атрибут каждого кортежа (после чего операнды становятся совместимыми по типу). Затем выполняется обычное объединение, пересечение или вычитание. Тем не менее мы не будем подробно обсуждать эти операции по следующим причинам. Внешнее пересечение гарантированно возвращает пустое отношение, за исключением специального случая, когда исходные отношения совместимы по типу. Однако в такой ситуации внешнее пересечение вырождается до обычного пересечения. Внешнее вычитание гарантированно возвращает первый операнд, за исключением специального случая, когда исходные отношения совместимы по типу. Однако в такой ситуации внешнее вычитание вырождается до обычного вычитания. Основными проблемами, характерными для операции внешнего объединения, являются проблемы интерпретации; причем они даже сложнее проблем интерпретации, имеющих место в случае операции внешнего соединения. (См. [18.2] для более детального изучения.) Данное объяснение относится к исходным определениям этих операций [13.6]. В работе [5.2] они в некоторой степени изменены, и читателю предлагается самостоятельно рассмотреть эти подробности. 18.6. Специальные значения Как показано выше, введение неопределенных значений (NULL) приводит к разрушению реляционной модели, которая великолепно обходилась без них в течение десяти лет с момента ее создания 1969 году [5.1] и вплоть до введения этих значений в 1979 году [13.1]. Теперь предположим, как в разделе 18.4, что понятие неопределенных значений в контексте представления отсутствуюшей информации заменено понятием специальных значений. Следует отметить, что в реальном мире мы обычно пользуемся именно специальными значениями. Например, специальное значение ? используется для обозначения количества рабочих часов для некоторого сотрудника, если его фактическое значение по какой-либо причине неизвестно. Таким образом, обшая идея заключается в том, чтобы просто применять подходяшее специальное значение, отличное от обычных значений атрибута, во всех тех случаях, когда обычное значение не может использоваться. Обратите внимание, что это специальное значение обязательно должно принадлежать соответствуюшему домену. Поэтому в примере с данными о количестве рабочих часов типом атрибута HOURS WORKED является не просто целое число, а целые числа плюс специальное значение. Безусловно, следует признать, что изложенная выше схема не очень элегантна, но она обладает явным преимушеством, поскольку не подрывает логических основ реляционной модели. В остальной части этой книги мы будем просто игнорировать возможность поддержки неопределенных значений (NULL) за исключением некоторых случаев, специфических для контекста языка SQL, когда те или иные ссылки на неопределенные значения (NULL) будут неизбежны. Более подробно эти вопросы рассматриваются в [18.12]. 18.7. Поддержка неопределенных значений в языке SQL Поддержка неопределенных значений (NULL) и трехзначной логики в языке SQL отражает весь широкий спектр подходов, описанных в разделах 18.1-18.5. Так, например, когда в языке SQL условие WHERE применяется к таблице Т, это исключает из рассмотрения все строки таблицы Т, для которых указанное в предложении WHERE условие принимает значение false или ипк (т.е. не true). Аналогично, когда к результату выполнения некоторой операции группирования, представленному таблицей G, применяется оператор HAVING, из дальнейшего рассмотрения исключаются все группы кортежей, для которых указанное в предложении HAVING условие принимает значение false или ипк (т.е. не true). Из этого следует, что мы просто обратили внимание читателя на некоторые возможности, специфические для языка SQL и не являющиеся частью концепции трехзначной логики, которая обсуждалась в предыдущем разделе. Замечание. Очень сложно оценить все последствия поддержки неопределенных значений (NULL) в языке SQL. Дополнительную информацию можно найти в официальных документах стандарта SQL [4.22] и в учебном издании [4.19]. Обратите внимание, что для этого не используется неопределенное значение (NULL). В реальном мире никакого неопределенного значения вообще не существует. Определение данных Как описано в разделе 5.5 главы 5, для столбцов таблиц базы данных обычно указывается некоторое значение, принимаемое по умолчанию; оно часто определяется (явно или неявно), как величина NULL. Более того, столбцы в таблицах базы данных всегда разрешают использование неопределенных значений, если условие запрета их использования не будет указано явно (например, в виде фразы NOT NULL). Представление неопределенных значений зависит от реализации, но оно должно быть таким, чтобы система смогла отличить это значение от других, которые неопределенными не являются (даже несмотря на то, что операция сравнения NULL ? х не дает в результате true). Табличные выражения Напомним замечание из главы 7 (раздел 7.7) о том, что явная поддержка операции JOIN была введена только в версии SQL/92 стандарта языка SQL. Более того, если перед ключевым словом JOIN указан один из определителей LEFT, RIGHT или FULL (с необязательной добавкой OUTER в каждом случае), рассматриваемое соединение является внешним. Вот несколько примеров. S LEFT JOIN SP ON S.Sl = SP.Sl S LEFT JOIN SP USING ( S ) S LEFT NATURAL JOIN SP Три приведенных выражения эквивалентны, но первое приводит к созданию таблицы с двумя идентичными столбцами номера поставщика, а второе и третье - таблицы с одним столбцом номера поставщика. Язык SQL также поддерживает аппроксимацию внешнего соединения, которую называют объединяющим соединение.м. Однако подробное обсуждение этого вопроса выходит за рамки данной главы. Условные выражения Как отмечалось в главе 8, в языке SQL условные выражения являются аналогом того, что во всех остальных случаях называется логическими (или булевыми) выражениями (более подробно они рассматриваются в приложении А). Неудивительно, что условные выражения являются той частью языка SQL, которая в наибольшей степени связана с неопределенными значениями и трехзначной логикой. Ниже предлагается несколько замечаний по этому поводу. Проверка наличия неопределенного значения. В языке SQL предусмотрены два специальных оператора сравнения, IS NULL и IS NOT NULL, предназначенных для проверки наличия или отсутствия неопределенных значений. Синтаксис использования этих операторов показан ниже. <конструктор строки> IS [ NOT ] NULL (Параметр <конструктор строки> подробно рассматривается в приложении А.) Невнимательные пользователи могут попасть здесь в ловушку, поскольку выражения г IS NOT NULL и NOT (г IS NULL) не являются эквивалентными! Более подробно эта особенность рассматривается в [4.19].
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |