- •20.7. Средства sql
- •20.8. Резюме
- •21.1. Введение
- •21.2. Некоторые аспекты технологам поддержки принятия решений
- •21.3. Проектирование базы данных поддержки принятия решений
- •21.5. Хранилища данных и магазины данных
- •21.6. Оперативная аналитическая обработка
- •21.7. Разработка данных
- •21.8. Резюме
- •22.1. Введение
- •22.2. Хронологические данные
- •22.3. Основная проблема хронологических баз данных
- •22.4. Интервалы
- •22.5. Интервальные типы
- •22.6. Скалярные операторы для интервалов
- •22.7. Операторы обобщения для интервалов
- •22.8. Реляционные операторы для обработки интервалов
- •22.9. Ограничения, включающие интервалы
- •22.10. Операторы обновления, включающие интервалы
- •22.11. Проектирование базы данных
- •22.12. Резюме
- •23.1. Введение
- •23.2. Обзор основных концепций
- •23.3. Исчисление высказываний
- •23.4. Исчисление предикатов
- •23.5. Базы данных с точки зрения доказательно-теоретического подхода
- •23.6. Дедуктивные субд
- •23.7. Обработка рекурсивных запросов
- •23.8. Резюме
- •Часть VI
- •24.1. Введение
- •24.2. Объекты, классы, методы и сообщения
- •24.3. Еще раз об объектах и объектных классах
- •Cdo для класса set (ref(emp))
- •24.4. Простой пример
- •1 | Course с001 , с001 0ffs , с001 ny offs |
- •24.5. Дополнительные аспекты
- •24.6. Резюме
- •25.1. Введение
- •X2 rational, y2 rational ) ... ;
- •25.2. Первая грубейшая ошибка
- •25.3. Вторая грубейшая ошибка
- •25.4. Вопросы реализации
- •25.5. Преимущества реального сближения двух технологий
- •25.6. Резюме
25.6. Резюме
В этой главе вкратце были рассмотрены объектно-реляционные системы. Выяснилось, что такие системы в своей основе являются (или должны быть) просто реляционными системами, которые поддерживают реляционную концепцию доменов (т.е. типов) надлежащим образом, а это, в частности, означает, что пользователи имеют (или должны иметь) возможность определять собственные типы. Для реляционной модели ничего не требуется, чтобы достичь необходимой нам объектной функциональности, кроме как реализовать такую модель.
Затем обсуждались две грубейшие ошибки. Первая заключалась в отождествлении объектных классов и переменных-отношений (уравнение, которое, к сожалению, выглядит привлекательно). Мы выдвинули предположение, что ошибка возникла из-за путаницы с двумя совершенно различными интерпретациями термина объект. Был подробно рассмотрен пример, который наглядно продемонстрировал, какой может быть система, в которой допущена первая грубейшая ошибка, а также показал, к каким последствиям приводит такая ошибка. Одним из последствий этой ошибки является то, что она приводит непосредственно ко второй грубейшей ошибке, а именно — к смешиванию указателей и отношений (хотя на самом деле вторая ошибка может быть допущена и без первой, и почти все системы на современном рынке, к сожалению, ее допускают). На наш взгляд, вторая грубейшая ошибка нарушает концептуальную целостность реляционной модели во многих отношениях. В частности, она нарушает принцип взаимозаменяемости базовых и производных отношений.
Далее бегло рассматривались некоторые вопросы реализации. Важнейший из них — добавление новых "пакетов типов"— влияет по крайней мере на компилятор и компоненты управления хранением данных в системе. Поэтому объектно-реляционные системы не могут быть реализованы простым добавлением нового уровня программ к уже существующей системе. Система должна быть перестроена с самого основания, чтобы каждый из ее компонентов в случае необходимости был открытым.
И наконец мы познакомились с матрицей классификации СУБД Стоунбрейкера и кратко обсудили те преимущества, которые могли бы быть получены от истинного сближения объектных и реляционных технологий (здесь под "истинным сближением" подразумевается, в частности, что не допущены две указанные выше грубейшие ошибки).
Список литературы
В последние годы было создано несколько объектно-реляционных прототипов. Среди них наиболее известны система Postgres, разработанная в университете штата Калифорния в Беркли ([25.26], [25.30], [25.32]), и система Starburst, разработанная в корпорации IBM ([25.14], [25.17], [25.21], [25.22]). Обратите внимание, что ни одна из них не может быть отнесена, по крайней мере в оригинальной версии, к системам, объектный подход которых основывался бы на "очевидно корректном" уравнении домен = класс.
Также необходимо отметить, что в язык SQL3 включено несколько возможностей, которые специально предназначены для поддержки объектно-реляционных систем, (см. приложение Б).
25.1. Brooks F.P., Jr. The Mythical Man-Month (20th anniversary edition). — Reading, Mass.: Addison-Wesley, 1995.
25.2. Carey M.J., Mattos N.M., Nori A.K. Object/Relational Database Systems: Principles, Products, and Challenges // Proc. 1997 ACM SIGMOD Int. Conf. on Management of Data. — Tucson, Ariz., May, 1997.
Цитата из работы: "Абстрактные типы данных, определяемые пользователем функции, типы строк, ссылки, наследование, подтаблицы, коллекции, триггеры... Что же все-таки это такое?". Хороший вопрос! В списке есть восемь возможностей и по умолчанию предполагается, что они присутствуют в языке SQL3. Мы могли бы доказать, что четыре из них нежелательны, две другие относятся к тому же разряду, а остальные две не являются специфическими для объектно-реляционной системы (см. приложение Б).
25.3. Carey M.J. et al. The BUCKY Object/Relational Benchmark // Proc. 1997 ACM SIGMOD Int. Conf. on Management of Data. — Tucson, Ariz., May, 1997.
Цитата из резюме: "BUCKY (Benchmark of Universal or Complex Kwery Ynterfaces [так!]) — эталонный тест, ориентированный на запросы, с помощью которого проверяются многие из ключевых возможностей объектно-реляционной системы, включая типы строк и наследование, ссылки и выражения путей, множества атомарных значений и ссылок, методы и позднее связывание, а также определяемые пользователем абстрактные типы данных и их методы".
Cattell R.G.G. What Are Next-Generation DB Systems? // CACM. — October, 1991. — 34, № 10.
Chamberlin D.D. Relations and References — Another Point of View // InfoDB. — April, 1997.— 10, №6.
См. аннотацию к [25.11].
25.6. Chaudhuri S., Gravano L. Optimizing Queries over Multi-Media Repositories // Proc. 1996 ACM SIGMOD Int. Conf. on Management of Data. — Montreal, Canada, June, 1996.
Объектно-реляционные базы данных могут быть использованы как "мультимедиа-хранилища". Для запросов мультимедиаданных обычно недостаточно просто множества результирующих объектов; необходимо еще знать степень соответствия для каждого такого объекта, которая показывает, в какой мере он удовлетворяет поисковому условию (например, "степень красноты" изображения). Такими запросами можно задавать порог степени соответствия, а также квоту [6.4]. В этой статье рассматривается оптимизация таких запросов.
Chaudhuri S., Shim К. Optimizing Queries with User-Defined Predicates // Proc. 22nd Int. Conf. on Vary Large Data Bases. — Mumbai (Bombay), India, September, 1996.
Codd E.F. and Date CJ. Interactive Support for Nonprogrammers: The Relational and Network Approaches // Date С J. Relational Database: Selected Writings. — Reading, Mass.: Addison-Wesley, 1986.
В статье вводится понятие существенности— концепция, которая очень важна для правильного понимания моделей данных (в обоих смыслах этого термина! — см. главу 1, раздел 1.3). Реляционная модель в своей основе имеет лишь одну существенную конструкцию, а именно — отношение. Объектная модель, напротив, имеет много конструкций: множества, мультимножества, списки, массивы и т.д. (не говоря уже об идентификаторах объектов). См. [25.9], [25.10] и [25.13].
25.9. Date C.J. Support the Conceptual Schema: The Relational and Network Approaches // Relational Database Writings 1985-1989. — Reading, Mass.: Addison-Wesley, 1990. Один из аргументов против смешивания указателей и отношений [25.11]— это сложность, к которой приводят указатели. В данной статье приводится пример, очень ясно иллюстрирующий эту сложность (рис. 25.5 и 25.6).
MAJOR Р# |
MINOR Р# |
QTY |
Р1 |
Р2 |
2 |
Р1 |
Р4 |
4 |
Р5 |
РЗ |
1 |
РЗ |
Р6 |
3 |
Р6 |
Р1 |
9 |
Р5 |
Р6 |
8 |
Р2 |
Р4 |
3 |
Рис. 25.5. Отношение спецификации материалов
Сплошные линии: "входимость деталей" Пунктирные линии: "где используется"
Рис. 25.6. Аналог отношения, показанного на рис. 25.5, который основан на указателях
25.10.Date C.J. Essentiality // Relational Database Writings 1991-1994.— Reading, Mass.: Addison-Wesley, 1995.
25.11.Date C.J. Don't mix Pointers and Relations! и Don't mix Pointers and Relations! — Please // Date C.J., Darwin H. and McGoveran D. Relational Database Writings 1994— 1997. — Reading, Mass.: Addison-Wesley, 1998.
В первой из этих статей приводятся аргументы против второй грубейшей ошибки. В [25.5] Чемберлин опровергает некоторые аргументы данной статьи. Вторая статья является прямым ответом на опровержение Чемберлина. 25.12.Date C.J. Objects and Relations: Forty-Seven Points of Light // Date C.J., Darwin H. and McGoveran D. Relational Database Writings 1994-1997.— Reading, Mass.: Addison-Wesley, 1998.
Подробный ответ на [25.19]. 25.13.Date C.J. Relational Really Is Different. Выпуск № 10 серии статей [5.9]. www.intelligententerprise.com.
25.14.DeMichael L.G., Chamberlin D.D., Lindsay B.G., Agrawal R. and Arya M. Polyglot: Extentions to Relational Databases for Shrable Types and Functionas in a Muti-Language Environment// IBM Research Report RJ8888. — 1992. Цитата из резюме: "Polyglot — расширяемая система типов реляционной базы данных, поддерживающая наследование, инкапсуляцию и динамическое назначение методов". (Динамическое назначение методов (dynamic method dispatch)— это другое название связывания во время выполнения программы (синонимы: позднее связывание (late binding) и динамическое связывание (dynamic binding). — Прим. перев.) Далее: "[Polyglot] позволяет использовать несколько прикладных языков, причем объекты сохраняют свое поведение при переходе между приложениями баз данных и прикладными приложениями. В статье описано устройство системы Polyglot, расширения языка SQL для поддержки используемых системой типов и методов и реализация системы в [прототипе] проекта Starburst". Система Polyglot имеет непосредственное отношение к вопросам этой главы (а также глав 5, 19 и 24). Здесь следует сделать несколько замечаний. Во-первых, реляционный термин домен в статье ни разу не упоминается (что очень удивительно). Во-вторых, в системе Polyglot имеются встроенные генераторы типов (в терминах этой системы — метатипы): базовый тип, тип-кортеж, переименованный тип, тип-массив и тип-язык, но (что также удивительно) нет типа-отношения. Однако в системе имеется возможность вводить новые генераторы типов.
25.15.DeWitt D.J., Karba N., Luo J., Patel J.M., Yu J.-B. Client-Server Paradise // Proc. 20th Int. Conf. on Vary Large Data Bases. — Santiago, Chile, September, 1994. Система Paradise (Parallel Data Information System — информационная система параллельных данных)— это разработанный в Висконсинском университете объектно-реляционный прототип системы, "созданный для ГИС-приложений" (ГИС — геоинформационная система). В статье описаны архитектура и реализация системы Paradise.
25.16.Godfrey М., Mayr Т., Seshadri P. and Thorsten von Eichen. Secure and Portable Database Extensibility // Proc. 1998 ACM SIGMOD Int. Conf. on Management of Data. — Seattle, Wash, June, 1998.
"Поскольку операторы, определяемые пользователем, поставляются неизвестными или ненадежными клиентами, в СУБД должны быть предусмотрены меры предосторожности по отношению к операторам, которые могут разрушить систему, модифицировать ее файлы или непосредственно память (в обход механизма санкционирования), монополизировать центральный процессор, память или дисковые ресурсы" (цитата несколько изменена). Очевидно, необходим дополнительный контроль. В этой статье рассказывается об исследованиях данного вопроса с использованием языка Java и объектно-реляционного прототипа PREDATOR [25.24]. В обнадеживающем заключении говорится, что система базы данных "может поддерживать безопасные и переносимые расширения с использованием языка Java без значительных потерь в производительности".
25.17.Haas L.M., Freytag J.C., Lohman G.M., Pirahesh Н. Extensible Query Processing in Starburst // Proc. ACM SIGMOD Intern. Conf. on Management of Data. — Portland, Ore., June, 1989.
В работе представлены цели расширенного проекта Starburst [25.21]: "В Starburst предусмотрено добавление новых методов хранения таблиц, новых типов доступа и ограничений целостности, новых типов данных, функций и новых операций с таблицами". При этом система делится на два основных компонента, Core и Corona, которые соответствуют компонентам RSS и RDS оригинальной системы System R [4.2]. В компоненте Core поддерживаются функции расширения, описанные в [25.21], а в компоненте Corona— язык запросов Hydrogen, который является диалектом языка SQL. В этом диалекте исключено большинство ограничений реализации языка SQL, принятого в системе System R, он более независим, поддерживает рекурсивные запросы и может быть расширен пользователем. В статье содержится интересное обсуждение проблемы "переписывания запросов", т.е. правил преобразования выражений (см. главу 17). Об этом также можно прочесть в [17.50].
25.18.Hellerstein J.M., Naughton J.F. Query Execution Techniques for Caching Expensive Methods // Proc. 1996 ACM SIGMOD Int. Conf. on Management of Data. — Montreal, Canada, June, 1996.
25.19.Kim W. On Marrying Relations and Objects: Relation-Centric and Object-Centric Perspectives // Data Base Newsletter. — November/December, 1994. — 22, № 6.
В этой статье приводятся аргументы, оспаривающие мнение, согласно которому отождествление переменных-отношений и классов— серьезная ошибка ("первая грубейшая ошибка"). Статья [25.12] — ответ на данную статью.
25.20.Kim W. Bringing Object/Relational Down to Earth // DBP&D. — July, 1997.— 10, №7.
В этой статье автор утверждает, что на рынке объектно-реляционных систем "путаница наверняка будет продолжаться", поскольку, во-первых, "на расширения типов данных была взвалена непомерная ноша" и, во-вторых, "степень полноты объектно-реляционных продуктов... вызывает серьезные опасения". Предлагается "практическая метрика объектно-реляционной полноты, которая может быть использована как руководство для определения, является ли продукт действительно объектно-реляционным". В схему автора включаются следующие критерии.
Модель данных
Язык запросов
Критические к сбоям службы
Вычислительная модель
Производительность и масштабируемость
Инструменты базы данных
Полнота использования вычислительной
мощности
Отдавая должное первому критерию (самому важному), Ким придерживается точки зрения (отличной от той, которая представлена в Третьем манифесте [3.3]), что модель данных должна быть "основной объектной моделью, определенной группой Object Management Group (OMG)", которая "включает реляционную модель данных, а также основные концепции объектно-ориентированного моделирования объектно-ориентированных языков программирования". По мнению Кима, сюда входят следующие понятия: класс (в статье добавляется "или тип"), экземпляр, атрибут, ограничения целостности, идентификаторы объектов, инкапсуляция, (множественное) наследование классов, (множественное) наследование ADT, данные типа ссылок, атрибуты со значениями-множествами, атрибуты классов, методы классов и т.п. Заметим, что отношения, которые мы относим и к критическим, и к фундаментальным понятиям, нигде явно не упоминаются. Ким утверждает, что основная объектная модель группы OMG в дополнение ко всему перечисленному в списке полностью включает реляционную модель, хотя на самом деле это не так.
25.21.Lindsay В., McPherson J., Pirahesh Н. A Data Management Extension Architecture // Proc. ACM SIGMOD Intern. Conf. on Management of Data. — San Francisco, Calif., May, 1987.
В работе описана архитектура прототипа системы Starburst, в котором "реализованы расширения управления данными для реляционных СУБД". Описаны два типа таких расширений: на основе определенных пользователем структур хранения и методов доступа, а также на основе определенных пользователем ограничений целостности (но непременно все ограничения целостности должны быть определены пользователем?) и триггерных процедур. Однако "помимо этих, существуют также другие направления расширения СУБД, включая определенные пользователем абстрактные типы данных и технологии оценки запросов". 25.22.Lohman G.M. et al. Extensions to Starburst: Objects, Types, Functions and Rules // CACM. — October, 1991. — 34, № 10.
25.23. Maier D. Comments on the Third-Generation Database Sytem Manifesto // Tech. Report No. CS/E 91-012. — Oregon Gradulate Center, Ore. — April, 1991. Майер весьма критичен буквально ко всему материалу статьи [25.34]. Мы согласны с некоторыми его критическими замечаниями, но не согласны с остальными. Однако нас заинтересовали следующие высказывания (в них поддерживается наша точка зрения, что концепция объектов содержит лишь одну хорошую идею, а именно — надлежащую поддержку типов данных): "Многие из нас добивались очищения теории объектно-ориентированных систем баз данных от сути "объектной ориентированности"... Мои взгляды на то, что является наиболее важным в объектно-ориентированных базах данных, менялись с течением времени. Сначала я думал, что это было наследование и модель сообщений. Позже я пришел к выводу, что идентичность объектов, поддержка сложного состояния и инкапсуляция поведения более важны. Но в последнее время, когда я услышал мнение пользователей объектно-ориентированных СУБД о том, чему они придают наибольшее значение в таких системах, я считаю, что решающее — это возможность расширения типа. Идентичность, сложное состояние и инкапсуляция по-прежнему важны, но лишь настолько, насколько они поддерживают создание новых типов данных". 25.24.Patel J. et al. Bilding a Scalable Geo-Spacial DBMS: Technology, Implementation, and Evaluation // Proc. ACM SIGMOD Int. Conf. on Management of Data. — Tucson, Ariz. — May, 1997.
Цитата из резюме: "В этой статье представляется ряд методов для распараллеливания геокосмических систем баз данных и обсуждается их реализация в объектно-реляционной системе баз данных Paradise" [25.15].
25.25. Ramakrishnan R. Database Management Systems. — Boston, Mass.: McGraw-Hill. — 1998.
25.26.Rowe L.A., Stonebraker M.R. The Postgres Data Model // Proc. 13th Int. Conf. on Vary Large Data Bases. — Brighton, UK. — September, 1987.
25.27.Samet H. The Design and Analysis of Spatial Data Structures.— Reading, Mass.: Addison-Wesley, 1990.
25.28. Saracco CM. Universal Database Management: Guide to Object/Relation Technolody. — San Francisco, Calif.: Morgan Kaufrnann, 1999.
Интересный обзор, написанный на высоком уровне. Однако отметим, что его автор не отвергает (как, кстати, и Стоунбрейкер в [25.31]) очень сомнительную форму наследования, включающую версию идеи подтаблиц и супертаблиц (о которой мы отзываемся весьма скептически в начале [13.12]). Данная версия существенно отличается от последней версии, включенной в язык SQL3. Поясним это на примере. Предположим, что таблица PGMR (программисты) определена как подтаблица таблицы ЕМР (служащие). Тогда Саракко и Стоунбрейкер считают, что таблица ЕМР содержит строки лишь для служащих, которые не являются программистами, в то время как в языке SQL3 эта таблица воспринималась бы как содержащая строки для всех служащих (см. приложение Б). 25.29.Seshadri P., Paskin М. PREDATOR: An OR-DBMS with Enhanced Data Types // Proc. 1997 ACM SIGMOD Int. Conf. on Management of Data. — Tucson, Ariz., May, 1997. Суть системы PREDATOR— предоставить механизм для каждого типа данных, чтобы можно было задавать семантику их методов. Эта семантика затем используется для оптимизации запросов.
25.30.Stonebraker М. The Design of the POSTGRES Storage System // Proc. 13th Intern. Conf. on Very Large Data Bases. — Brighton, UK, September, 1987.
25.31.Stonebraker M., Brown P. (with Moore D.) Object/Relational DBMSs: Tracking the Next Great Wave (2nd edition). — San Francisco, Calif: Morgan Kaufrnann, 1999. Эта книга представляет собой руководство по объектно-реляционным системам. В большой степени — фактически почти исключительно — она базируется на продукте Universal Data Option для СУБД Informix's Dynamic Server. Этот продукт основывается на более ранней системе, которая называлась Illustra (коммерческий продукт, в разработке которого Стоунбрейкер лично принимал участие). В [3.3] можно найти дополнительный анализ и критику этой книги. См. также аннотацию к [25.28].
25.32. Stonebraker M, Kemnitz G. The Postgres Next Generation Database Management System // CACM. — October, 1991. — 34, № 10.
25.33.Stonebraker M., Rowe L.A. The Design of Postgres // Proc. ACM SIGMOD Intern. Conf. on Management of Data. — Washington, D.C., June, 1986.
В работе приведены основные цели создания системы Postgres.
Обеспечение усовершенствованной поддержки сложных объектов.
Обеспечение расширяемости типов данных, операторов и методов доступа.
Обеспечение активных инструментов базы данных (аварийных и пусковых), а также поддержка логических выводов.
Упрощение кода СУБД для восстановления после разрушения системы.
Проектирование СУБД с учетом преимуществ оптических дисков, многопроцессорных рабочих станций и специальных чипов на основе сверхбольших интегральных схем.
Минимальное количество изменений реляционной модели (а может быть, даже отсутствие изменений).
25.34.Stonebraker М. et al. Third Generation Database System Manifesto // ACM SIGMOD.— September, 1990. — 19, № 3.
Отчасти эта работа противопоставляется [24.1], в которой, между прочим, по существу, полностью игнорируется реляционная модель. Цитата: "Системы второго поколения внесли большой вклад в развитие непроцедурного доступа к данным и независимости от данных, и этим вкладом нельзя пренебрегать при разработке систем третьего поколения". Приведенные ниже положения являются, по сути, требованиями (в некоторой степени перефразированными), которые предъявляются к "СУБД третьего поколения".
1. Обеспечение традиционных служб базы данных, а также более развитых объ- ектных структур и правил
Система с более развитыми типами
Наследование
Функции и инкапсуляция
Необязательные идентификаторы кортежей
Правила (например, правила целостности), не связанные с конкретными объектами
2. Преемственность СУБД второго поколения
Использование путей для адресации объектов только в крайнем случае
Определения интенсиональных и экстенсиональных множеств (которые означают коллекции, автоматически поддерживаемые со стороны системы, и коллекции, поддерживаемые вручную пользователем)
Обновляемые представления
Кластеризация, индексирование и т.д., скрытые от пользователя
3. Поддержка открытых систем
Поддержка нескольких языков
Ортогональная перманентность типов
Поддержка языка SQL
Запуск запросов и вывод результатов, осуществляемые на самом низком уровне общения между клиентом и сервером
В [3.3] содержатся подробный анализ и критика этой статьи. См. также [25.23]. Замечание. Кстати, сейчас можно пояснить, почему Третий манифест называется третьим... Он был написан именно после двух предыдущих манифестов (см. [24.1] и [25.34]) и, мы надеемся, что заменил их.
25.35.Wilkes M.V. Software and the Programmer // CACM. — May, 1991. — 34, № 5.
Приложения
В приложении А приводятся подробные сведения о синтаксисе и семантике выражений языка SQL/92, что позволяет использовать его как соответствующий справочник. В приложении Б содержится обзор основных функций языка SQL3, в частности "объектных" и "объектно-реляционных". В приложении В представлен перечень наиболее важных сокращений и специальных символов, используемых в данной книге, вместе с кратким описанием их значения.
Приложение
выражения языка
АЛ. Введение
Выражения языка SQL, точнее — табличные, условные и скалярные SQL-выражения, составляют основу этого языка. В данном приложении детально описаны синтаксис и семантика подобных выражений (в соответствии со стандартом SQL/92). Однако необходимо сразу же отметить, что названия синтаксических категорий и конструкций языка SQL чаще всего отличаются от тех, которые употребляются в самом стандарте SQL/92 (см. [4.22]). Такой подход выбран потому, что используемые в стандарте термины часто не совсем удачны, в частности сами термины табличное выражение, условное выражение и скалярное выражение не являются стандартными.
А. 2. Табличные выражения
Сначала представим BNF-грамматику для выражений типа <табличное выраженчё>. В грамматике полностью исключены опции, имеющие отношение к NULL-значениям (см. раздел 18.7 главы 18). Отметим, что в данном приложении широко используются соглашения о списках, которые были представлены в разделе 4.6 главы 4.
<табпичное выражение>
::= ^выражение соединения таблиц> | <выражение без соединения таблицу
<выражение соединения таблицу
::= <ссыпка на таблицу> [ NATURAL ] JOIN <ссылка на таблицу> [ ON <условное выражение> j USING ( <список имен столбцов> ) } | <ссылка на таблицу> CROSS JOIN <ссылка на табпщу> | (<выражение соединения таблицу)
<ссылка на таблицу>
::= <имя таблицЫ> [ [ AS ] <имя переменной диапазона> [ (<список имен столбцов>) ] ] | (<табличное выражение> ) [ AS ] <перемежая диапазона>
[ {<список имен столбцов> ) } | <выражение соединения таблиц>
<выражение без соединения таблиц> ::= <терм без соединения таблицу
| <табпичное выражение> UNION [ ALL ]
[ CORRESPONDING [ BY (<список имен столбцозУ ) ] ]
<табличный терм> | <табличяое выражение> EXCEPT [ ALL ] [ CORRESPONDING [ BY {<список имен стол6цов>) ] ]
<табличвый терм>
<терм без соединения таблицу
::= <первичная таблица без соединения > | табличный терм> INTERSECT [ ALL ] [ CORRESPONDING [ BY (<список имен столбцов> ) } ] <первичная таблица>
<та6личный теры>
::= <терм без соединения таблицу | <выражение соединения таблицу
<первичная таблица>
::- <первичная таблица без соединения > | <выражение соединения таблицу
<первичная таблица без соединения > ::= TABLE <имя таблицыУ <конструктор таблицьо <выражение выборкиУ (<выражение без соединения таблицу )
<конструктор таблице
;:= VALUES <список конструкторов строку
<конструктор строку
::= <скалярное зыражениеУ
(<список скалярных аыраженийУ ) (<табличное выражение> )
<выражение выборкиУ
::= SELECT [ ALL | DISTINCT ] <список выбираемых элементовУ FROM <список ссылок на таблицыУ [ WHERE <условное выражениеУ ]
[ GROUP BY <список имен стопбцоаУ ] [ HAVING <условное выражениеУ ]
<зыбираемый элементу
::= <скалярное выражениеУ [ [ AS ] <столбецУ ] | [ <переменная диапазонаУ . ] *
Рассмотрим конкретный случай, бесспорно, наиболее важный на практике, а именно — выражения типа <выражение выборкиУ. Их можно рассматривать, хотя и упрощенно, как выражения типа <табпичное выражениеУ, которые не содержат ключевых слов
JOIN, UNION, EXCEPT и INTERSECT. Мы говорим "упрощенно", поскольку, разумеется, такие операторы могут включаться в выражения, которые вложены в рассматриваемое выражение типа <выражение выборки>. Предложения JOIN, UNION, EXCEPT и INTERSECT подробно обсуждаются в разделе 7.7 главы 7.
Как видно из приведенного выше определения, выражение типа <выражение выборки> включает в указанной последовательности предложения SELECT, FROM и необязательные предложения WHERE, GROUP BY и HAVING. Рассмотрим их поочередно.
Предложение SELECT
Предложение SELECT имеет следующий вид
SELECT [ ALL | DISTINCT ] <список выбираемых элементов>
Пояснения
Параметр <список выбираемых эпементов> не должен быть пустым (формат параметра <вы6ираемый элемент> рассматривается ниже).
Если уточнения ALL и DISTINCT не указаны, то по умолчанию подразумевается ALL.
Допустим, предложения FROM, WHERE, GROUP BY и HAVING уже обработаны. Не имеет значения, какие из них указаны и какие опущены; концептуальный результат обработки этих предложений всегда будет таблицей (возможно, "сгруппированной" таблицей, что поясняется ниже). Обозначим эту таблицу как Т1, хотя такой промежуточный концептуальный результат на самом деле не имеет имени.
Пусть таблицей Т2 будет таблица, которая является производной от Т1 и была получена посредством вычисления заданных параметров <выбираемый элемеит> для таблицы Т1 (см. ниже).
Пусть таблица ТЗ будет таблицей, которая является производной от Т2. Таблица ТЗ получается посредством исключения лишних дублирующих строк из таблицы 12, если указано ключевое слово DISTINCT, или идентична таблице Т2 в противном случае.
Полученная таблица ТЗ представляет собой окончательный результат выполнения всей операции.
Рассмотрим допустимые значения параметра <выбираемый элементу. Возможны два случая, причем второй случай представляет собой просто сокращение для списка элементов выборки первого вида. Таким образом, первый случай по сути является основным.
Случай 1. Параметр <выбираемый элементу принимает следующий вид.
<скалярное выражениё> [ [ AS ] <столбец> ]
Параметр <скалярное выражение> обычно (но необязательно) задает один или несколько столбцов таблицы Т1 (см. приведенный выше п. 3). Для каждой строки таблицы Т1 указанное скалярное выражение в результате вычисления дает некоторое скалярное значение. Список таких результатов (соответствующих вычислению всех заданных параметров <выбираемый элемент> в предложении SELECT для одной строки таблицы Tl) составляет одну строку таблицы Т2 (см. приведенный выше п. 4). Если параметр <выбираемый элемент> включает предложение AS, то неуточненное значение параметра
<стол6ец> из этого предложения присваивается в качестве имени соответствующему столбцу таблицы Т2 (необязательное ключевое слово AS является лишним и может быть опущено без какого-либо ущерба). Если же параметр <вы6яраетй элемент> не включает предложение AS, то, если он содержит просто (возможно, уточненное) имя <стол6ец>, это имя назначается соответствующему столбцу таблицы Т2. В противном случае соответствующий столбец таблицы Т2 фактически не будет иметь имени (на самом деле присваивается имя, "зависящее от реализации"; см. [4.19], [4.22]). Рассмотрим некоторые дополнительные аспекты.
Поскольку используется имя столбца именно таблицы Т2, а не Т1, представленное предложением AS имя не может употребляться в предложениях WHERE, GROUP BY и HAVING, включаемых непосредственно в конструкцию таблицы Т1. Однако на это имя можно ссылаться в предложении ORDER BY (в частности, при определении курсора в предложении DECLARE CURSOR), а также во "внешнем" выражении типа <та6личяое выражение>, которое содержит рассматриваемое выражение типа <выражение зы6орки> как вложенное.
Если некоторый параметр <выбираешй элемент> включает вызов оператора обобщения и параметр <выражение выборкй> не включает предложение GROUP BY (см. ниже), то ни один параметр <вы6ираешй элемент> в предложении SELECT не может включать никаких ссылок на столбец таблицы Т1, кроме случаев, когда такая ссылка является аргументом (или частью аргумента) в вызове оператора обобщения.
Случай 2. Параметр <выбираемый элемент> принимает следующий вид.
г
[ <перемевяая диапазона> . ] *
Если уточнение опущено, т.е. элемент выборки <вы6яраемый элемент> представляет собой просто неуточненный символ "*", такой элемент выборки должен быть единственным элементом выборки в предложении SELECT. Этот вид элемента выборки является сокращением для списка всех имен столбцов таблицы Т1 в порядке их следования слева направо. Если используется уточнение и параметр <выбираемый элемент> представляет собой символ "*", уточненный именем переменной кортежа R, т.е. "J?.*", то такой параметр представляет список имен столбцов для всех столбцов таблицы, соответствующей переменной кортежа R, в порядке их следования слева направо. (Напомним, что, как указывалось в разделе 7.7, имя таблицы может использоваться и часто используется, как явная переменная кортежа. Поэтому параметр <выбираетй элемент> чаще представляется в виде "Т.*", а не в виде "J?.*".)
Предложение FROM
Предложение FROM имеет следующий вид. FROM <список ссылок яа табляцы>
Параметр <список ссылок яа таблицы> не должен быть пустым. Пусть указанный список ссылается на таблицы А, В, ... С. Тогда результат вычисления предложения FROM будет представлять таблицу, которая равна декартову произведению таблиц Л, В,... С.
Замечание. Напомним, что декартово произведение одной таблицы Т совпадает с самой таблицей Т (см. упр. 6.12 в главе 6). Иначе говоря, в предложении FROM допускается наличие лишь одного параметра <ссылка на таблицуу.
Предложение WHERE
Предложение WHERE имеет следующий вид. WHERE <условное выражение>
Пусть таблица Т представляет собой результат вычисления непосредственно предшествующего предложения FROM. Тогда результат вычисления предложения WHERE является таблицей, производной от таблицы Т. Результирующая таблица формируется путем исключения из таблицы Т всех строк, для которых вычисление выражения, заданного параметром <условное выражение>, дает ложь. Если предложение WHERE опущено, результатом будет просто таблица Т.
Предложение GROUP BY
Предложение GROUP BY имеет следующий вид. GROUP BY <список имен столбцов>
Параметр <список имен столбцов> не должен быть пустым. Пусть таблица Т представляет собой результат вычисления непосредственно предшествующих предложений FROM и WHERE (если такие имеются). Каждый параметр <имя стол6ца>, указанный в предложении GROUP BY, должен являться именем столбца (необязательно уточненным) таблицы 2". Результат вычисления предложения GROUP BY представляет собой сгруппированную таблицу, т.е. множество групп строк, производных от строк таблицы Т, посредством ее концептуального переупорядочения в минимальное количество групп, в которых все строки имеют одно и то же значение для сочетания столбцов, определяемых предложением GROUP BY. Подчеркнем, что результат будет "ненастоящей таблицей", поскольку он представляет таблицу групп, а не таблицу строк. Однако предложение GROUP BY никогда не используется без соответствующего предложения SELECT, назначение которого заключается в получении настоящей таблицы (т.е. таблицы строк) из таблицы групп, так что такое временное отклонение от реляционных правил является лишь небольшим изъяном.
Если параметр <выражение выборки> включает предложение GROUP BY, то на вид соответствующего предложения SELECT накладываются определенные ограничения. А именно, каждый параметр <вы6ираемый элементу в предложении SELECT, включая любой элемент, который подразумевается под сокращением "*", должен принимать единственное значение в пределах каждой группы. Поэтому параметры <выбираемый элементу не должны включать никаких ссылок на столбцы таблицы Т, которые не указаны в самом предложении GROUP BY, за исключением такой ссылки, которая представляет собой аргумент, или часть аргумента, в вызове оператора обобщения (поскольку в результате такого вызова некоторое множество скалярных значений в группе сводится к одному скалярному значению).
Предложение HAVING
Предложение HAVING имеет следующий вид. HAVING <условное выражение>
Пусть G— сгруппированная таблица, полученная в результате вычисления непосредственно предшествующих предложений FROM, WHERE (если оно задано) и GROUP BY (если они заданы). Если предложение GROUP BY не указано, то таблица G будет результатом вычисления только предложений FROM и WHERE и будет рассматриваться как сгруппированная таблица, которая содержит ровно одну группу5. Другими словами, в этом случае имеется неявное концептуальное предложение GROUP BY, в котором не указано никаких группируемых столбцов. Результат вычисления предложения HAVING является таблицей, производной от таблицы G путем исключения всех групп, для которых вычисление выражения, заданного параметром <условное выражениё>, дает в результате значение ложь.
Приведем некоторые особенности использования предложения HAVING.
Если предложение HAVING опущено, а предложение GROUP BY указано, результатом будет просто таблица G. Если оба предложения, HAVING и GROUP BY, опущены, результатом будет просто "настоящая", т.е. не сгруппированная, таблица Г, которая будет получена в результате вычисления предложений FROM и WHERE.
Любое выражение типа <скалярное выражение> в предложении HAVING должно иметь одно значение в группе (как и скалярное выражение в предложении SELECT, если имеется предложение GROUP BY).
Подробный пример
В заключение нашего обсуждения выражений типа <выражение вмборки> рассмотрим достаточно сложный пример. С его помощью будут проиллюстрированы некоторые (но отнюдь не все) особенности, объяснявшиеся выше. Сформулируем запрос: "Для каждой красной и синей demaiu, которых в сумме поставлено более 350 штук (исключая из всех поставок demaiu, количество которых меньше ши равно 200 штук), определить номер, вес в граммах, цвет и максимальное количество ". Приведем возможную формулировку этого запроса на языке SQL.
SELECT P.Pi,
'Вес в граммах =' AS ТЕХТ1, P.WEIGHT * 454 AS GMWT, P.COLOR,
'Максимальное количество =' AS TEXT2,
MAX ( SP.QTY ) AS MXQTY FROM P, SP WHERE P.Pi = SP.Pi
AND { P.COLOR = 'Red' OR P.COLOR = 'Blue' )
AND SP.QTY > 200
GROUP BY P.Pi, P.WEIGHT, P.COLOR
HAVING SUM ( SP.QTY ) > 350 ;
Пояснения. Прежде всего необходимо отметить, что (как объяснялось в предыдущем подразделе) предложения типа <выражевие вы6орш> концептуально вычисляются в том порядке, в котором пишутся, за исключением самого предложения SELECT, которое вычисляется последним. Поэтому можно считать, что результат нашего примера будет формироваться следующим образом.
FROM. Вычислив предложение FROM, получим новую таблицу, которая является декартовым произведением таблиц Р и SP.
WHERE. Результат выполнения шага 1 преобразуется путем исключения всех строк, которые не удовлетворяют условию, указанному в предложении WHERE. В данном примере это строки, которые не удовлетворяют следующему условному выражению.
P.Pi = SP.Pi AND ( P.COLOR = 'Red' OR P.COLOR = 'Blue' )' AND SP.QTY > 200
3. GROUP BY. Результат выполнения шага 2 группируется по значениям столбцов, ко- торые указаны в предложении GROUP BY. В данном примере это столбцы Р.Р#, P.WEIGHThP.COLOR.
Замечание. Теоретически здесь для группирования было бы достаточно одного столбца Р.Pi, поскольку столбцы P.WEIGHT и P.COLOR имеют лишь одно значение для каждого номера детали, т.е. они функционально зависимы от номера детали. Однако язык SQL "не знает" об этом факте, и возникнет ошибка, если в предложении GROUP BY столбцы P.WEIGHT и P.COLOR будут опущены, поскольку они упомянуты в предложении SELECT. (См. статью [10.6], где обсуждается этот вопрос.)
4. HAVING. Из результата выполнения шага 3 исключаются группы, которые не удов- летворяют заданному условному выражению.
SUM ( SP.QTY ) > 350
5. SELECT. Каждая образованная в результате выполнения шага 4 группа порождает одну итоговую строку, причем следующим образом. Во-первых, из группы извле- каются атрибуты "номер детали", "вес", "цвет" и "максимальное количество". Во- вторых, значение веса преобразуется в граммы по заданной формуле. В-третьих, в соответствующие места в строке вставляются две символьные строки: 'Вес в граммах =' и 'Максимальное количество ='. В отношении фразы "вставляются в соответствующие места в строке" заметим, что мы полагаемся здесь на принятую в языке SQL упорядоченность столбцов таблицы слева направо. Эти текстовые стро- ки потеряют всякий смысл, если не будут помещены в "соответствующие места".
Конечный результат будет подобен приведенному ниже.
Р# |
ТЕХТ1 |
GMWT |
COLOR |
TEXT2 |
MXQTY |
Р1 |
Вес в граммах — |
5448 |
Red |
Макс, количество = |
300 |
Р5 |
Вес в граммах = |
5448 |
Blue |
Макс, количество = |
400 |
РЗ |
Вес в граммах = |
7718 |
Blue |
Макс, количество = |
400 |
Не забывайте, что описанный выше алгоритм был приведен исключительно как концептуальное объяснение того, как в языке SQL должно вычисляться выражение типа <выражение вы6орки>. Этот алгоритм, безусловно, корректен, в том смысле, что он гарантирует получение правильного результата. Однако буквальное следование данному алгоритму при его реализации было бы неэффективным. Например, необходимо считать очень неудачным решением реальное вычисление в системе декартова произведения таблиц на шаге 1. Именно соображения, подобные приведенному, послужили причиной появления в реляционных системах оптимизаторов, обсуждавшихся в главе 17. Фактически основная задача оптимизатора в SQL-системе заключается в том, чтобы найти такую процедуру реализации, которая давала бы тот же результат, что и концептуальный алгоритм, кратко описанный выше, но была бы эффективнее его.
А.З. Условные выражения
Подобно выражениям типа <та6личвое выражениеУ. выражения типа <условное выражениеУ используются в различных контекстах языка SQL, в частности в предложении WHERE при определении требуемых или исключаемых строк для последующей обработки6. В этом разделе будут рассмотрены некоторые наиболее важные особенности данного типа выражений. Заметим, однако, что здесь, разумеется, не ставилась задача исчерпывающе осветить этот вопрос. В частности, не рассмотрены особенности обработки NULL-значений. Как указывалось в главе 18, если учитывать наличие NULL-значений, то для выражений типа <условвое выражение> потребуется существенно более расширенное толкование. Некоторые форматы условного выражения, которые не приводятся в этом приложении, относятся исключительно к аспектам, связанным с поддержкой NULL-значений. Однако данные аспекты обсуждались в главе 18.
Как и в предыдущем разделе, начнем с BNF-грамматики. Затем перейдем к обсуждению некоторых специфических случаев, а именно— параметров <условие like>, <условие match>, <условие all или апу> и <условие unique>, которые будут рассмотрены более подробно (все другие случаи или обсуждались ранее в этой книге, или настолько просты и понятны, что не требуют разъяснений).
<условное выражение> ::= <терм условияУ
| <условное выражениё> OR <терм условияУ
<терм условияУ
::= <фактор условия>
| <терм условияУ and <фактор условия>
<фактор условияУ
::= [ NOT ] <первичное условие>
<первичвое условие>
::= <простое условиёУ \ (<условное выражениеУ )
<простое условие»
<условие сравнения» <условие in> <условие Ике» <условие match> <условие all или апу> <условие exists> <условие unique>
<условие сравнения»
:;= <конструктор строки»
<оператор сравнения> <конструктор строкй>
<оператор сравнения>
-.:= = | < | <= | > | >= | о
<условие in>
::= <конструктор строки> [ NOT ] IN (<табличное выражениё> ) | <скалярное выражение> [ NOT ] IN
(<список скалярных выражение )
<условие like>
:: = <выражение из символьных строк> [ NOT ] LIKE <шаблон>
[ ESCAPE <исключения> ]
<условие match>
::= <конструктор строки» MATCH UNIQUE {<табличное выражение> )
<условие all или апу>
::= <конструктор строки>
<оператор сравнения» ALL (<табличное выражение» ) | <конструктор строки»
<оператор сравнения» ANY (<та6личное выражение» )
<условие exists>
::= EXISTS (<та6личное выражение» )
<условие unique»
::= UNIQUE (<та6личное выражение» )
Условие LIKE
Условия LIKE предназначены для простой проверки соответствия символьных строк заданному шаблону. Еще раз приведем синтаксис этого условия.
<выражение из символьных строк» [ NOT ] LIKE <шаблон»
[ ESCAPE <исключение> ]
Здесь параметр <ша6лон> представляет собой произвольное выражение наподобие символьной строки, а параметр <исключение> (если указана фраза ESCAPE) — выражение наподобие символьной строки, которое в результате вычисления дает единственный символ. Рассмотрим пример.
SELECT P.PI, P.PNAME FROM Р
WHERE P.PNAME LIKE 'C%';
Это сформулированный на языке SQL запрос "Определить номера и наименования деталей, назвавания которых начинаются с буквы С". Результат выполнения запроса представлен ниже.
р# |
PNAME |
Р5 |
Cam |
Р6 |
Cog |
Поскольку предложение ESCAPE не указано, символы в параметре <шаблон> интерпретируются так.
Символ подчеркивания "_" задается для любого отдельного символа.
Символ процента "4" устанавливается для любой последоватечьности из п символов, где л может быть равно нулю.
Все остальные символы представляют сами себя.
В данном примере по запросу будут возвращены строки из таблицы Р, для которых значение в столбце PNAME начинается с большой буквы "С", за которой следует произвольная последовательность символов (в количестве, большем либо равном нулю).
Приведем еще несколько примеров.
ADDRESS LIKE Дает результат истина, если в любом месте значения в столб-
' ^Berkley' це ADDRESS содержится строка "Berkley"
SI LIKE 'S ' Дает результат истина, если значение в столбце St состоит
ровно из трех символов и первый символ — "S"
PNAME LIKE '%С ' Дает результат истина, если значение в столбце PNAME состоит
из четырех или более символов и последним трем предшествует символ "С"
MYTEXT LIKE '=_%' Дает результат истина, если значение в столбце MYTEXT начи-ESCAPE '=' нается с символа подчеркивания (см. ниже)
В последнем примере символ "=" указан как символ исключения, означающий, что специальное назначение для символов "I" и "_" может быть отменено, если им будет предшествовать символ "=".
И наконец отметим, что в предложении LIKE <условие like> условие вида
х NOT LIKE у [ ESCAPE Z ]
определяется как равносильное следующему.
NOT ( X LIKE у [ ESCAPE Z ] )
Условие MATCH
Параметр <условие match> имеет следующий формат. <конструктор строки» MATCH UNIQUE (<табличное выражение» )
Пусть rl — строка, которая получается в результате вычисления значения параметра <конструктор строки», и пусть Т— таблица, которая получается в результате вычисления выражения в параметре <та6лйчное выражение». Тогда условие, определенное параметром <условие match>, будет истинным, если и только если таблица Г содержит ровно одну строку (скажем, г2), такую, что операция сравнения
rl = г2
дает для нее результат истина. Приведем пример.
SELECT SP.* FROM SP
WHERE NOT ( SP.Sf MATCH UNIQUE { SELECT S.Sf FROM S ) ) ;
Это сформулированный на языке SQL запрос "Найти поставки, которые выполнятся более чем одним поставщиком из таблицы поставщиков". Он может быть полезен при проверке целостности базы данных, поскольку, если база данных корректна, таких поставок, безусловно, не должно быть. Отметим, что для выполнения этой же проверки могло бы использоваться условие принадлежности (вхождения) <условие in>.
Кроме того, в фразе MATCH UNIQUE ключевое слово UNIQUE может быть опущено, но тогда фраза MATCH превратится в синоним фразы IN (по крайней мере, если не учитывать NULL-значения).
Условие ALL или ANY
Параметр <условие all или апу» имеет следующий общий синтаксис.
<конструктор строки» <оператор сравнения» <квалификатор>
(<табличное выражение» )
Здесь параметр <оператор сравнения» представляет любой оператор из обычного набора операторов сравнения (=, о и т.д.), а уточнение <квалификатор> может иметь значение ALL или ANY. В общем случае параметр <условие all или апу» принимает значение истина, если и только если результат соответствующего сравнения при значении квалификатора ALL (либо ANY) является истиной для всех (соответственно для каких-нибудь) строк в таблице, определяемой значением параметра <таблнчное выражение». (Если таблица пуста, то условие ALL всегда дает значение истина, а условие ANY — значение ложь). Приведем пример: "Определить наименования деталей, вес которых больше, чем вес любой из голубых деталей".
SELECT DISTINCT PX.PNAME FROM P AS PX
WHERE PX.WEIGTH > ALL ( SELECT PY.WEIGTH
FROM P AS PY
WHERE PY.COLOR = 'Blue' ) ;
Для данных нашего обычного примера результат будет таким.
PNAME Cog
Пояснения. Вложенный параметр <табличное выражевие> возвращает множество значений веса голубых деталей. Внешнее предложение SELECT возвращает наименования тех деталей, вес которых больше любого значения веса из указанного множества. В общем случае в конечном результате, безусловно, может содержаться любое количество наименований деталей (в том числе и нулевое).
Замечание. Здесь уместно предупредить читателя, что при использовании параметра <условие all или апу> неискушенные пользователи часто делают ошибки. В формулировке предыдущего запроса на языке SQL было бы естественнее использовать ключевое слово "любой" (ANY) вместо "каждый" (ALL), что привело бы к (неверному) использованию сравнения > ANY вместо > ALL. Аналогичные замечания справедливы и для всех остальных операторов сравнения с квалификаторами ANY и ALL.
Условие UNIQUE
Параметр <условие unique> используется для проверки, является ли каждая строка некоторой таблицы уникальной (т.е. не имеет ли дубликатов). Синтаксис этого условия следующий.
UNIQUE ( табличное выражение> )
Условие принимает значение истина, если в результате вычисления выражения, заданного параметром <табличное выражение>, получается таблица, в которой все строки различны, и ложь — в противном случае.
А.4. Скалярные выражения
В языке SQL допустимые значения параметра <скалярное выражение> образуют достаточно типичный набор и вполне самоочевидны. Здесь мы ограничимся перечнем наиболее важных операторов, которые могут быть использованы в конструкциях таких выражений, и дадим лишь несколько комментариев для операторов CASE и CAST, смысл которых, возможно, не совсем очевиден. Список операторов в алфавитном порядке выглядит так.
Арифметические операторы (+, -,
BIT_LENGTH
CASE
CAST
CARACTER_LENGTH Операция конкатенации (11) CURRENT USER LOWER
OCTETJLENGTH
POSITION
SESSION USER
SUBSTRING
SYSTEMJJSER
TRIM
UPPER
USER
Отметим, что обращение к оператору обобщения также может использоваться внутри значения параметра <скалярное выражение», поскольку такой оператор всегда возвращает скалярное значение. Более того, результат вычисления выражения, заданного параметром <табличное выражение» и заключенного в круглые скобки, также может считаться скалярным значением, поскольку в результате вычисления получается таблица ровно с одной строкой и одним столбцом.
Теперь рассмотрим операторы CASE и CAST.
Оператор CASE
Оператор CASE возвращают одно значение из указанного множества значений в зависимости от заданного условия, как, например, показано ниже.
CASE
WHEN S.STATUS < 5 THEN 'Обращаться в крайнем случае'
WHEN S.STATUS < 10 THEN 'Сомнительный'
WHEN S.STATUS < 15 THEN 'He очень хороший'
WHEN S.STATUS < 20 THEN 'Посредственный'
WHEN S.STATUS < 25 THEN 'Приемлемый'
ELSE 'Отличный'
END
Оператор CAST
Оператор CAST преобразует заданное скалярное значение в указанный скалярный тип данного, как, например, показано ниже.
CAST ( P.WEIGHT AS FLOAT )
Не все пары типов данных взаимно преобразуемы. Например, не поддерживаются преобразования между числами и битовыми строками. (См. публикацию [4.22], где подробно и точно описано, какие типы данных могут быть преобразованы и в какие именно типы.)
Приложение
Обзор языка SQL3
Б.1. Введение
Язык SQL3, возможно, будет утвержден как стандарт (SQL/99) приблизительно в то время, когда будет напечатана эта книга. Однако мы не стали ранее при его обсуждении основываться на версии SQL3 по причинам, которые указывались в главе 4, а также потому, что рассматриваем язык SQL3, мягко говоря, как какое-то недоразумение, как бы его ни защищали. С другой стороны, мы сочли необходимым включить в эту книгу обзор по крайней мере наиболее важных особенностей языка SQL3.
В языке SQL3, конечно, имеются все функциональные возможности, предусмотренные стандартом SQL/92, за исключением некоторых второстепенных (ни одна из них в книге не рассматривалась), которые были исключены сознательно. К ним относятся: ключевое слово SQLCODE, целые без знака вместо имен столбцов в предложении ORDER BY, "представители" идентификаторов, некоторые множества символов, определяемые пользователем, а также сопоставления, преобразования и несколько других возможностей. Но по вполне понятным причинам основное внимание здесь будет уделено тем возможностям, которые были добавлены после 1992 года, и для удобства обсуждения под "языком SQL3" далее мы будем подразумевать именно эти возможности. Из них, несомненно, наиболее важными являются возможности, которые связаны с типами данных, определяемыми пользователем (мы рассмотрим их в разделах Б.2-Б.5). Самые важные из других возможностей будут представлены в разделе Б.6.
Замечание. Подробный анализ и критику по теме разделов Б.2-Б.5 можно найти в [3.3].
Прежде чем перейти к обсуждению непосредственно языка SQL3, необходимо сказать несколько слов о SQLJ [4.6]. Так неформально называют проект, в котором учитывается возможность определенной степени интеграции между языками SQL и Java (этот проект создается объединенными усилиями нескольких известных поставщиков СУБД). Часть 0 этого проекта связана с внедрением операторов языка SQL в программы на языке Java. В части 1 исследуется идея обращения к программам на языке Java из среды SQL (например, вызов хранимых процедур, которые написаны на языке Java). А в части 2 решается задача использования классов Java как типов данных языка SQL (например, в качестве основы для определения столбцов в SQL-таблицах). Ни один из этих замыслов формально не стал частью языка SQL3 как такового, но часть 0 проекта SQLJ уже была опубликована в виде первого компонента новой части 10 чернового варианта стандарта языка SQL [4.22] и, по-видимому, вскоре последуют части 1 и 2 проекта SQLJ (возможно, ко времени формального опубликования описания языка SQL3).
Также вероятно, что приблизительно в то же время появится новая версия интерфейса SQL/CLI (см. главу 4).
Необходимо сделать несколько редакционных замечаний. Во-первых, в примерах книги и, в частности, этого приложения часто используется символ "I" в наименованиях столбцов, хотя на самом деле в языке SQL3 это не допускается. Также используется точка с запятой ";" как символ завершения оператора. Во-вторых, необходимо подчеркнуть, что последующее изложение вопросов далеко не полное. И наконец, безусловно, в порядке вещей, что некоторые детали ко времени утверждения стандарта SQL3 могут измениться.
Б.2. Новые типы данных
Как указывалось в предыдущем разделе, все наиболее очевидные аспекты новизны в языке SQL3 связаны с типами данных7. Появились новые встроенные типы данных, точнее — новые встроенные скалярные типы данных, а также новые генераторы типов, которые в языке SQL3 называются конструкторами типа. Оператор CREATE TYPE позволяет пользователям определять собственные типы (конечно, имеется и соответствующий оператор DROP TYPE). Рассмотрим все эти возможности по порядку.
Встроенные скалярные типы данных
В языке SQL3 поддерживаются три новых скалярных типа данных.
■ BOOLEAN. Тип BOOLEAN — это, конечно, тип логических значений. Поддерживаются обычные логические операторы (NOT, AND, OR), а логические выражения могут использоваться, грубо говоря, везде, где обычно используются скалярные выражения. Однако отметим, что в языке SQL предполагается три логических значения, а не два, как уже указывалось в главе 18. Этим значениям соответствуют литералы TRUE, FALSE и UNKNOWN. Тем не менее тип BOOLEAN включает только два значения, а не три. Неизвестное (UNKNOWN) логическое значение представлено — совершенно неправильно! — NULL-значением. Например, присвоение значения UNKNOWN переменной типа BOOLEAN на самом деле приведет к установке ее значения равным NULL. Чтобы понять, насколько это серьезная ошибка, можно поразмышлять об аналоге числового типа, который для представления нуля использовал бы NULL-значение вместо числа нуль.
Еще одна экстравагантность заключается в том, что в языке SQL3 (удивительно!) простая ссылка на логическую переменную не считается экземпляром того, что в приложении А называлось параметром <первичное условие». Таким образом, например, если переменная В относится к типу BOOLEAN, то предложение WHERE В недопустимо!
Наряду с типом BOOLEAN в языке SQL3 вводятся два новых оператора обобщения, EVERY (Каждый) — а не ALL (Все) по какой-то причине — и ANY (Любой). В обоих случаях аргумент представляет столбец значений типа BOOLEAN (почти наверняка производный столбец, как, например, в предложении WHERE ANY (QTY > 200)). Если столбец пустой, оба оператора возвращают значение неизвестно (или, правильнее, NULL-значение)8. Если столбец не пустой, то оператор EVERY возвращает значение истина, если каждое значение в столбце — истина, и значение ложь в противном случае; а оператор ANY возвращает значение ложь, если каждое значение в столбце — ложь, и значение истина в противном случае. Как и для других операторов обобщения, NULL-значения перед выполнением операции исключаются.
CL0B ("большой символьный объект"). Этот тип представляет собой символьную строку переменной длины, по существу, неограниченного размера. Сопутствующий механизм локатора аналогичен (до некоторой степени) привычному механизму курсора и позволяет иметь доступ к отдельным частям таких строк. Многие операторы обычных символьных строк не поддерживают подобные строки. Среди тех, которые все-таки поддерживают, — "=" и LIKE.
BLOB ("большой двоичный объект"). Этот тип аналогичен предыдущему, но строки являются строками "октетов", т.е., по сути, байтов, а не символов.
Генерируемые типы
В языке SQL3 имеются следующие генераторы типов: REF, ARRAY и ROW. Однако единственный способ определить "тип REF"— неявный, представляющий собой побочный эффект определения "структурированного типа" с помощью оператора CREATE TYPE (читайте далее этот раздел). Поэтому мы пока не будем его рассматривать. Что касается генераторов типов ARRAY и ROW, то они, по существу, вообще не могут быть определены как таковые (поскольку не существует специальных операторов CREATE ARRAY TYPE и CREATE ROW TYPE). Они могут использоваться только путем обращения к соответствующему генератору типа, "подключенному", например, к оператору CREATE TABLE. Приведем пример, в котором показано, как используется тип ARRAY.
CREATE TABLE SALES
( ITEM! CHAR(5),
QTY INTEGER ARRAY [12], PRIMARY KEY ( ITEMi ) ) ;
Здесь столбец QTY представляет значения-массивы, причем каждое значение QTY является массивом из 12 элементов, каждый из которых имеет тип INTEGER.
Замечание, Массивы языка SQL ограничиваются одним измерением, и его элементы не могут быть, в свою очередь, массивами.
Ниже приведен пример запроса к определенной выше таблице SALES.
SELECT ITEMi FROM SALES WHERE QTY [3] > 100 ;
(Смысловое значение запроса — "Получить номера товаров, которые были проданы в марте в количестве, превышающем 100 единиц".) Далее следует пример вставки строки.
INSERT INTO SALES ( ITEMI, QTY ) VALUES ( 'X4320',
ARRAY [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] ) ;
(Обратите внимание на использование литерала массива.)
Типы ROW аналогичны, как, например, показано ниже.
CREATE TABLE CUST
( CUST i CHAR(3), ADDR ROW ( STREET CHAR(50), CITY CHAR(25), STATE CHAR(2), ZIP CHAR(5) ) PRIMARY KEY ( CUSTt ) ) ;
Пример запроса выглядит следующим образом.
SELECT CUSTi FROM CUST
WHERE ADDR.STATE = 'CA' ;
Далее приведен пример вставки строки.
INSERT INTO CUST ( CUSTi, ADDR )
VALUES ( '001', ROW ( '1600 Pennsylvania Ave.',
'Washington', 'DC', '20500' ) ) ;
Типы DISTINCT
С помощью нового оператора CREATE TYPE создается тип, определяемый пользователем. К нему относится или тип DISTINCT, или структурированный тип (отметим, кстати, что генерируемые типы — см. предыдущий раздел — не считаются "типами, определяемыми пользователями", в том же смысле). В данном подразделе будет рассматриваться только тип DISTINCT. Название типа DISTINCT, переводимое как "отдельный", здесь пишется прописными буквами, чтобы подчеркнуть, что это слово используется не в его обычном смысле. Тип DISTINCT ограничивается специальным случаем типа, определяемого пользователем. В частности, его физическая реализация должна включать ровно один из встроенных скалярных типов. Ниже приводится синтаксис для определения типа DISTINCT.
CREATE TYPE <имя типа>
AS <имя встроенного скалярного тнпа> FINAL [ <режим приведения» ] [ <список спецификаций методов» ] ;
Пример определения подобного пользовательского типа приведен ниже. CREATE TYPE WEIGHT AS NUMERIC (5,1) FINAL ; Пояснения
1. Тип WEIGHT наследует операторы сравнения, которые применяются к основному типу, т.е. к типу NUMERIC. Однако отметим, что значения типа WEIGHT сравнимы с другими его значениями и больше с никакими. Таким образом, если WT — SQL-переменная типа WEIGHT, следующее сравнение недопустимо.
WT > 14.7
Однако, если в параметре <режим приведение указаны соответствующие опции приведения (детали здесь не уточняются), следующие сравнения уже будут допустимыми.
WT > CAST ( 14.7 AS WEIGHT ) CAST ( WT AS NUMERIC ) > 14.7
Более того, два предыдущих обращения к преобразованию CAST могут быть приведены к виду WEIGHT (14.7) и NUMERIC (WT) соответственно.
Замечание. Имена функций WEIGHT и NUMERIC здесь указываются определителем типа (в параметре <режим приведение). Они не подразумеваются именем типа, который был определен, или именем их основного типа.
Аналогичные замечания применимы и к операции присвоения, т.е. значение типа WEIGHT может быть присвоено только результату типа WEIGHT и никакому другому.
Тип WEIGHT автоматически не наследует другие операторы от основного типа. Однако определение метода в параметре Спецификация метода> (ни один пример не приведен) позволяет определяющему тип пользователю определить "методы" (см. следующий подраздел), которые применимы к значениям и переменным типа WEIGHT. Можно, например, определить функцию ADDW, которая складывает два веса, получая третий. Поэтому пользователь может написать такие выражения.
ADDW ( WT1, WT2 )
ADDW ( WT1, WEIGHT ( 14.7 ) )
4. В определении типа должна присутствовать спецификация FINAL (см. следующий подраздел).
Структурированные типы
Еще один вид типа, определяемого пользователем, — структурированный тип. Ниже представлены два примера3.
CREATE TYPE POINT AS ( X FLOAT, Y FLOAT ) FINAL ;
CREATE TYPE LINESEG AS ( BEGIN POINT, END POINT ) FINAL ; Пояснения
Говорят, что тип POINT имеет атрибуты X и Y (не путайте с атрибутами кортежей и отношений, которые определялись в части II этой книги). Аналогично тип LINESEG также имеет атрибуты BEGIN и END. Атрибут может относиться к любому известному типу.
К сожалению, атрибуты, которые указаны в определении структурированного типа, представляют физическую реализацию его значений, а не "возможное представление" в смысле главы 5. Поэтому, например, точки BEGIN POINT и END POINT будут физически реализованы в терминах их декартовых координат.
Определение каждого атрибута автоматически приводит к определению одного оператора считывания— наблюдателя (проще говоря, оператора "get" — "получить") и одного оператора изменения —мутатора (проще говоря, оператора
На самом деле второй пример неверный, поскольку BEGIN и END— это зарезервированные слова.
"set" — "установить"), для которых используется синтаксис уточнения с помощью точки9. Пусть, например, Z, Р и LS— SQL-переменные типов FLOAT, POINT и LINESEG соответственно. Тогда допустимы следующие выражения.
Р.Х /* Получить значение компонента X точки Р */
LS.BEGIN.X /* Получить значение компонента 1*1
I* точки BEGIN сегмента линии LS */
SET Р.Х = Z ; /* Установить значение Z для */
/* компонента X точки Р */
SET LS.BEGIN.X = Z ; /* Установить значение Z для */
/* компонента X точки BEGIN */ /* сегмента линии LS */
Поскольку какие-либо дополнительные операторы не были определены, из других операторов для этих типов допустимы лишь операторы сравнения на равенство и операторы присвоения, которые допустимы для всякого типа. В частности, отметим, что "операторы-селекторы" типов POINT и LINESEG (в смысле главы 5) не определяются автоматически, поэтому нет и литералов типов POINT и LINESEG.
Уточнение FINAL означает, что любая попытка определить другой тип как собственный подтип любого из этих типов приведет к ошибке (см. раздел Б.З). Иначе говоря, оба эти типа — листовые и будут такими оставаться всегда.
Являются ли типы POINT и LINESEG (или структурированные типы вообще) "инкапсулированными"? К сожалению, ответ на этот вопрос зависит от контекста. Например, если структурированный тип используется как тип некоторого столбца, ответ будет "Да" (пожалуй). Однако, если он используется как тип некоторой таблицы (см. раздел Б.4), конечно, ответ будет "Нет ".
Замечание. В первом случае добавление "пожалуй" означает, что даже в этой ситуации операторы "получить" ("get") и "установить" ("set"), по существу, предоставляют атрибуты данного типа (как уже указывалось) и не могут быть замещены. Возможно, для первого случая уместно использовать термин "псевдоинкапсулированные типы" или псевдоскаляры.
Приведем общий синтаксис для определения структурированного типа, который не является каким-либо подтипом (см. раздел Б.З, где рассматривается случай определения подтипов).
CREATE TYPE <имя mna>
AS ( <список определений атрибутов» ) [ реализация ссылочного типа» ] [ [ NOT ] INSTANTIABLE ]
[ NOT ] FINAL [ <список спецификаций методов» ] ;
Пояснения
Параметр <список определений атрибутов> не должен быть пустым,
Необязательный параметр <реализация ссылочного типа> подробно обсуждается в разделе Б.4.
Уточнение NOT INSTANTIABLE означает, что тип является фиктивным типом в смысле главы 19. По умолчанию заданным считается уточнение INSTANTIABLE.
Уточнение NOT FINAL означает, что тип может иметь собственные подтипы; в противном случае используется уточнение FINAL.
К значениям и переменным данного структурированного типа Т применяются следующие операторы.
а) Наблюдатели и мутаторы атрибутов, уже описанные выше.
б) Операторы присвоения "=" и, возможно, сравнения "<" (оба оператора опреде- ляются с помощью отдельного оператора CREATE ORDERING FOR Т, хотя зачем требуется упорядочение, если нужно просто определить оператор присвоения "=", не совсем понятно).
в) Процедуры и функции, которые определяются, чтобы получить параметр типа Г (или любой из его собственных подтипов; см. раздел Б.З).
г) Методы, которые определяются, чтобы получить специальный "целевой" пара- метр типа Т или любой из его собственных подтипов (опять же, см. раздел Б.З).
Замечание. Здесь под методами подразумеваются методы в традиционном объектном смысле (см. главу 24), т.е. они являются операторами, которые рассматривают один параметр как специальный. Если метод М определен для типа Т и X— выражение типа Т, то специальный синтаксис точечного уточнения Х.М используется для вызова метода N для объекта X. (Здесь для простоты подразумевается, что метод М никаких других параметров не имеет.)
В параметре спецификация метода> задаются "определения сигнатур" метода в смысле глав 19 и 24. Однако они также включают многое другое, что относится к реализации и, по мнению автора, здесь неуместно. Реальный код, реализующий методы, определяется в другом месте.
Б.З. Наследование типов
В языке SQL3 поддержка наследования типов не полностью ортогональна, поскольку применяется только к структурированным типам, т.е. не поддерживается наследование типов для типов встроенных, генерируемых10 и типов DISTINCT. Кроме того, совсем не поддерживается множественное наследование типов. В этом разделе будет рассмотрено только наследование для "псевдоскалярных" структурированных типов, которое может считаться реализованным более или менее удовлетворительно. Обсуждение наследования нешкапсулированных структурированных типов откладывается до раздела Б.5.
Перечислим самые существенные различия между моделью наследования типов, которая была представлена в главе 19, и наследованием "псевдоскалярных" типов в языке SQL3.
В языке SQL3 поддерживаются структурное наследование, а также наследование поведения.
В языке SQL3 неверно различаются значения и переменные, и поэтому, в частности, не различаются заменимость значений и заменимость переменных.
В языке SQL3 нет поддержки ограничений типа, и поэтому также нет поддержки специализации посредством ограничения.
В языке SQL3 требуется, чтобы операторы обновления ("мутаторы") наследовались безусловно.
Вследствие этих различий в языке SQL3 допускаются "некруглые окружности" и другие несуразности, которые обсуждались в главе 19. Кроме того, некоторые операции сравнения в языке SQI .3 в результате дают значение ложь, когда они должны бы давать значение истина (поскольку, например, значение менее конкретного типа ELLIPSE может иметь равные полуоси и, значит, соответствовать окружности в обычном понимании).
Ниже приводятся примеры описания типов эллипсов и окружностей на языке SQL3.
CREATE TYPE ELLIPSE
AS { A LENGTH, В LENGTH, CTR POINT ) NOT FINAL ;
CREATE TYPE CIRCLE UNDER ELLIPSE
AS ( R LENGTH ) - нереалистично! (см. ниже)
NOT FINAL ;
Однако отметим, что в этих определениях физической реализации типа CIRCLE используются четыре компонента-— А, В и CTR (наследуемые от типа ELLIPSE) и R (указываемый только для типа CIRCLE). Для любой данной окружности, конечно, три из этих компонентов будут иметь одинаковые значения. В качестве альтернативы вместо атрибута R можно определить метод R для типа CIRCLE. Тогда тип CIRCLE будет иметь ту же физическую реализацию, что и тип ELLIPSE, и эта реализация будет менее избыточна. С другой стороны, если С — переменная объявленного типа CIRCLE, присвоение C.R будет допустимо в первом из этих проектов, но не допустимо во втором. И опять же, присвоение C.R, если оно поддерживается, будет, вообще говоря, давать такую "окружность", что С .R Ф С.А!
Ниже перечислены некоторые особенности в различии между моделью наследования типов, описанной в главе 19, и наследованием, которое поддерживается в языке SQL3.
В языке SQL3 используется термин "direct" в понятии direct subtype для обозначения прямого непосредственного подтипа вместо более соответствующего случаю термина "immediate".
В языке SQL3 вместо термина "корневой тип" используется термин "максимальный супертип".
В языке SQL3 поддерживается оператор TREAT (аналог оператора TREAT DOWN). Например, в этом языке аналогом выражения TREAT_DOWN_AS_CIRCLE(E) будет выражение TREAT Е AS CIRCLE.
■ В языке SQL3 также имеется оператор, который можно рассматривать как оператор TREAT UP, Приведем, например, следующую формулировку оператора.
МЕЛ ( С AS ELLIPSE )
Уточнение AS ELLIPSE обеспечивает вызов версии ELLIPSE для оператора AREA, даже если объявленный тип переменной С будет CIRCLE.
Замечание. Этот оператор может использоваться лишь в определенном контексте, " а именно -— для операции TREAT UP по отношению к аргументу при вызове некоторого оператора, определенного пользователем, как в данном примере. Нужно сказать, что обеспечение такой функциональности, похоже, приводит к некоторой путанице между вопросами модели и реализации, ведь пользователи не должны даже знать, что существуют две версии оператора AREA.
В языке SQL3 также поддерживается метод вида X.SPECIFICTYPE, который возвращает наиболее конкретный тип своего аргумента X как символьную строку.
В языке SQL3 аналоги операторов вида IS_T(X) и IS_MS_rj^) выглядят следующим образом.
x IS OF j т )
X IS OF ( ONLY T )
Б.4. Ссылочные типы
Напомним, что, как утверждалось в главе 24, в объектных системах есть лишь одна хорошая идея, а именно — надлежащая поддержка типов данных (или две идеи, если считать наследование типа отдельно). Как видим, в язык SQL3 включены некоторые из этих "хороших" функциональных возможностей, хотя их поддержке еще далеко до совершенства. Однако, к сожалению, в язык SQL3 включены и связанные с ними возможности, которые, по нашему убеждению, очень плохие. Фактически язык SQL3 довольно близко подошел к возможности допустить и первую грубейшую ошибку (приравнивание таблиц и классов), и вторую грубейшую ошибку (смешивание указателей и таблиц). Также необходимо сказать, что "оправдания" для выбора такого подхода не совсем понятны, по крайней мере автору; в сущности, они представляют собой лишь некую неясную идею о том, что рассматриваемые возможности каким-то образом делают язык SQL3 более "объектно-подобным".
Но как бы то ни было, мы все же попытаемся объяснить, что на самом деле представляют собой соответствующие возможности. В языке SQL3 разрешено определять базовую таблицу не только в терминах явного множества именованных типизированных столбцов (обычным способом), но и в терминах структурированных типов, определяемых пользователем, как, например, показано ниже.
CREATE TYPE DEPT TYPE AS ( DEPTi CHAR(3), DNAME CHAR(25), BUDGET MONEY ) REF IS SYSTEM GENERATED... ;
CREATE TABLE DEPT OF DEPTJTYPE
{ REF IS DEPT ID SYSTEM GENERATED, PRIMARY KEY~( DEPTI ), UNIQUE ( DEPT_ID ) )... j
Пояснения
Для данного определения структурированного типа Т система автоматически генерирует связанный ссылочный тип ("REF-тип"), обозначаемый как REF( Г). Значения типа REF (Т) представляют собой "ссылки" на строки типа Т в базовой таблице11, которая определена как таблица, "относящаяся к" ("OF") типу Т (см. п. 3). Замечание. Тип Т, конечно, может быть использован и в другом контексте, например как объявленный тип для некоторой переменной V или некоторого столбца С. Однако никакие значения REF (Т) не связаны с другими такими его применениями.
Предложение REF IS SYSTEM GENERATED в операторе CREATE TYPE означает, что реальные значения связанного REF-типа предоставляются системой. Может использоваться и другая опция REF IS USER GENERATED, но здесь она рассматриваться не будет. Опция REF IS SYSTEM GENERATED применяется по умолчанию.
Базовая таблица может быть определена (с помощью оператора CREATE TABLE) как таблица, "относящаяся к" некоторому структурированному типу. Однако ключевое слово OF здесь не совсем подходит, поскольку ни таблица в целом, ни даже отдельные ее строки на самом деле не "относятся к" рассматриваемому типу12. В частности, для таблицы могут быть определены дополнительные столбцы вдобавок к "столбцам" (или, скорее, к атрибутам) самого структурированного типа. Фактически должен быть указан по крайней мере один дополнительный столбец, а именно— столбец подходящего REF-типа. Синтаксис для определения такого столбца — это не обычный синтаксис для определения столбца, который выглядит так. REF IS <имя столбца» SYSTEM GENERATED
Дополнительный столбец используется для размещения уникальных идентификаторов ("ссылок") для строк данной базовой таблицы (подразумевается уточнение UNIQUE (<имя столбца»), хотя оно может указываться и явно, как в нашем примере). Идентификатор присваивается для данной строки, когда она вставляется, и остается связанным с этой строкой13, пока она не будет удалена.
Замечание. Повторение уточнения SYSTEM GENERATED, конечно, необходимо. (Возможно, это покажется странным, но генерируемый системой столбец может быть целевым столбцом в операциях INSERT и UPDATE, хотя и используется по особым соображениям. Подробности здесь не рассматриваются.) Но непонятно, почему требуется определять таблицу как "относящуюся к" некоторому структурированному типу вместо того, чтобы просто определить соответствующий столбец обычным способом и обеспечить функциональные возможности "уникального идентификатора".
Как отмечалось в разделе Б.2, структурированный тип, например DEPTJTYPE, не рассматривается в качестве инкапсулированного, если он используется как основа для определения базовой таблицы, несмотря на то что считается (в определенной степени) таковым во всех других контекстах. Поэтому в данном примере базовая таблица DEPT имеет четыре столбца, а не два, как это было бы, если бы тип DEPT TYPE был инкапсулированным.
Столбец DEPTi был описан как первичный ключ для таблицы DEPT. Однако, если строки таблицы DEPT имеют уникальные идентификаторы ("ссылки"), эти идентификаторы могли бы при желании использоваться в качестве значения первичного ключа.
CREATE TABLE DEPT OF DEPTJTYPE
( REF IS DEPT_ID SYSTEM GENERATED, PRIMARY KEY ( DEPT_ID ), UNIQUE { DEPTi ) )... ;
Теперь расширим пример, представив базовую таблицу ЕМР следующего вида.
CREATE TABLE ЕМР
( EMPi CHAR(5), ENAME CHAR(25), SALARY MONEY,
DEPT ID REF ( DEPTJTYPE ) SCOPE DEPT REFERENCES ARE CHECKED ON DELETE CASCADE, PRIMARY KEY ( EMPI ) >... ;
Обычно базовая таблица EMP включает в качестве внешнего ключа столбец DEPTI, который ссылается на отделы с помощью номеров отделов. Здесь, однако, в качестве "ссылочного" столбца используется столбец DEPT ID, который неявно объявлен в качестве столбца внешнего ключа и который ссылается на отделы с использованием значений "ссылок". Предложение SCOPE DEPT указывает соответствующую таблицу для ссылок. Предложение REFERENCES ARE CHECKED означает, что поддерживается контроль целостности; опция REFERENCES ARE NOT CHECKED допускает наличие "висящих ссылок" (непонятно, зачем кому-либо когда-либо может потребоваться указывать такую опцию). Опциями ON DELETE... задаются правила удаления, аналогичные обычным правилам удаления внешнего ключа (поддерживаются те же самые опции). Однако отметим, что если это в действительности будет случай, когда столбец DEPT_ID в базовой таблице DEPT не может быть обновлен (см. п. 3 приведенного выше перечня), то не требуется никакого соответствующего правила ON UPDATE.
Теперь рассмотрим несколько примеров запросов в этой базе данных. Вот формулировка на языке SQL3 запроса "Получить номера отделов для служащего с номером ' ЕГ ".
SELECT EX.DEPT_ID -> DEPTi AS DEPTi
FROM EMP EX
WHERE EX.EMPi = 'El' ;
Обратите внимание на операцию разыменовывания14 в предложении SELECT (выражение EX.DEPT_ID —* DEPTi возвращает значение DEPTI из строки DEPT, на которую указывает данное значение идентификатора DEPT_ID). Также обратите внимание, что спецификация AS здесь в определенной степени необходима (если бы она была опущена, результирующий столбец был бы задан с именем, "зависящим от реализации"). И наконец, отметим интуитивно непонятный характер построения предложения FROM— получаемое значение DEPTi извлекается из DEPT, а не из ЕМР, но значение DEPT_ID извлекается из ЕМР, а не из DEPT.
Замечание. Нелегко не поддаться искушению указать, что этот запрос, вероятно, будет выполняться хуже, чем его аналог в обычном языке SQL (для которого нужна была бы одна таблица, а не две). Это замечание здесь приводится еще и потому, что обычный аргумент в защиту "ссылок" состоит в том, что они подразумевают увеличение производительности.
Кстати сказать, если бы запрос был сформулирован как "Получить отдел (вместо просто номера отдела) для служащего с номером 'Е1'", операция разыменовывания была бы совсем иной.
SELECT DEREF (EX.DEPT_ID ) AS DEPT
FROM EMP EX
WHERE EX.EMPi = 'El' ;
Более того, вызов операции DEREF возвращал бы не значение строки, а "инкапсулированное" (скалярное) значение.
Вот еще один пример: "Получить номера служащих, работающих в отделе 'D1'" (обратите внимание на разыменовывание в предложении WHERE).
SELECT EX.EMPi FROM EMP EX
WHERE EX.DEPTJD -> DEPTi = 'Dl' ;
Ниже приводится пример операции INSERT (вставка сведений о некотором служащем).
INSERT INTO ЕМР ( EMPi, DEPT_ID )
VALUES ( 'E5', ( SELECT DX.DEPT_ID FROM DEPT DX WHERE DX.DEPTi = 'D2' ) ) ;
Б.5. Подтаблицы и супертаблицы
Рассмотрим следующие структурированные типы (описывающие служащего и программиста).
CREATE TYPE EMP_TYPE
AS ( EMPi ...7 DEPTi ... ) REF IS SYSTEM GENERATED NOT FINAL ... ;
CREATE TYPE PGMR TYPE UNDER EMP_TYPE AS { LANG ... J NOT FINAL ... ;
Заметим, что определение типа PGMR_TYPE не имеет предложения REF IS .... Вместо этого оно фактически наследует такое предложение от своего непосредственного супертипа EMP_TYPE.
Теперь рассмотрим следующие определения базовых таблиц.
CREATE TABLE ЕМР OF ЕМР TYPE
( REF IS EMP ID SYSTEM GENERATED, PRIMARY KEY ( EMPi ), UNIQUE { EMP_ID ) ) ;
CREATE TABLE PGMR OF PGMR_TYPE UNDER EMP ;
Обратите внимание на спецификацию UNDER ЕМР в определении базовой таблицы PGMR (также обратите внимание на отсутствие спецификаций REF IS PRIMARY KEY и UNIQUE для этой базовой таблицы). Такие базовые таблицы, как PGMR и ЕМР, называются подтаблицей и соответствующей непосредственной супертаблицей. Таблица PGMR наследует столбцы таблицы ЕМР и имеет один дополнительный собственный столбец LANG. Интуитивно в этом примере утверждается, что не программист имеет лишь некоторую строку в таблице ЕМР, а программист имеет строку в обеих таблицах, поскольку каждая строка в таблице PGMR имеет эквивалент в таблице ЕМР, но обратное неверно.
Операции обработки данных для этих таблиц выполняются следующим образом.
■ Операция SELECT. Для таблицы ЕМР операция SELECT выполняется так, как обычно, а для таблицы PGMR -— как будто в этой таблице PGMR действительно содержатся столбцы таблицы ЕМР и столбец LANG.
Замечание. Уточнение ONLY может использоваться в параметре <ссылочная таблица> для исключения строк, которые имеют эквиваленты в некоторой подтаблице данной таблицы. Поэтому, например, операция SELECT ... FROM ONLY ЕМР выполняется так, как будто в таблицу ЕМР включены только строки, которые не имеют эквивалентов в таблице PGMR.
Операция INSERT. Для таблицы ЕМР операция INSERT выполняется так, как обычно. В результате ее выполнения для таблицы PGMR новые строки вставляются в обе таблицы, PGMR и ЕМР.
Операция DELETE. При выполнении операции DELETE для таблицы ЕМР удаляются строки из таблиц ЕМР и (если эти строки соответствуют программистам) PGMR. Удаление строк из таблицы PGMR приводит к удалению строк из обеих таблиц.
Операция UPDATE. Обновление столбца LANG, обязательно через таблицу PGMR, приводит к обновлению лишь таблицы PGMR. Обновления других столбцов через таблицу PGMR или ЕМР приводят к обновлению обеих таблиц (концептуально).
Укажем на некоторые следствия из предыдущих правил.
Предположим, что служащий 'Joe' стал программистом. Если просто вставить строку для 'Joe' в таблицу PGMR, система попытается вставить строку для 'Joe' также в таблицу ЕМР, что, конечно, приведет к ошибке. Вместо этого необходимо удалить строку служащего 'Joe' из таблицы ЕМР, а затем вставить соответствующую строку в таблицу PGMR.
И наоборот, предположим, что служащий 'Joe' перестал быть программистом. На этот раз необходимо удалить строку ' Joe' из таблицы ЕМР или PGMR (какую бы таблицу мы ни указали, в результате строки будут удалены из обеих таблиц). Затем нужно вновь вставить соответствующую строку в таблицу ЕМР.
А что делать с наследованием типа? Насколько мы можем судить, ответ на этот вопрос — "Ничего", т.е. ничего, кроме того (по соображениям, которые непонятны), что язык SQL3 требует, чтобы подтаблица и ее непосредственная супертаблица были определены через структурированные типы, которые являются подтипом и его непосредственным супертипом соответственно. Подчеркнем, что никакой заменимости эта схема не включает и, кроме того, рассматриваемые типы, совершенно определенно, не "инкапсулированы".
Итак, насколько привлекательны для нас подтаблицы и супертаблицы? Ответ, по-видимому, будет "Слегка", по крайней мере на уровне модели™. Действительно, определенная экономия в реализации может быть достигнута, если подтаблица и супертаблица физически хранятся как одна таблица на диске. Но такие соображения, безусловно, никак не должны влиять на модель как таковую. Другими словами, непонятно не только, как указывалось в предыдущем абзаце, почему "под- и супертаблицы" должны зависеть от "под- и суперструктурированных" типов, но и зачем такая возможность вообще поддерживается.
Б.6. Другие возможности Создание таблиц
В языке SQL3 в предложении CREATE TABLE поддерживается опция LIKE, позволяющая скопировать некоторые или все определения новой базовой таблицы из некоторой существующей именованной таблицы (отметим, что именованная не означает возможность указать произвольное табличное выражение вместо имени таблицы).
Табличные выражения
В главе 5 было описано предложение WITH, назначение которого — ввести сокращенные имена для определенных выражений. В языке SQL3 включена подобная конструкция, но ее использование ограничивается лишь табличным выражением, как например, показано ниже.
10 Вероятно, стоит напомнить, какой подход к этому вопросу мы считаем более предпочтительным: подход, в котором используются представления (см. пример в конце раздела 13.5).
WITH LONG_TERM_EMPS AS ( SELECT * FROM EMP
WHERE DATE_HIRED < DATE '1980-01-01' )
SELECT EMPf, { LONG_TERM_CT - 1 ) AS ♦ OF_FELLOW LONG_TERM_EMPS FROM LONG_TERM_EMPS AS LI,
( SELECT DEPTi, COUNT(*) AS LONG_TERM_CT
FROM LONG_TERM_EMPS
GROUP BY DEPTi ) AS L2 WHERE LI.DEPTi = L2.DEPTi ;
(Словесная формулировка запроса такова: "Для каждого служащего, который работает в компании с 1979 года или ранее, получить номер служащего и количество других служащих в том же отделе".)
В языке SQL3 предложение WITH может быть использовано, в частности, для формулирования определенных рекурсивных запросов. Например, для данной таблицы PARENT_OF (PARENT, CHILD J следующий рекурсивный запрос возвращает все пары людей {а, Ь), таких, что а— предок Ь. Обратите внимание, что определение, которое вводит имя ANCESTOR_OF, включает ссылку на само имя ANCESTOR_OF.
WITH RECURSIVE ANCESTOR OF ( ANCESTOR, DESCENDANT ) AS ( SELECT PARENT, CHILD
FROM PARENT_0F
UNION
SELECT A.PARENT, P.CHILD
FROM ANCESTOR OF AS A, PARENT_0F AS P
WHERE A.CHILD = P.PARENT )
SELECT *
FROM ANCEST0R_0F
Условные выражения
В языке SQL3 предоставляется новое условие DISTINCT (не путайте с существующим условием UNIQUE; см. приложение А). Оно предназначено для проверки, являются ли две строки "различными". Пусть заданы две строки Left и Right. В них должно содержаться одно и то же количество, например п, компонентов. Пусть i-e компоненты строк Left и Right— Li и J?i (i = 1, 2, л) соответственно. Тип компонента Li должен быть совместимым с типом компонента Ri. Тогда после вычисления выражения
Left IS DISTINCT FROM Right
будет получен результат ложь, если и только если для всех i либо выражение "Li = Ri" имеет значение истина, либо Li и Ri оба равны NULL-значениям. В противном случае возвращается истина. (Иначе говоря, строки Left и Right являются "различными", если и только если они не "дублируют" одна другую в смысле главы 18.) Отметим, что условие DISTINCT никогда не дает в результате значение неизвестно.
В языке SQL3 также предоставляется новое условие SIMILAR, которое (как и условие LIKE) служит для шаблонного сравнения символьных строк, т.е. с его помощью проверяется, удовлетворяет ли данная символьная строка некоторому заданному шаблону. Отличие заключается в том, что условие SIMILAR поддерживает более широкий диапазон возможностей ("символы-заменители" и т.п.) по сравнению с условием LIKE. Синтаксис этого условия следующий.
<выражение типа символьной строки» [NOT] SIMILAR ТО <шаблон>
[ ESCAPE <исключевие> ]
Здесь параметры <шаблон> и <исключение> по сути те же, что и в условии LIKE, но параметр <шаблон> может включать дополнительные специальные символы — не просто " " и "%", как в условии LIKE, а также "*", "+", "-" и многие другие. Общее их назначение заключается в поддержке правил анализа выражений, записанных на некотором формальном языке.
Замечание. Стоит упомянуть, что правила для условия SIMILAR были скопированы с подобного оператора в языке POSIX.
В завершение этого подраздела отметим, что при наличии нового встроенного типа BOOLEAN условные выражения становятся просто скалярными выражениями специального вида (чем, впрочем, они и должны были быть всегда).
Целостность
В языке SQL3 поддерживается ограничение RESTRICT «ссылочное действие», которое подобно, но не идентично опции NO ACTION (для уяснения различия обратитесь к главе 8). Также включена некоторая поддержка триггерных процедур (триггеров), в частности имеется оператор CREATE TRIGGER, которым определяется триггер — комбинация определений события и действия.
Ш Событие — это операция INSERT, UPDATE (необязательно для указанных столбцов) или DELETE для указанной именованной таблицы.
■ Действие — это действие (фактически — процедура), которое будет выполнено AFTER (после) или BEFORE (до) обработки указанного события.
Точнее, действие состоит из необязательного условного выражения (по умолчанию равного истине) и SQL-процедуры, которая будет выполнена, если и только если условие истинно, когда событие произойдет. Пользователь может указать, будет ли действие выполняться один раз, когда случается событие, или же один раз для каждой строки FOR EACH ROW таблицы, с которой данное событие связано. Более того, спецификации действия могут ссылаться на значения "до" и "после" в таблице, связанной с конкретным событием, предоставляя таким образом примитивный уровень поддержки для, помимо всего прочего, ограничений перехода.
Обновление представлений
В языке SQL3 расширена поддержка обновления представлений за счет включения представлений типа UNION ALL и представлений, определенных на базе соединений типа "один ко многим" и "многие ко многим". Аналогичные расширения имеются и для курсоров.
Управление транзакциями
В язык SQL3 включено несколько новых возможностей управления транзакциями.
Использование явного оператора STMT TRANSACTION (с теми же операндами, что и у оператора SET TRANSACTION; см. главу 14)
Использование опции WITH HOLD для оператора объявления курсора DECLME CURSOR (опять же, см. главу 14)
Поддержка контрольных точек (см. аннотацию к [14.11])
Безопасность
В языке SQL3 поддерживаются привилегии выборки конкретных столбцов
(привилегии SELECT (х) позволяют их обладателю ссылаться на конкретный столбец х конкретной именованной таблицы в параметре <табличное выражевие>). Также поддерживаются определяемые пользователем роли. В качестве примера можно привести роль ACCG, означающую любого сотрудника бухгалтерии. Однажды созданная роль может наделяться привилегиями точно так, как если бы это был идентификатор пользователя. Более того, роли могут предоставляться, подобно привилегиям, и так же, как все привилегии, могут предоставляться или пользователю, или другой роли.
Отсутствующая информация
Здесь мы ограничимся лишь одним наблюдением. Использование возможностей новых типов в языке SQL3 (как и ожидалось) усложняется наличием NULL-значений. Например, пусть V— переменная некоторого структурированного типа Т. Тогда может быть так, что значение некоторого компонента переменной V равно NULL-значению (в этом случае условное выражение V = V вычисляется, как значение неизвестно), тем не менее условное выражение V IS NULL вычисляется, как ложь\ Фактически в общем случае можно сказать, что если ((V = V) IS NOT TRUE) IS TRUE— истина, то или значение У равно NULL-значению, или переменная V включает компонент, значение которого равно NULL-значению.
Поддержка принятия решений
В язык SQL3 включена поддержка опций GROUPING SETS, R0LLUP и CUBE для предложения GROUP BY, как было описано в главе 21.
Приложение
Сокращения и специальные символы
ACID |
atomicity/consistency/ |
атомарность/согласованность/ |
|
isolation/durability |
изолированность/продолжительность |
ACM |
Association for Computing Machinery |
Ассоциация по вычислительной технике |
ADT |
abstract data type |
абстрактный тип данных |
ANSI |
American National Standards |
Американский национальный институт |
|
Institute |
стандартов |
ANSI/SPARK |
ANSI/Systems Planning and |
Американский национальный институт |
|
Requirements Committee |
стандартов/Комитет системного планирования и требований (упоминался в главе 2 в связи с трехуровневой архитектурой систем баз данных) |
ARIES |
algorithm for recovery and |
алгоритм восстановления и использую- |
|
isolation exploiting semantics |
щей изоляцию семантики |
BB |
GB |
то же самое, что гигабайт (Гбайт) |
BCNF |
Boyce/Codd normal form |
нормальная форма Бойса-Кодда (НФБК) |
BCS |
British Computer Society |
Британское компьютерное общество |
BLOB |
binary large object |
большой двоичный объект |
BNF |
Backus-Naur form or Backus |
форма Бэкуса-Наура или нормальная |
|
normal form |
форма Бэкуса |
CACM |
Communications of the ACM |
Средства коммуникации АСМ (издание |
|
(ACM publication) |
АСМ) |
CAD/CAM |
computer-aided |
автоматизированное проектирование/ ав- |
|
design/computer-aided |
томатизированное производство |
|
manufacturing |
(САПР/АСУТП) |
CASE |
computer-aided software |
автоматизация разработки программного |
|
engineering |
обеспечения |
CDO |
class-defining object |
объект, определяющий класс |
CIM |
computer-integrated |
автоматизированное интегрированное |
|
manufacturing |
производство |
CLI |
Call-Level Interface |
интерфейс уровня вызова (процедур) |
CLOB |
character large object |
большой символьный объект |
CNF |
conjunctive normal form |
конъюнктивная нормальная форма |
CODASYL Conference on Data Systems Ассоциация по языкам систем данных;
Languages используется при ссылке на определенные
дореляционные системы, такие как IDMS CPU central processing unit центральный процессор (ЦП)
CS cursor stability (DB2) стабильность курсора (в СУБД DB2)
CWA Closed World Assumption допущение о замкнутости мира
DA data administrator администратор данных (АД)
DB/DC database/data communications база данных/передача данных
DBA database administrator администратор базы данных (АБД)
DBMS database management system система управления базой данных (СУБД)
DBP&D Database Programming & Программирование и проектирование
Design баз данных (журнал, в настоящее время
интерактивный)
DBTG Data Base Task Group группа задач баз данных; используется
взаимозаменяемо с CODASYL в контексте баз данных
DC data communications передача данных
DCO "domain check override" замещение проверки домена
DDB distributed database распределенная база данных
DDBMS distributed DBMS распределенная СУБД (РСУБД)
DDL data definition language язык определения данных (ЯОД)
DES Data Encryption Standard стандарт шифрования данных
DK/NF domain-key normal form доменно-ключевая нормальная форма
DML data manipulation language язык обработки данных (ЯОД)
DNF disjunctive normal form дизъюнктивная нормальная форма
DRDA Distributed Relational архитектура распределенных реляцион-
Database Architecture ных баз данных
DSL data sublanguage подъязык данных
DSS decision support system система поддержки принятия решений
DUW distributed unit of work распределенная часть работы
E/R entity/relationship "сущность/связь"
ЕВ exabyte (1024РВ) эксабайт (Ебайт); равен 1024 петабайт
(Пбайт)
EDB extensional database экстенсиональная база данных
EKNF elementary key normal form нормальная форма с элементарными
ключами
EMVD embedded MVD внедренная многозначная зависимость
FD functional dependence функциональная зависимость (ФЗ)
GB gigabyte (1024MB) гигабайт (Гбайт); равен 1024 мегабайт
(Мбайт)
GIS geographic information system географическая информационная система
HOLAP |
hybrid OLAP |
I/O |
input/output |
IDB |
intensional database |
IDMS |
Integrated Database |
|
Management System |
IEEE |
Institute for Electrical and |
|
Electronics Engineers |
IMS |
Information Management |
|
System |
IND |
inclusion dependence |
IS |
intent shared lock; |
|
information system |
ISBL |
Information System Base |
|
Language |
ISO |
International Organization for |
|
Standardization |
IT |
information technology |
IX |
intent exclusive (lock) |
JACM |
Journal of the ACM (ACM |
|
publication) |
JD |
join dependence |
JDBC |
Java Database Connectivity |
К |
1024 (sometimes 1000) |
KB |
kilobyte (1024 bytes) |
LAN |
local area network |
LOB |
large object |
MB |
megabyte (1024 KB) |
MLS |
multi-level secure |
MOLAP |
multi-dimensional OLAP |
MVD |
multi-valued dependence |
NCITS |
National Committee on Infor- |
|
mation Technology Standards |
NCITS/H2 |
NCITS database committee |
NF2 |
"NF squeared" = NFNF = non |
|
first normal form (?) |
ODBC |
Open Database Connectivity |
ODMG |
Object Data Management |
|
Group |
гибридная система OLAP ввод-вывод
интенсиональная база данных
интегрированная система управления базой данных — одна из первых СУБД Институт инженеров электрики и электроники (США)
система управления информацией — одна из первых СУБД включаемая зависимость разделяемая блокировка намерения; информационная система язык баз информационных систем
Международная организация по стандартизации
информационная технология (ИТ) эксклюзивная блокировка намерения Журнал АСМ (издание АСМ)
зависимость соединения (ЗС) Java-интерфейс для установки связи с базами данных 1024 (иногда 1000) килобайт (Кбайт); равен 1024 байт локальная сеть (ЛВС) большой объект
мегабайт (Мбайт); равен 1024 килобайт (Кбайт)
многоуровневая система защиты многомерные базы данных OLAP многозначная зависимость (МЗЗ) Национальный комитет по стандартам информационных технологий комитет по базам данных NCITS "NF-квадрат" = NFNF = не первая нормальная форма (?)
открытый интерфейс установки связи с базами данных
Группа управления объектными данными (ODMG также называют предложения группы: ODL, OQL и т.д.)
ODS |
operational data store |
операционное хранилище данных | |||
OID |
object ID |
идентификатор объекта | |||
OLAP |
online analytic processing |
оперативная аналитическая обработка | |||
OLCP |
online complex processing |
оперативная комплексная обработка | |||
OLDM |
online decision management |
оперативное управление решениями | |||
OLTP |
online transaction processing |
оперативная обработка транзакций | |||
OMG |
Object Management Group |
Группа управления объектами | |||
OO |
object-oriented; object |
объектно-ориентированный; объектная | |||
|
orientation |
ориентация (00) | |||
OODB |
object-oriented database |
объектно-ориентированная база данных | |||
OOPL |
object-oriented programming |
объектно-ориентированный язык про- | |||
|
language |
граммирования | |||
OQL |
Object Query Language |
объектный язык запросов (часть стан- | |||
|
|
дарта ODMG) | |||
OSI |
Open System Interconnection |
открытый интерфейс взаимодействия | |||
|
|
систем | |||
OSQL |
"Object SQL" |
"объектный SQL" | |||
PB |
petabyte (1024TB) |
петабайт (Пбайт); равен 1024 терабайт | |||
|
|
(Тбайт) | |||
PC |
personal computer |
персональный компьютер (ПК) | |||
PJ/NF |
projection-join normal form |
нормальная форма проекции-соединения | |||
PODS |
Principles of Database Systems |
принципы систем баз данных | |||
PRTV |
Peterlee Relational Test |
экспериментальная реляционная систе- | |||
|
Vehicle |
ма, разработанная в городе Питерли | |||
PSM |
Persistent Stored Modules |
постоянные хранимые модули | |||
QBE |
Query-By-Example |
запрос-по-образцу | |||
QUEL |
Query Language |
язык запросов | |||
RAID |
redundant array of |
надежный массив недорогих дисков | |||
|
inexpensive disks |
| |||
RDA |
Remote Data Access |
удаленный доступ к данным | |||
RDB |
relational database |
реляционная база данных | |||
RDBMS |
relational DBMS |
реляционная СУБД | |||
RID |
(stored) record ID or row ID |
(хранимый) идентификатор записи или | |||
|
|
идентификатор строки | |||
ROLAP |
relational OLAP |
реляционная система OLAP | |||
RM/T |
relational model/Tasmania |
реляционная модель/Тасмания | |||
RM/V1 |
relational model/Version 1 |
реляционная модель/версия 1 | |||
RM/V2 |
relational model/Version2 |
реляционная модель/версия 2 | |||
RPC |
remote procedure call |
удаленный вызов процедур (протокол) | |||
RR |
repeatable read |
повторяющееся чтение | |||
RUW |
remote unit of work |
удаленная часть работы | |||
RVA |
relation-valued attribute |
атрибут, значение которого — отношение |
| ||
S |
shared (lock) |
разделяемая (блокировка) |
| ||
SIGMOD |
Special Interest Group on |
Специальная группа по управлению дан- |
| ||
|
Management of Data (ACM |
ными (специальная группа АСМ) |
| ||
|
special interest Group) |
|
| ||
SIX |
shared intent exclusive (lock) |
эксклюзивная разделяемая блокировка |
| ||
|
|
намерения |
| ||
SPARC |
see ANSI/SPARC |
см. ANSI/SPARC |
| ||
SQL |
Structured Query Language, |
структурированный язык запросов, стан- |
| ||
|
Standard Query Language |
дартный язык запросов |
| ||
ТВ |
terabyte (1024GB) |
терабайт (Тбайт); равен 1024 гигабайт |
| ||
|
|
(Гбайт) |
| ||
TCB |
Trusted Computing Base |
надежная вычислительная база |
| ||
TCP/IP |
Transmission Control |
протокол управления переда- |
| ||
|
Protocol/Internet Protocol |
чей/протокол Internet |
| ||
TID |
(stored) tuple ID |
(хранимый) идентификатор кортежа |
| ||
TOPS |
Transaction on Database |
Транзакции в системах баз данных |
| ||
|
Systems (ACM publication) |
(издание АСМ) |
| ||
TPC |
Transaction Processing Council |
Совет по обработке транзакций |
| ||
и |
update (lock) |
(блокировка) обновления |
| ||
UDT |
user-defined type |
тип, определяемый пользователем |
| ||
UML |
Unified Modeling Language |
единый язык моделирования |
| ||
unk |
unknown (null) |
неизвестное значение (NULL-значение) |
| ||
UOW |
unit of work |
часть работы |
| ||
VLDB |
very large database; Very |
очень большая база данных; Очень |
| ||
|
Large Data Bases (annual |
большие базы данных (ежегодные кон- |
| ||
|
conference) |
ференции) |
| ||
VSAM |
Virtual Storage Access Method |
метод доступа к виртуальной памяти |
| ||
WAL |
write-ahead log |
предварительная запись в журнал |
| ||
WAN |
wide area network |
глобальные сети (ГВС) |
| ||
WFF |
well-formed formula |
правильно построенная формула |
| ||
WORM |
write once/read many times |
запись однажды/чтение многоразовое |
| ||
WYSIWYG |
what you see is what you get |
что видите, то и получаете |
| ||
X |
exclusive (lock) |
эксклюзивная, без взаимного доступа |
| ||
|
|
(блокировка) |
| ||
X3 |
see NCITS |
см. NCITS |
| ||
X3H2 |
see NCITS/H2 |
см. NCITS/H2 |
| ||
INF |
first normal form |
первая нормальная форма (ШФ) |
| ||
2NF |
second normal form |
вторая нормальная форма (2НФ) |
| ||
2PC |
two-phase commit |
двухфазная фиксация (протокол) |
|
2PL two-phase locking двухфазная блокировка
2VL two-valued logic двузначная логика
20C same as 2PC то же самое, что и 2РС
20L same as 2PL то же самое, что и 2PL
3GL third generation language язык (программирования) третьего поко-
ления
3VL three-valued logic трехзначная логика
3NF third normal form третья нормальная форма (ЗНФ)
4GL fourth generation language язык (программирования) четвертого по-
коления
4NF fourth normal form четвертая нормальная форма (4НФ)
4VL four-valued logic четырехзначная логика
5NF fifth normal form (same пятая нормальная форма (ЗНФ) (то же
PJ/NF) самое, что и PJ/NF)
е принадлежит
0 оператор сравнения (=, < и т.д.)
0 пустое множество
—> функционально определяет
—* многозначно определяет
= равносильно (тождественно)
=> следует (логическая связка)
h следует (металингвистический символ)
Н всегда справедливо
(металингвистический символ)
1 конец (доказательства, примера и т.п.)
Предметный указатель
с
CODASYL, 58
D
DataJoiner, 799 DBTG, 58
Е
ER-диаграмма, 42; 510; 514
свойство, 515
связь, 516
сущность, 515 ER-модель, 510; 522
F
false, 693; 695
N
NULL, 693; 704; 706; 825
О
ODBC, 135; 797 OID, 953 OLAP, 836
HOLAP, 844
MOLAP, 842
ROLAP, 842
перекрестные таблицы, 841 OLTP, 41; 813; 818
Q
QBE, 283
R
RDA, 794
s
SQL, 34; 69; 108; 119: 266; 322; 380; 794; 797; 801; 807; 838; 1028 CLI, 135 SQL3,1041
базовые переменные, 128 базовые таблицы, / 77 вложенные подзапросы. 126 внедрение операторов, 126 внешние ключи, 324 группирование, 272; 1032 динамический, 134 домены. 174
значения по умолчанию, 130 инициализация транзакции, 126; 555 каталог, 124 ключи, 714 комментарий, 123 курсоры. 129; 131; 132; 548 манипулирование данными, 122 недостатки, 136 неопределенные значения, 711 обновление данных, 123 обобщающие функции. 271 ограничения домена, 323 ограничения таблицы. 323 ограничения целостности, 322; 326 определение данных, 120; 712 определитель NULL, 271 относительное имя, 267 поддержка представлений, 380 поддержка транзакций, 554 подзапросы, 273 потенциальные ключи, 323 предложение SELECT, /050 предоставление полномочий, 626 представления. 125; 626 проверочные условия, 324 скалярные выражения, 713 сортировка результата, 268 транзакции, 126; 801 условия выборки, 1032 условные выражения, 712
т
timestamp, 855 true, 693; 695 Tutorial D, 856
V
unknown, 695
A
АБД, 68; 75 Агент, 779
Администратор базы данных, 75 Администратор данных, 75 Аксиомы, 900
дедуктивные, 901 Аксиомы Армстронга, 405 Алгоритм редукции Кодла, 257 Аномалии, 432 Архитектура, 65; 108
ANSI/SPARC, 65
внешнее представление. 71
внешний уровень, 68
внутренний уровень, 73
клиент/сервер, 81; 793
концептуальный уровень, 72
отображение, 74 Атрибуты, 152; 431
домены, 698
замыкание множества, 407 неключевые, 431 отношения, 474 специальные значения, 711 типа отношения, 448
Б
База знаний, 899 Базовые переменные, 128 Базы данных, 32; 40; 45
администраторы, 40
аппаратное обеспечение, 37
восстановление, 544; 549
интенсиональные, 918
логические, 899
локальные, 768
однородные, 769
поддержки принятия решений, 815; 817
пользователи, 39
принцип относительности, 357
Базы данных
программное обеспечение, 38 проектирование, 887 распределенные, 86; 767; 770 связи, 41
статистические, 615
статистические показатели, 653
сущности, 41
транзакции, 545
уровень детализации, 832
хронологические, 853; 855; 863; 887 Банк данных, 814 Банк оперативных данных, 829 Блокировка, 569; 791
граф ожидания, 575
двухфазная, 577
протокол, 571
стратегия первичной копии, 791
в
Объекты, 988 Восстановление, 544
носителей, 552
системы, 550 Временная отметка, 855 Время транзакции, 858 Высказывание, 904
допустимое время, 857
Г
ГВС, 780
Граф ожидания, 575; 792 Группирование, 222
д
Данные, 44
временные, 853 встроенные типы, 1042 защита, 602 интервалы, 868 логическая независимость, 354 независимость, 50 обобщение, 836 объекты, 944 ограничения, 602; 864 операционные, 813 подтип, 725
Данные
распределенные, 770 репликация, 777 структуры хранения, 1015 супертип, 725 тип, 725
физическая независимость, 818; 950
хронологические, 855
целостность, 602
шифрование, 621
экземпляр, 52 Двухфазная фиксация, 553; 779 Декомпозиция, 426
вертикальная, 889
горизонтальная, 887 Декомпозиция запросов, 654 Денормализация, 483 Дерево запроса, 643
Доказательно-теоретический подход, 900 Домен, 152; 512 Допустимое время, 857
Ж
Журнал регистрации, 547; 549
3
Зависимость, 400
включаемая, 820
соединения, 477 Загрузка данных, 828 Законы
ассоциативный, 649
идемпотентности, 650
коммутативный, 649
преобразования, 702
распределительный, 648 Заменимость, 733: 736; 739; 757 Замыкание множества, 405; 407 Запрос, 79; 1014
каноническая форма, 644
произвольный, 973
распределенный, 807
рекурсивный, 899; 924
удаленный, 807 Защита
избирательный контроль, 603; 605 обязательный контроль, 603; 611 полномочия, 605 привилегии, 605
Защита данных, 602 ограничения, 49 Зернистость, 859; 869 "Золотое правило", 309
И
Идентичность, 508
Избирательная схема контроля, 603; 605 Избыточность, 47: 404; 422; 544; 824
контролируемая, 820 Индексы, 821 Инкапсуляция, 871; 950 Интервал времени, 867; 871 Исчисление, 903
высказываний, 902
доказательство, 905
кортежей, 245
правила вывода, 904
предикатов, 899; 907
термы, 903
формулы, 903 Итоговые таблицы, 824
К
Кардинальность, 152 Каталог, 104; 156; 783 Квант времени, 858 Кванторы
EXISTS, 696
FORALL, 696 Классы
конструктор, 958
сообщения, 951 Клиент, 82; 84
Ключ, 311; 431; 704; 714; 865; 881 альтернативный, 314: 705 внешний, 315; 318; 324: 706 первичный, 151; 314; 318; 705 потенциальный, 311; 314; 323; 432; 442 потенциальный хронологический, 884 суперключ, 408 суррогатный, 957
КНФ, 651
Коллекции, 958
Конвейерная обработка, 94
Контрольные точки, 551
Координатор, 553
Кортеж, 152:164 О-кортеж, 220
л
Литералы, 157 Ловушка соединения, 43 Логика, 700; 902
высказывания, 904
дублирующиеся кортежи, 699
логическая импликация, 904
теорема, 900
трехзначная, 695 Логическая база данных, 899 Логические выражения, 695 Логическое значение
false, 693
true, 693
unknown, 693
м
Магазины данных, 831
Маркер настоящего момента, 887
Массовые параллельные системы, 802
Менеджер
передачи данных, 81; 768
ресурсов, 553; 787
транзакций, 79 Метаданные, 80; 104 Многозначная зависимость, 469; 472 Модели данных, 44; 56
"сущность-связь", 510
RM/T, 508
дедуктивная, 58
иерархическая, 57
инвертированные списки, 57
многомерная, 58
объектная, 944
объектно-ориентированные, 58
объектно-реляционные, 58
реляционная, 44; 92; 96; 1011
сетевая, 57
функциональная, 995 Моделирование, 505
ER-модель, 522
правила целостности, 508
семантическое, 506; 507 Момент времени, 858 Моментальные снимки, 378; 787 Мутатор, 751
н
Наблюдатель, 751 Наследование, 726; 728; 756 Настройка систем, 76 Независимость данных, 50 Неизвестное значение, 693 Неопределенные значения, 693 Нормализация, 423; 424; 481; 489; 490; 887
(3,3)НФ, 491
1НФ, 423; 424; 431
2НФ, 424; 435
ЗНФ, 430; 431; 438
4НФ, 474
5НФ, 479
атомарная переменная-отношение, 441 декомпозиция. 425; 426; 439; 443 ДКНФ, 490 другие НФ, 490 зависимость соединения, 477 многозначная зависимость, 469; 472; 477 нормальные формы, 424 НФБК, 425; 442; 444: 472 ПСНФ, 479
функциональная зависимость, 477
О
Обобщающие функции, 217; 220 Обобщение, 743 Обратное восстановление, 552 Объекты, 944; 948; 949; 962; 1002
идентификатор, 953; 957
иерархия классов, 961
инкапсуляция, 950
класс, 949; 958
коллекции, 958; 965
конфигурации, 989
переменные экземпляра, 950; 951
полиморфизм, 962
указатель, 1011
экземпляры, 958 Обязательная схема контроля, 603; 611 Овеществление, 54; 358 Ограничения целостности, 49; 301; 303; 308;
309; 402; 652; 700; 705; 819; 860; 870
золотое правило, 307; 309
ограничение ключа. 490
ограничения атрибута, 305; 490
ограничения базы данных, 306; 310
ограничения отношения, 305
ограничения подмножеств, 677
Ограничения целостности
ограничения причастности, 677
ограничения типа, 303
отношения, 310; 313
ссылочная целостность, 316; 706 Операторы, 742; 748
COALESCE, 874
TREAT DOWN, 739
UNFOLD, 874
выбора, 725; 754
обновления, 885
обобщения для интервалов, 873
присвоения, 726; 737
проверки типа, 726; 746
равенства, 726
скалярные для интервалов, 871
сравнения, 744
чтения и обновления. 751 Операция
хронологическая проекция, 878
хронологическая разность, 880 Оптимизация. 101; 213; 639; 642; 702: 778:
781; 1014
ассоциативный закон, 649
декомпозиция запросов, 654
дерево запроса, 643
закон идемпотентности, 650
каноническая форма, 644
коммутативный закон, 649
логические выражения, 650
отделение подзапросов. 655
план запроса, 646
подстановка кортежей. 655
правила преобразования, 645
процедуры реализации, 645
распределительный закон, 648
семантические преобразования, 651
скалярные выражения. 650
формула стоимости, 646 Ортогональность
языка, 271 Отказы
носителей, 550
системы, 550 Отношения, 97; 151; 423; 1002; 1011
0-кортеж, 220
атрибут, 152
дублирующиеся кортежи, 699 заголовок, 99; 163; 195 значения, 163 "золотое правило", 359 избыточность, 404; 422
Отношения
кардинальность, 152; 163 кортеж, 152 обновление, 360; 377
выборки, 367
пересечений, 366
проекции, 368
разности, 367
расширений, 370
соединений, 372 свойства, 166 степень. 152; 163 тело. 99; 163
функциональная зависимость, 400
хронологическое, 855 Отображение, 67; 74; 75; 77 Отображения, 71
п
Параллельная обработка, 84 Параллельность, 566; 791
блокировка, 569
блокировка намерения, 580
взаимная блокировка, 575
графики, 577
метод управления, 566
упорядочиваемость, 576 Перегрузка, 876 Передача данных
соединения, 801 Переменная кортежа, 244; 247; 251
свободная, 248
связанная, 248 Переменная-отношение, 97: 169; 194; 308;
401; 403;423; 1007; 1011
атомарная, 441
базовая, 105
виртуальная, 350
декомпозиция, 439
распределенная, 771
самоссылающаяся, 317
фрагментация, 773 Переменные экземпляра, 951 Перманентность. 40 План запроса, 646
Поддержка принятия решений, 813 Покрытие, 409 Полиморфизм, 732; 962 Полномочия, 605 Потенциальный ключ, 403; 866 Правило вывода, 901; 904
Предварительная запись, 549 Предикат, 100; 169; 244; 307; 309; 899; 903; 907
Представления, 106; 108; 350; 353; 775
обновление, 358 объединений, 363
определение, 352
параметризованные, 627
принцип взаимозаменяемости, 357
процедура подстановки, 351 Привилегии доступа, 605 Принцип подстановки, 961 Проектирование
ER-диаграмма, 514
ER-моделирование, 516
логическое, 75; 817; 818
ортогональное, 486
физическое, 75; 817; 820 Прозрачность
расположения, 773
репликации, 777 Протоколы
предварительной записи в журнал, 549 Прямое восстановление, 552
Р
Разгруппирование, 223 Разработка данных, 844 Распределенная обработка, 83; 84 Расчетные столбцы, 824 Резервная копия, 552 Резолюция, 925 Рекурсия, 924
Реляционная алгебра. 192; 211:222; 225;
243; 257; 261; 351; 696
логическая импликации, 256
семантика, 199
синтаксис, 197
сравнения, 744 Реляционная замкнутость, 94 Реляционная модель, 97
замкнутость, 195 Реляционная полнота, 261 Реляционное исчисление, 243; 257; 260; 302;
696
вычислительные возможности, 262 исчисление доменов, 263 исчисление кортежей, 245 кванторы, 249 реляционная полнота, 266 синтаксис, 245
Реляционное исчисление
условие принадлежности, 263
формула WFF, 246; 248; 249; 251; 252 Реляционные операции, 197; 252; 699; 861
внешнее соединение, 707
выборка, 202
вычитание, 200
группирование, 222
деление, 207
звездообразное соединение, 834
обобщение, 217; 218; 220
объединение, 199
переименование, 196
пересечение, 200
полувычитание, 214
полусоединение, 214
проекция, 203; 427
произведение, 201
прототип кортежа, 252
разгруппирование, 223
расширение, 215
реализация, 658
соединение, 205
сравнения, 225
транзитивное замыкание, 221 Репликация, 777; 823 РСУБД, 796
именование объектов, 783
С
Свойство, 512; 515; 520
многозначное, 512
однозначное, 512
производное, 512 Связь, 41; 113; 508; 510; 512; 516; 517
рекурсивная, 516
свойства, 43
участие сторон, 512 Сервер, 82; 84 Сигнатура, 749 Системный каталог. 301; 639 Системы клиент/сервер, 792; 795 Словарь данных, 80 Составные столбцы, 819 Специализация. 741; 742; 748; 757 Ссылочная диаграмма, 316 Ссылочная целостность, 318
ссылочные операции, 319 Статистические показатели, 653 Степень, 152 Страницы, 73
СУБД. 35: 38; 77; 767; 768; 780; 980
восстановление носителей, 552 системы. 550
доступность, 773
инструментальные средства, 82
каталог, 104; 783
многомерные, 842
многопользовательская, 35
надежность, 775
объектно-реляционные, 999
однопользовательская. 35
оптимизация, 101; 642
подсистема защиты, 604
пользовательский интерфейс, 80
распределенные, 796
резервная копия. 552
РСУБД, 768
утилиты,83
экспертная, 899 Сущность, 41; 75; 113; 507; 511; 515; 516;
725
подтип, 520
подтипы,513
свойства, 43
сильная, 511
слабая, 511
супертип, 513
тип, 507 Схема "звезда", 825 Схемы, 77; 104
внешняя, 71
внутренняя, 73; 75
концептуальная, 71; 72; 75
отображения, 104
т
Теорема Хета, 428 Термы, 903
Тип, 725; 738; 743; 757; 1002; 1007; 1014; 1042
заменимость, 733 иерархия, 729 интервал. 868: 869 корневой, 731 листовой, 731 наследование, 1047 несвязанный, 732 ограничения, 725 подтип, 731; 758 полиморфизм. 733
Тип
представление, 725
проверка, 746
супертип, 731 Типы данных, 152: 169
допустимые представления, 156
ограничения, 156
преобразование, 161
скалярность, 154
физическое представление. 153 Точка фиксации, 548 Транзакции, 48; 109; 307; 545; 807
АСГО-свойства. 786
атомарность, 563
восстановление, 547
временные отметки, 590
двухфазная фиксация. 553; 779; 787
параллельность, 566
поддержка в SQL, 554
предполагаемая фиксация, 790
распределенные, 779; 787
режим доступа, 555
упорядоченность, ПО; 576
уровень изоляции, 555; 578
четырехфазная фиксация, 810 Трехзначная логика, 693 Триггеры, 302; 321; 888
У
Узел, 767; 772 Унификация, 913: 925 Упорядоченность, 110 Упорядочиваемость, 576 Уровень детализации, 832 Уровень изоляции, 578 Уровни архитектуры. 65
внешний. 68 Утилиты. 73; 82; 83
копирования/восстановления, 552
Ф
Фрагментация, 821
Функциональная зависимость, 400; 403; 405; 425; 426; 443; 472; 473; 817; 818 детерминант, 402 диаграмма, 429; 432 замыкание \i, 442 замыкание множества, 405 неприводимое множество, 409 сохранение, 439
Функциональная зависимость транзитивная, 405; 436; 439; 443 тривиальная, 404; 405
X
Хранилища данных, 41; 829
OLAP, 836
загрузка данных, 828
звездообразное соединение, 834
извлечение данных, 827
консолидация данных, 827
магазины данных, 831
очистка данных, 827
размерность, 833
разработка данных, 844
схема типа "снежинка", 836
таблица размерностей, 833
таблица фактов, 833 Хранимые процедуры, 302; 795 Хроники, 560 Хронон, 858
ц
Целостность данных, 97; 301; 602
ч
Четырехфазная фиксация, 810
ш
Шифрование, 621 RSA-схема, 623 алгоритм, 621 ключ, 621
открытый текст, 621
с открытым ключом, 623
стандарты, 622
DES, 623 шифрованный текст, 621 Шлюзы, 796
Я
Языки
базовый язык, 69
обработки данных, 69
определения данных, 69; 71; 78
подъязык данных, 69 Языки запросов, 79
Научно-популярное издание К. Дж. Дейт
Введение в системы баз данных, 7-е издание
Литературный редактор Верстка
Художественный редактор Технический редактор Корректоры
Л.Н. Красножон И. В. Родюк С.А. Чернокозинский Г.Н. Горобец
Л.А. Гордиенко, Л.В. Коровкина,
О.В. Мишутина, Л. В. Чернокозинская
Издательский дом "Вильяме". 101509, Москва, ул. Лесная, д. 43, стр. 1. Изд. лиц. ЛР № 090230 от 23.06.99 Госкомитета РФ по печати.
Подписано в печать 11.08.01. Формат 70x100/16. Гарнитура Times. Печать офсетная. Усл. печ. л. 80,04. Уч.-изд. л. 66,7. Тираж 5000 экз. Заказ № 1379.
Отпечатано с диапозитивов в ФГУП "Печатный двор"
Министерства РФ по делам печати, телерадиовещания и средств массовых коммуникаций. 197110, Санкт-Петербург, Чкаловский пр., 15.
и 1еоретиком в ооласти технологии оаз данных, а его книга Введение в систелп баз данных остается важнейшим первоисточником для тех, кто нуждается в исчерпывающем и не отстающем от времени руководстве по теории баз данных.
Колин Дж. Уайт (Colin J. White),
основатель компании DataBase Associates International, Inc.
"Действительно исчерпывающее, всеобъемлющее описание реляционной модели, выполненное в характерной для Дейта ясной и точной манере изложения."
Шудха Рам (Sudha Ram), университет штата Аризона.
"В книге К. Дж. Дейта возможности языка SQL представлены яснее и подробнее, чем в большинстве других книг. Читатель сможет не только получит! теоретические знания, но и научиться применять их на практике."
— лоч и >>у i_ui, университет штата Оклахома.
голее 25 лет книга К. Дж. Дейта Введение в системы баз данных является одним из самых авторитетных источников (нформации для всех читателей, заинтересованных приобретении ясного и глубокого понимания принципов эункционирования систем баз данных. Превосходно ыполненное переиздание фундаментального труда автора о-прежнему представляет собой исчерпывающее зложение основ технологии баз данных, дополненное шением автора о том, в каких направлениях эта технология 'удет развиваться в будущем.
1ри подготовке седьмого издания Введения в системы баз данных значительная часть книги подверглась серьезной ереработке, выполненной с целью расширения углубления материала по важнейшим темам.
Существенно переработан и расширен материал по реляционной модели, включая обсуждение типов данных (доменов), сравнительный анализ реляционных значений и переменных-отношений, расширенное изложение концепций целостности данных, теории предикатов и использования представлений.
Книга дополнена новым материалом о работе с атрибутами, значениями которых являются отношения, о методах денормализации, ортогонального проектирования и использования альтернативных подходов в семантическом моделировании (включая понятие бизнес-правил).
В книгу включены совершенно новые главы, содержащие обсуждение проблем наследования типов, применения баз данных в приложениях поддержки принятия решений и создания хронологических баз данных.
К основному материалу книги добавлены два новых приложения. Одно из них содержит обобщенные сведения о синтаксисе и семантике операторов языка SOL, а другое представляет собой краткий обзор нового стандарта SQL3, принятие которого ожидается в ближайшем будущем.
итатели этой книги смогут приобрести фундаментальные чания о назначении, основных концепциях и общей груктуре систем баз данных и научаться применять их на оактике, а также смогут освоить теоретические принципы, эторые положены в основу подобных систем.
К. Дж. Дейт является публицистом, лектором, исследователем и независимым консультантом, специализирующимся в области систем реляционных баз данных. На протяжении 30 лет он является одним из активнейших членов сообщества исследователей в области технологии баз данных. Большую часть своего времени Дейт посвятил исследованию, расширению и распространению реляционной технологии как в ее теоретической части, так и в области ее практического применения. Он заслужил репутацию непревзойденного мастера благодаря присущей ему манере излагать самый сложный технический материал в предельно ясном и понятном стиле.
Некоторые другие изданий, выпущенные с участием К. Дж. Дейта
Foundation for Object/Relational Databases: The Third Manifesto (Addison-Wesley, 1998)
Relational Database Writings 1994-1997
(Addison-Wesley, 1998)
A Guide to the SQL Standard, Fourth Edition
(Addison-Wesley, 1997)
Relational Database Writings 1991-1994
(Addison-Wesley, 1995)
A Guide to DB2. Fourth Edition (Addison-Wesley, 1993)
A Guide to Sybase and SQL Server
(Addison-Wesley, 1992)
Relational Database Writings 1989-1991
(Addison-Wesley, 1992)
A Guide to SQL ZDS
(Addison-Wesley. 1989)
1Отметим, что мы, несомненно, поддерживаем эволюционный, а не революционный путь развития СУБД. Для сравнения приведем цитату из книги группы ODMG [24.13]: "[Объектные СУБД] — это результат революционного, а не эволюционного развития ". Мы не верим, что рынок в целом готов к революционным переменам, и не считаем, что они необходимы или должны непременно произойти. В частности, поэтому работа "The Third Manifesto" [3.3] — это, по сути, именно эволюционный манифест, а не революционный.
2 В частности, такие системы послужили слишком широкому распространению заблуждения, что реляционные системы могут поддерживать только ограниченное количество очень простых типов. Вот довольно типичные выдержки из литературы по объектным базам данных: "Реляционные системы баз данных поддерживают очень малый фиксированный набор типов данных" [25.25], "Реляционная СУБД может поддерживать лишь... встроенные типы [в основ-
ном, просто числа, строки, даты и время]" [24.38], "Объектно-реляционные модели расширяют реляционную модель данных, предоставляя более богатую систему типов" [17.61]; и т.д.
3 Термин концептуальная целостность получил распространение благодаря Фреду Бруксу (Fred Brooks), который в [25.1] сказап следующее; "[Концептуальная] целостность— это наиболее важный вопрос в системном проектировании. Лучше не включить в систему определенные несовместимые возможности [и] отразить единый ряд проектных идей, чем иметь систему, которая поддерживает много полезных, но несвязанных и несогласованных идей". Спустя 20 лет он добавил: "Цельный первоклассный программный продукт должен представлять... логически последовательную мысленную модель... [Концептуальная] целостность— наиболее важный фактор для удобства в использовании... И сейчас я в этом убежден больше, чем когда бы то ни было. Концептуальная целостность — это основа для получения качественного продукта".
43 Напомним, что, как указывалось в главе 24, традиционные системы предоставляют тип данных BLOB для обработки "больших двоичных объектов". В объектно-реляционных системах значения данных некоторых типов, определяемых пользователем, могут физически храниться как данные типа BLOB.
5' Так говорится в стандарте, хотя логичнее следовало бы сказать "самое большее одну группу", поскольку групп может не быть совсем, если в результате вычисления предложений FROM и WHERE получится пустая таблица.
6 Напомним, что, как указывалось в главе 8, условные выражения представляют в языке SQL аналог того, что в книге мы называли булевыми или логическими выражениями.
7' Все же добавим, что одним из наиболее неочевидных аспектов являются "домены " в стиле языка SQL (см. главы 4 и 5), которые, по-видимому, были тихо забыты.
8 Сравните в этом отношении свойства условий ALL или ANY (см. приложение А).
9Следует отметить, что этот "мутатор" не является настоящим мутатором в смысле главы 5, т.е. типичным оператором обновления, поскольку по определению он возвращает значение. Обсуждение последствий (неприятных) этого факта, к сожалению, выходит за рамки данного короткого приложения. (См. [3.3], где этот вопрос обсуждается подробно.)
10 За исключением, может быть, строчных типов. Однако существуют некоторые проблемы, связанные с наследованием строчных типов, которые здесь не освещаются, поскольку это выходит за рамки данного приложения.
11 Или, возможно, в некотором представлении. Использование представления в этом приложении не рассматривается.
12 В частности, отметим, что если объявленным типом некоторого параметра Р для некоторого оператора Ор является некоторый структурированный тип Т, то строка базовой таблицы, которая была определена как таблица, "относящаяся к" типу Т, не может передаваться как соответствующий аргумент при вызове оператора Ор.
13* Здесь присутствует некоторый порочный круг: "такая строка" может означать лишь "строку, которая имеет конкретный идентификатор". Обратите внимание на смешивание значения и переменной!
14В большинстве языков, в которых поддерживается операция разыменовывания, также поддерживается операция привязки, но в языке SOL3 — нет.