Uploaded by DimZhyr

БД конспекты

advertisement
Базы данных
Конспект лекций
В.В. Рословцев
Москва
2015
2
Оглавление
1
Введение в проблематику баз данных
1
2
Введение в реляционную модель
2.1 Реляционная модель данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.1.1 Вводные определения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.1.2 Избыточность, выводимость, непротиворечивость . . . . . . . . . . . . . . . . . .
2.1.3 Отношения в РМ vs Отношения в логике . . . . . . . . . . . . . . . . . . . . . . .
2.2 Связь с логикой предикатов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3 Типизация отношений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4 Реляционные и кортежные переменные . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.5 Хранимые, именованные, выразимые отношения . . . . . . . . . . . . . . . . . . . . . . .
2.6 Подъязыки данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
11
11
12
12
12
12
12
13
13
3
Реляционная алгебра
3.1 Оригинальная алгебра Кодда . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1.1 Теоретико-множественные операции . . . . . . . . . . . . . . . . . . . . . . . . .
3.1.2 Ограничение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1.3 Проекция . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1.4 Соединение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1.5 Деление . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2 Примеры типовых запросов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.3 Расширения исходной алгебры. Алгебра Дейта . . . . . . . . . . . . . . . . . . . . . . . .
3.4 Задачи и упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
15
15
16
16
17
17
18
19
19
4
Реляционное исчисление: исчисление кортежей
4.1 Оригинальное исчисление Кодда . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.1.1 Основные положения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.1.2 Ранжирование переменных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.1.3 Общая структура запроса. Alpha-выражения . . . . . . . . . . . . . . . . . . . . .
4.1.4 Некоторые расширения Alpha-выражений . . . . . . . . . . . . . . . . . . . . . .
4.2 Примеры типовых запросов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3 Сведе́ние Alpha-выражений к выражениям реляционной алгебры . . . . . . . . . . . . .
4.4 Расширения оригинального исчисления. Исчисление Дейта . . . . . . . . . . . . . . . . .
4.5 Задачи и упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
21
21
22
23
23
23
24
24
24
5
Современные проблемы в области баз данных
5.1 Поддрежка аспектов ООП . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2 Иерархические и сетевые модели . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3 Декларативные языки запросов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.4
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
25
25
25
25
i
ii
ОГЛАВЛЕНИЕ
Глава 1
Введение в проблематику баз данных
Зачем нужны системы баз данных? Основная цель создания компьютерных программ заключается в автоматизации, в той или иной мере, различных аспектов человеческой деятельности, в том числе
и такой деятельности, в ходе которой происходит сбор, накопление, организация, хранения и обработка
информации. Потребность в автоматизации возникает в связи с тем, что постоянно растут как объемы
решаемых задач (в частности объемы данных, с которыми приходится работать), так и интенсивность
их обработки, т.е. сокращаются приемлемые сроки решения задач, или, как еще говорят, время отклика
системы. Кроме того, использование традиционных средств и ручного труда сопряжено с рядом значительных трудностей: например, бумажные носители имеют свойство теряться, сложнее создавать копии,
наконец, бумага может «портиться» (скажем, под воздействием сырости), не говоря уже о том, что люди
склонны к ошибкам при длительном выполнении рутинных операций.
Первые вычислительные машины были своего рода продвинутыми арифмометрами, а одно из первых их применений связано с задачами взлома шифров в период Второй мировой войны. Позднее, компьютеры стали применять для научных и инженерных расчетов; эти «продвинутые калькуляторы» позволяли в относительно сжатые сроки обрабатывать значительные (по тем временам) объемы данных,
например, накопленные за несколько лет результаты экспериментов, а эта способность к ускоренной
обработке, в свою очередь, стимулировала накопление еще больших объемов данных, что, опять же,
рождало потребность в более совершенных, более производительных машинах. Ламповые компьютеры были громоздкими инженерно-техническими сооружениями, занимавшими целые здания и требовавшие значительный штат обслуживающего персонала; они назывались вычислительными центрами.
Каждая такая машина была уникальной разработкой, с своей собственной архитектурой и системой команд, либо модификацией одного из предыдущих аналогов, а в лучшем случае (ближе к 1970-м гг.)
– мелкосерийным изделием. Разумеется, лишь крупнейшие правительственные и военные организации
могли содержать такие вычислительные центры. Но, по мере внедрения новых технологий, машины становились компактнее, в архитектурном аспекте развивалась преемственность и стандартизация; в 1960х гг. вычислительные центры стали организовывать у себя и использовать крупные государственные и
коммерческие структуры, в основном для решения различных расчетных задач. В частности, одной из
первых задач и одним из наиболее повсеместных видов деятельности, которые требовалось автоматизировать, – была бухгалтерия, расчет заработной платы.
Спектр задач, решение которых автоматизируется в настоящее время с помощью программного обеспечения того или иного вида, слишком широк, чтобы даже пытаться дать о нем представление: это
и управление различного рода производственными станками, конвейерами и целыми цехами; и производство, сбор, хранение и обработка различной научной информации, в т.ч. полученной в результате различных экспериментов; автоматизация документооборота, что существенно повышает эффективность управления организациями; различного рода коммерческая и финансовая деятельность – от мелких интернет-магазинов до крупных концернов и международных банков; управление транспортными
средствами – самолетами, кораблями, электропоездами и даже автомобилями; и многое другое. Многие
эти задачи, в той или мере, упираются в необходимость хранить и обрабатывать данные.
Разумеется, хороший вопрос состоит в том, а что же такое данные – вопрос настолько хороший, что
ответ на него, по крайней мере, общеизвестный, судя по всему, отсутствует. Попытки дать определение,
например, с позиции структурированной информации, ни к чему не приводят, поскольку неизвестным
1
ГЛАВА 1. ВВЕДЕНИЕ В ПРОБЛЕМАТИКУ БАЗ ДАННЫХ
2
остается ответ на вопрос – что такое информация. Шенноновская теория информации – это количественная теория, которая, в частности, утверждает, что количество информации есть мера уменьшения степени неопределенности наших знаний об окружающем мире; теория обладает неоспоримой практической
ценностью, однако не дает ответа на принципиальный вопрос – что такое информация. В настоящее
время распространяется точка зрения, что информация есть особая форма материи, а информационные
процессы носят фундаментальный характер – наряду, например, с физическими, что лишь подтверждает
фундаментальное значение указанных вопросов: что такое данные и что такое информация. По одному
из подходов, как оказывается, довольно продуктивному, ответ на вопрос «что это такое» должен быть
формальным, и лучше всего конструктивным. В частности, хотелось бы, хотя бы, располагать множеством критериев, что считать информацией, а что – данными, а еще лучше – если, например, полагаться
на фундамент классической логики – некоторым предикатом, или дескрипцией. Другие теории, например, аппликативные вычислительные системы, интересны тем, что предполагают конструктивное определение формальных сущностей, т.е. определяют, чем тот или иной объект является, каким обладает
поведением и какую имеет структуру1 .
Что такое данные? С этой точки зрения имеющиеся определения, предлагаемые в большинстве
справочников и энциклопедий, следует признать скорее неформальными пояснениями, которые, лучше или хуже, акцентируются на тех или иных аспектах того объемного понятия, которое обозначается
термином «данные». Например, данные иногда называются фактами; однако о том, что некоторый факт
установлен, можно говорить лишь в той мере, в какой это удалось зафиксировать: например, если экспериментатор уронит на пол кусочек мела, окружающие могут это увидеть, а могут – лишь услышать,
и в последнем случае они будут лишь знать, что что-то упало, но они не будут знать наверняка, что это
именно мел; те наблюдатели, которые находятся близко к экспериментатору, могут увидеть, что мел в
результате падения раскололся, а наблюдатели, находящиеся дальше (или с ослабленным зрением), могут этого и не увидеть. Следовательно, факт установлен лишь в той мере, в какой это позволяют наши
органы чувств или приборы. То же, вообще говоря, касается и данных: данные могут быть неполными,
неточными или даже противоречивыми, с каковыми проблемами часто сталкиваются те, кто занимается
решением различных интеграционных задач.
Однако, тот факт, что мы не знаем ни что такое данные, ни что такое информация, не мешает нам с
ними работать – и даже манипулировать ими как объектами: современные информационные системы,
комплексно или же частично, решают различные задачи по: производству, сбору, организации, хранению, поиску, обработке и переработке данных. Как уже отмечалось, назначение программ состоит в
автоматизации деятельности, т.е. другими словами, программы берут на себя задачу исполнения тех
или иных процессов. При этом, в зависимости от специфики конкретной предметной области (т.е. множества рассматриваемых процессов и объектов, принимающих в них участие), программы содержат в
себе либо некоторые модели этих объектов и процессов, либо сами эти объекты и процессы (разумеется,
возможны и смешанные случаи). Например, рассмотрим некоторый станок, оснащенный набором манипуляторов для обработки деталей (одного или нескольких видов). Станок, разумеется, нельзя поместить
в программу, поэтому программа содержит в себе некоторое представления о станке, достаточное для
решения поставленных задач – например, с точки зрения программы, станок – это просто набор некоторых действий (над теми или иными деталями), которые станок может выполнять; другими словами,
программа содержит в себе модель станка. Примерно то же справедливо и для деталей; процесс, подлежащей автоматизации, – это обработка детали, и, с точки зрения программы, это может быть просто
некоторая последовательность действий, которые необходимо выполнить (возможно, в зависимости от
некоторых условий), а вовсе не сложные физические манипуляции с физическими телами – другими
1
Сказанное, возможно, требует некоторого пояснения с позиции философии и методологии науки: в философии считается
проблематичным дать ответ на вопрос, например, «что такое число?» Это связано с тем, что под вопросом оказывается сам факт
существования таких сущностей – чисел: ведь числа, судя во всему, это лишь абстракция, придуманная людьми, а не какаялибо материальная субстанция, которую можно было бы предъявить. Вместо этого, поступают иначе: описывают некоторую
структуру (откуда и название методологии – структурализм), и если оказывается, что нечто (обычно – некоторая система),
чем бы оно на самом деле ни было, укладывается в эту структуру, то это нечто является, среди прочего, еще и, как в нашем
примере, числами. Такой подход обладает несомненными преимуществами: кроме того, что он избавляет от необходимости
доказывать факт существования чисел как таковых, он еще и достаточно естественно позволяет строить системы, в которых
одни и те же сущности проявляются в различных ипостасях. У этой системы есть и фундаментальные проблемы, однако их
обсуждение выходит далеко за рамки настоящей работы.
3
словами, программа содержит в себе некоторую модель процесса, адекватную с определенной точки
зрения. Противоположный пример: информационная система – сайт интернет-магазина, занимающегося продажей аудиовизуального контента. В этом случае объекты продажи являются цифровыми по своей
природе; процесс оформления заказа осуществляется через тот же сайт, оплата – с помощью электронной платежной системы, а доставка товара – просто скачивание контента по предоставленной ссылке.
Таким образом, в этой предметной области все объекты и процессы являются цифровыми по своей природе и сами, непосредственно, содержатся в соответствующей программе.
Модели данных. Иерархическая модель. Конечно, при разработке систем, предназначенных для
работы с данными, основной возникающий вопрос – это как эти данные организовать и хранить на физических носителях, как обеспечить их поиск и доступ к ним. В 1960-х гг., когда стали возникать первые информационные системы, наблюдался повышенный интерес к искусственному интеллекту: как устроены
и работают органы восприятия, как работает нервная система, наконец как человек думает и принимает
решения. В частности, большое внимание уделялось исследованиям и разработке того, что сейчас называется моделями представления знаний, среди которых, по различным причинам, представляют особый
интерес т.н. семантические сети, суть которых, упрощенно говоря, сводится к тому, что «кусочки знаний» являются (разнотипными) узлами графа, а ассоциативные связи – (разнотипными) дугами. Отчасти
под воздействием этих идей, первые разработчики информационных систем применяли иерархическую
и сетевую модели для организации и хранения данных.
Применение иерархической модели связано с тем, что, во-первых, во многих предметных областях
действительно очень естественно возникают именно такие структуры связей между объектами; во-вторых,
это концептуально и технически очень простая модель. В иерархической модели каждый узел представляет объект (или группу объектов), а дочерние узлы – значения атрибутов, связанные объекты и другую «детализирующую информацию». На рис. 1.1 в качестве примера приведен фрагмент, отражающий
следующее. Во-первых, существует факультет №1, и в его составе функционируют, по крайней мере,
3 кафедры. Во-вторых, на кафедре №1 учится 3 учебные группы, в каждой из которых есть староста
(информация относительно первых двух групп на рисунке опущена ради экономии места). В-третьих,
заведующим кафедрой является Иванов, а его заместителем – Петров, а студент, который в списке группы №3 идет под номером 2, является старостой этой группы. Кроме того, Иванов также заведующий
кафедрой №2, а Петров – заведующий кафедрой №3. Необходимо обратить внимание, что в данной модели имеет место дублированием данных, что осложняет обеспечение их целостности.
Сетевая модель не только позволяет избежать дублирования, но и предоставляет возможности
для явного отражения принадлежности объектов к различным типам и категориям (за счет приписывания узлам определенных типов или/и меток); кроме того, учитываются разные типы связей, возникающие между объектами, за счет использования разнотипных дуг. На рис. 1.2 изображена сетевая модель,
отражающая те же сведения, что и в предыдущем примере. Сетевая модель позволяет избежать дублирование данных, а иерархическая обеспечивает быстрый поиск вдоль иерархий. Работа с сетевой моделью
заключается в навигации по сети вдоль дуг.
Узлы в иерархической и сетевой моделях представлялись с помощью записей (records), а связи между
ними – с помощью указателей, причем прикладные программисты вынуждены были работать непосредственно с этими низкоуровневыми структурами данных. В их обязанность входила разработка программ
и процедур для вставки, удаления и обновления данных, а также поддержания целостности. Если же
модель предметной области по каким-либо причинам менялась, то приходилось вносить изменения (и
отлаживать их!) не только в структуры данных, но и в поддерживающие процедуры, а трудозатраты на
это возрастали едва ли не экспоненциально с ростом сложности структуры банка данных2 .
Реляционная модель. Реляционная модель была впервые предложена в 1969 г. Э. Коддом и отличается от своих предшественниц тем, что это логическая модель данных, полностью абстрагирующая
от физических структур и других деталей реализации. В результате, все типовые задачи, связанные с
2
В то время говорили о банках данных; термин «база данных» появился позднее, вместе с реляционной моделью. В настоящее время с термином «банк данных» связывается задача централизованного хранения и коллективного использования
данных, которые распределены по нескольким базам данных в составе банка.
4
ГЛАВА 1. ВВЕДЕНИЕ В ПРОБЛЕМАТИКУ БАЗ ДАННЫХ
Рис. 1.1: Пример иерархической модели
5
Рис. 1.2: Пример сетевой модели
ГЛАВА 1. ВВЕДЕНИЕ В ПРОБЛЕМАТИКУ БАЗ ДАННЫХ
6
определением, поиском и изменением данных, приобрели унифицированную форму, а их реализация,
фактически, была стандартизована; возник новый класс программных систем – системы управления
базами данных (СУБД)3 . Возникновение реляционные модели, фактически, открыло эпоху настоящего
развития систем баз данных, а сама реляционная модель в существенной степени определяет архитектуру современных СУБД.
СУБД – это специализированная программная система (на самом деле, очень сложная по своей организации), предоставляющая некоторый интерфейс, в первую очредь, программный (API 4 ), для работы
с базами данных. В число основных функций СУБД входит:
• Обеспечение возможности создавать новые базы данных и определять то, что неформально называется их схемой, с помощью так называемого языка определения данных (ЯОД5 ).
• Обеспечение средств для обращения, запроса данных (удовлетворяющих некоторому критерию,
который обычно записывается на языке запросов6 ), а также манипулирования ими – обновления,
добавления, удаления – обычно, с помощью языка манипулирования данными (ЯМД)7 .
• В настоящее время особенно актуальна способность СУБД к масштабированию, что проявляется
в способности эффективно использовать имеющиеся аппаратные средства для работы с большими
и сверхбольшими объемами данных (терабайты и более).
• СУБД должны быть устойчивыми к различного рода сбоям и даже преднамеренным попыткам
некорректного использования, т.е. гарантировать сохранность данных или хотя бы возможность
их восстановления, включая и случаи аппаратных сбоев (что может проявляться, например, в постоянном резервном копировании данных на вторичный жесткий диск на случай неисправности
основного).
• Современные СУБД практически все обеспечивают возможность одновременной работы множества пользователей (в роли которых могут быть как люди, так и прикладные программные системы). При этом, во-первых, поддерживается определенный уровень изоляции, так что действия
одного пользователя не влияют на результаты работы другого (на самом деле, это не совсем так,
если оба пользователя работают с одним и тем же набором данных, однако подробное обсуждение лучше отложить). Во-вторых, должна поддерживаться транзакционность – режим работы, при
котором некоторая последовательность действий либо выполняется полностью и успешно, либо,
если на каком-либо этапе возникает сбой, все изменения «откатываются» до состояния, предшествующего началу транзакции.
В настоящее время СУБД представляют собой исключительно сложные по внутреннему устройству
системы, способные работать в самых различных режимах: они могут встраиваться в компактные программы, выполняемые на мобильных устройствах, или же представлять собой целые отказоустойчивые,
высокопроизводительные кластеры.
С точки зрения выполнения пользовательских запросов, СУБД функционируют по общей схеме,
представленной на рис. 1.3. На вход поступает то, что называется запросом, и запросы обычно относятся к одной из двух категорий: либо на получение или модификацию некоторых данных (DML), либо
на (до)определение или/и изменение их структуры (DDL). Запрос подвергается анализу, в результате которого генерирует план выполнения этого запроса, который непосредственно исполняется реляционной
машиной. В исполнении запроса могут участвовать как данные, сохраненные в базе данных на жестком
диске, так и некоторые временные или же сохранные в кеше (часто, в оперативной памяти) данные.
3
Английский эквивалент: Database Maanagement System, DBMS
Apllication Programming Interface – программный интерфейс приложения, или, иногда, прикладной программный интерфейс.
5
Data Definition Language, DDL
6
Query Language
7
Data Manipulation Language, DML. Часто, язык запросов считается подмножеством ЯМД
4
7
Рис. 1.3: Схема выполнения пользовательских запросов
8
ГЛАВА 1. ВВЕДЕНИЕ В ПРОБЛЕМАТИКУ БАЗ ДАННЫХ
Рис. 1.4: Основные компоненты СУБД
Архитектура СУБД. Современные СУБД – исключительно сложные системы, состоящие из большого количества компонентов, выполняющих как основные задачи, имеющие непосредственное отношения к выполнению запросов, так и различные вспомогательные (но, тем не менее, очень важные),
такие, как мониторинг и восстановление после сбоев, резервное копирование и освобождение неиспользуемых ресурсов, и многие другие. На схеме 1.4 изображена типовая схема устройства СУБД (опять же,
с точки зрения выполнения запросов); вспомогательные компоненты на данной схеме не указаны.
Основным способом взаимодействия с СУБД, независимо от того, идет ли речь о встроенной системе
или работающей в режиме выделенного сервера, является ее программный интерфейс (API). Поскольку с СУБД часто работают программы, написанные на языках программирования, отличных от того,
на котором была написана сама СУБД, требуются специальные программные модули-посредники. Их
назначение – преобразование обращений внешней программы в формат, приемлемый для СУБД. По
этому же принципу устроено и взаимодействие с СУБД конечных пользователей – людей: они работают
с некоторой программой-оболочкой, предоставляющей подходящей (как правило, графический) интерфейс для подготовки запросов и чтения результатов. Обычно, эти программы-оболочки пользуются тем
же программным интерфейсом для взаимодействия собственно с СУБД.
Запросы в СУБД поступают, чаще всего, в строковом виде; реже – в форме структурированных объектов. В любом случае, для того, чтобы запрос мог быть выполнен, необходимо построить то, что называется планом запроса, который, упрощенно говоря, состоит из вызовов инструкций реляционной машины, работа которой более или менее сводится к исполнению этих инструкций и реляционных операций,
9
о которых будет рассказано в дальнейшем. Если запрос поступил в виде строки, его необходимо предварительно подвергнуть синтаксическому анализу. Подготовка плана запроса включает две основные
стадии: семантический анализ, в ходе которого проверяется, например, корректность ссылок на объекты базы данных, и собственно генерация инструкций, составляющих план.
Назначение диспетчера состоит в координации и параллельном исполнении нескольких запросов,
что особенно важно в многопользовательских и высоконагруженных системах. За фактическое же исполнение инструкций отвечает абстрактная машина. Она отвечает за выполнения реляционных операций над отношениями; может случиться так, что некоторые части запроса уже ранее были выполнены и
сохранены в кеш, тогда машина может просто использовать их, вместо повторного вычисления.
Фактические данные хранятся на жестком диске (или, в некоторых случаях, в оперативной памяти) и
обычно организованы с помощью сложных структур, предназначенных для повышения эффективности
поиска. Если данные хранятся на жестком диске, то они хранятся, как правило, в одном или нескольких
больших файлах, возможно, разнесенных, в целях повышения надежности или/и быстродействия, по
разным физическим устройствам. При этом формат самого файла обычно является древовидным и сам
напоминает устройство файловой системы. Данные, к которым обращения наиболее частые, сохраняются в буфере или кеше в оперативной памяти.
Зачем нужна теория? Реляционная модель была предложена более 40 лет назад, за это время были
созданы десятки исследовательских и коммерческих СУБД – большая часть из них уже перестала существовать, а некоторые занимают (и при том – не первый десяток лет) позиции мировых промышленных
лидеров, однако, основная масса этих систем в той или иной мере нарушает те или иные базовые принципы реляционной модели. В числе очевидных недостатков, по крайней мере, значатся два: во-первых,
решение, созданное средствами одной СУБД, в лучшем случае, с трудом может быть перенесено на
другую; во-вторых, подходы и методы решения одних и тех же задач в разных СУБД могут разниться
настолько, что опыт использования одной СУБД оказывается малополезен при переходе на другу, т.е.,
иными словами, при изучении каждой СУБД есть свой, более или менее значительный, порог вхождения. Оставляя в стороне вопросы коммерции (которые, как показывает история, сыграли доминирующую
роль в развитии многих лидирующих СУБД)8 , скажем, что есть, по меньшей мере, два довода в пользу поддержки СУБД именно реляционной модели. Во-первых, формальная модель, по сути, определяет стандарт, а зная свойства модели, можно, в известных пределах, предсказывать поведение системы,
поддерживающей такой стандарт. Реляционная модель, по факту, единственная на сегодня формальная модель данных, причем глубоко проработанная теоретически и проверенная на практике временем.
Во-вторых, когда система соответствует хорошо проработанной (т.е. свободной от логических ошибок)
модели, она, в свою очередь, так же свободна от соответствующих логических ошибок, а это снижает
вероятность возникновения различных трудноразрешимых (или вовсе непреодолимых) проблем.
Кроме чисто практического аспекта, связанного с изучением реляционной модели, есть еще аспект
фундаментальный: невозможно переоценить роль, которую сыграла реляционная модель в развитии (и
даже становлении) информационных технологий, теоретических и прикладных компьютерных наук, в
программировании. Различные идеи и прямые и косвенные следствия ее нашли применение буквально
повсеместно, на уровне моделей, архитектур и реализаций, а владение этими идеями – это то, что в
существенной мере обусловливает состоятельность ученого и инженера в теоретических и прикладных
областях, так или иначе связанных с программированием.
8
Хотя, все же, отметим, что стандартизация, например, архитектуры персонального компьютера и интерфейсов различных
компонентов до сих пор не привела к монополизации соответствующих секторов рынка – не более, чем это имеет место в сфере
СУБД.
10
ГЛАВА 1. ВВЕДЕНИЕ В ПРОБЛЕМАТИКУ БАЗ ДАННЫХ
Глава 2
Введение в реляционную модель
2.1
Реляционная модель данных
2.1.1
Вводные определения
Пусть даны два множества, скажем, S1 и S2 ; декартовым произведением двух множеств называется
новое множество, составленное из всевозможных пар соответствующих элементов:
S1 × S2 = {(x, y) : x ∈ S1 ∧ y ∈ S2 }.
Расширенное декартово произведение n множеств S1 , . . . , Sn (где n ≥ 1) – это новое множество,
которое определяется следующим образом:
S1 × · · · × Sn = {(x1 , . . . , xn ) : xi ∈ Si , i = 1, n}.
Элементы таких множеств называются n-ками, или кортежами1 . В случае, когда n = 1, речь идет
о декартовом произведении первого порядка, и оно совпадает с единственным исходным множеством
S1 ; это также означает, что у унарных кортежей всего одна компонента, и не делается различия между
одноместным кортежом и значением его единственной компоненты (другими словами, любой отдельно
взятый элемент любого множества может рассматриваться как одноместный кортеж).
Пусть даны два кортежа x = (x1 , . . . , xn ) и y = (y1 , . . . , ym ), тогда их сцеплением (конкатенацией)
будет кортеж размерности n + m:
x × y = (x1 , . . . , xn , y1 , . . . , ym ).
Если задан набор множеств (в дальнейшем, мы будем пользоваться термином «домен»2 ) D1 , . . . , Dn
и список так называемых атрибутов A1 , . . . , An , каждый из которых определен на соответствующем домене, то отношением R, определенным на этих атрибутах A1 , . . . , An (говорят также, что отношение
определено на доменах D1 , . . . , Dn ) называется сущность, являющаяся подмножеством расширенного
декартова произведения данных доменов: R ⊆ D1 × · · · × Dn . Отношение, таким образом, является, в
свою очередь множеством, а каждый атрибут Ai является компонентом отношения и определен на соответствующем домене Di . Количество атрибутов называется размерностью, или арностью, отношения.
1
Английский эквивалент – n-tuple, или просто tuple
Доменом называется полная непрерывная решетка – частично-упорядоченное множество, у которого есть точная верхняя
и нижняя грань (и удовлетворяющее некоторым дополнительным критериям, которые для целей данного изложения несущественны), либо верхняя полурешетка (есть только верхняя грань), либо нижняя полурешетка (есть только нижняя грань).
Домены, таким образом, являются особым классом множеств. Существует ряд философских и практических соображений, по
которым предпочтительнее оказывается использовать домены вместо вообще множеств. Наличие дополнительной структуры
– частичного порядка – играет важную роль, например, в теории типов. В некоторых вариантах теории множеств не гарантируется даже возможность «извлечения» (выбора) отдельных его элементов, в то время как для домена всегда можно построить
топологическое упорядочение его элементов. В домен можно объединить лишь множество (эффективно) вычислимых элементов. (Интересен тот факт, что «большая часть» действительных чисел – а именно, трансцендентные числа – таковыми
не являются; в теории чисел каждое вещественное число считается пределом некоторой последовательности рациональных
чисел и в расчетах заменяется некоторым k-м элементом такой последовательности, который считается приближением этого
действительного числа.)
2
11
ГЛАВА 2. ВВЕДЕНИЕ В РЕЛЯЦИОННУЮ МОДЕЛЬ
12
Список атрибутов называется заголовком отношения, а сами атрибуты идентифицируются по некоторому имени, которое им приписывается. Множество кортежей, входящих в состав отношения, называется
телом отношения. Если тело пустое (т.е. является пустым множеством), то и само отношение называется пустым. Очевидно, что в тело одного отношения могут входить только однотипные кортежи – у
которых совпадает число компонент, а значения соответствующих компонент принадлежат одному и
тому же домену.
В дальнейшем, вплоть до того момента, когда не будет оговорено иное, мы будем предполагать, что
отношение определено на простых доменах (т.е. их элементами являются атомарные сущности). Домен называется составным, если он представляет собой расширенное декартово произведение конечного числа простых доменов. Будем говорить, что два простых домена D1 и D2 являются совместимыми относительно операции объединения3 , или просто совместимыми, если они либо совпадают, либо
D2 ⊆ D1 . Аналогично, составные домены называются совместимыми, если и только если совместимы
их соответствующие компоненты.
2.1.2 Избыточность, выводимость, непротиворечивость
2.1.3 Отношения в РМ vs Отношения в логике
2.2 Связь с логикой предикатов
2.3 Типизация отношений
2.4 Реляционные и кортежные переменные
Отношение как таковое, с математической точки зрения, – это некоторая константа, пусть и сложно устроенная (состоящая из набора компонентов), в противоположность, например, числам, которые
обычно рассматриваются как атомарные (бесструктурные) сущности. Отношение представляет собой, в
первую очередь, множество кортежей, оснащенное тем, что называется заголовком отношения. Этот заголовок содержит перечисление атрибутов, входящих в состав отношения, и определяет, какие по структуре кортежи могут в это отношение входить. Ясное дело, что каков бы ни был заголовок, различных
отношений с таким заголовком может существовать, по меньшей мере, два (например, в случае пустого
заголовка), а чаще – (бесконечно) много. Такие однотипные отношения4 полезно объединять в домены,
а на доменах можно определять переменные – а именно, в данном случае, переменные отношений, или
реляционные переменные.
Реляционные переменные ведут себя в точности так же, как и любые другие переменные: у них есть
конкретная область определения (т.е. множество допустимых значений) и они могут принимать различные значения в зависимости от некоторого контекста. Вопрос приписывания значения переменной
исследуется в теории вычислений, и данное обсуждение выходит за рамки настоящей работы. Короткое
пояснение состоит в следующем. Предположим, что зафиксирован некоторый домен D однотипных отношений и определенная на этом домене реляционная переменная R. Предположим далее, что имеется
некоторое множество возможных миров {Wi }, так что в каждом из них переменной R приписывается
некоторое значение v = v(Wi ). В зависимости от конкретных обстоятельств, заданное множество миров
можно интерпретировать по-разному. Например, каждый возможный мир Wi может соответствовать состоянию базы данных на момент времени i, и, в таком случае, можно говорить о том, что переменная
R в разные моменты времени принимает, вообще говоря, различные значения. Во-вторых, можно рассматривать множество различных серверов, на которых развернута «одна и та же» база данных, и тогда
каждый из миров Wi соответствует состоянию это базы данных на i-м сервере (в один и тот же момент
времени).
Последний пример показывает, что можно говорить о переменных базы данных, значениями которых
являются «состояния» базы данных. Более строго, база данных представляет собой систему переменных
3
Кодд обозначает такие домены термином «union-compatible».
В дальнейшем мы подробнее рассмотрим вопросы типизации, а пока что примем соглашение, что однотипными отношениями называются отношения, у которых соответствующие атрибуты определены на одном и том же типе, либо на двух
различных, но «совместимых», типах.
4
2.5. ХРАНИМЫЕ, ИМЕНОВАННЫЕ, ВЫРАЗИМЫЕ ОТНОШЕНИЯ
13
отношений и, в свою очередь, ведет себя как переменная, значение которой определяется совокупностью
значений всех реляционных переменных, входящих в базу данных. Это означает, что всякий раз когда
над базой данных выполняется какая-либо модифицирующая операция, то она приводит не к тому, что
меняется одно или несколько отношений – отношения являются константами и не могут быть изменены,
– а меняется значение соответствующих реляционных переменных, и, как следствие, меняется значение
переменной базы данных в целом.
Именно так обстоят дела на логическом уровне; совершенно отдельный, ортогональный, вопрос состоит в том, что происходит на физическом уровне, с данными, хранящимися на физических носителях.
Разумеется, в условиях, когда объем базы данных может исчисляться терабайтами, полностью перезаписывать всю базу данных при выполнении каждой изменяющей операции, в лучшем случае, неразумно.
Фактическим изменениям подвергаются лишь отдельные фрагменты, причем прежние значения обычно архивируются тем или иным способом. Это – проблематика проектирования и реализации СУБД,
обсуждение которой мы пока что отложим, а сфокусируемся на логическом уровне.
У всякой реляционной переменной (relational variable, relvar), так же, как и у отношений, есть заголовок – список атрибутов; допустимыми значениями реляционной переменной являются только отношения с таким же, как у переменной, заголовком (это требование можно ослабить, потребовав вместо
этого, чтобы заголовок отношения был совместимым с заголовком переменной).
Интересной оказывается конструкция, которая называется кортежной переменной; для начала скажем, что кортежная переменная – это переменная, определенная на некотором отношении, т.е. ее значениями могут быть лишь кортежи определенного типа (и, сверх того, входящие в определенное, фиксированное отношение). На самом деле, можно говорить также о кортежных переменных, определенных
на реляционных переменных. Под этим понимается, что, гипотетически, возможными значениями такой
кортежной переменной могут быть любые кортежи, входящие в любое возможное значение реляционной переменной (т.е. конкретное отношение не фиксируется, а лишь множество «подходящих» отношений). Фактически, область допустимых значений такой переменной определена лишь тогда, когда
означена соответствующая реляционная переменная (например, относительно некоторого возможного
мира), т.е. когда ей приписано значение – некоторое конкретное отношение. Такие кортежные переменные иллюстрируют интересную идею – переменных с меняющейся областью определения5 . Уточнение,
касающееся означивания реляционной переменной, следует воспринимать с учетом того, что некоторые реляционные перемены связаны с исходными (например, хранимыми) отношениями, и значение
для таких переменных извлекается «непосредственно»; в то же время, бывают и другие реляционные
переменные, с которыми связаны некоторые выражения на реляционном подъязыке данных, и для получения значения таких («производных») переменных необходимо вычислить значение соответствующего
выражения.
2.5
Хранимые, именованные, выразимые отношения
2.6
Подъязыки данных
5
Фактически, реляционные и определенные на них кортженые переменные ведут себя в точности так же, как множество
концептов и определенных на них переменных, соответственно.
14
ГЛАВА 2. ВВЕДЕНИЕ В РЕЛЯЦИОННУЮ МОДЕЛЬ
Глава 3
Реляционная алгебра
3.1
Оригинальная алгебра Кодда
В своих оригинальных работах, Э. Кодд формулировал определения таким образом, что не только
существенен порядок перечисления доменов, на которых определено отношение, но и атрибуты в рамках
отношения предлагалось идентифицировались по числовым индексам. В последствии эта точка зрения
эволюционировала, и в настоящее время реляционная модель запрещает идентификацию атрибутов по
их индексам или порядковым номерам и предписывает, чтобы порядок перечисления атрибутов при
определении заголовка отношения или реляционной переменной был несущественен, а обращаться к
атрибутам можно было бы только по их именам. То же, разумеется, относится и к кортежам: доступ к
компонентам кортежа, относящегося к некоторому отношению, так же должен осуществляться по имени
соответствующего атрибута (значением которого этот компонент и является).
В качестве побочного замечания, отметим, что в SQL, хотя обращаться к атрибутам непосредственно
по их порядковому номеру нельзя, есть возможность писать запросы, которые существенно опираются
на порядок перечисления атрибутов, указанный при определении соответствующей реляционной переменной. Последствия этого сводятся к тому, что запросы становятся несколько короче, но их значительно труднее читать, в них легче допустить ошибку (которую, при подходящих условиях, будет нелегко
локализовать), и больше вероятность, что их придется модифицировать в случае изменения заголовка
реляционной переменной.
В этой и следующей главе мы воспроизводим оригинальная формулировку, соответственно, реляционной алгебры и исчисления [Codd-sublang ] – за единственным исключением, касающимся способа
обращения к атрибутам. В действительности, как нам представляется, это не слишком принципиальный вопрос: в любом случае, для каждого отношения (или реляционной переменной) имеется система идентификаторов (строковых имен, числовых индексов или же порядковых номеров) и соотнесение
– отображение, которое каждому идентификатору (взаимно-)однозначным способом ставит в соответствие определенный атрибут.
Начнем мы, традиционно, с реляционной алгебры. Носителем этой алгебры является множество (всевозможных) отношений различных (конечных) порядков (в предположении, что зафиксировано некоторое, необязательно конечное, множество доменов). Операции реляционной алгебры естественным образом образуют две категории – теоретико-множественные и собственно реляционные.
3.1.1
Теоретико-множественные операции
Поскольку отношения являются, по сути, множествами, к ним применимы те же операции – но с
некоторыми ограничениями. Во-первых, операции объединения (∪), пересечения (∩) и вычитания (−)
применимы только к парам однотипных (совместимых) отношений. Это, разумеется, гарантирует, что у
результирующего отношения будет тот же заголовок, что и у исходных отношений. Во-вторых, вместо
обычной операции декартова произведения, используется расширенное декартово произведение. Отличие, напомним, состоит в том, что если в результате обычного декартова произведения получается множество пар – всевозможных сочетаний элементов исходных множеств, то в результате расширенного –
множество кортежей, размерность которых равняется сумме размерностей исходных отношений.
15
ГЛАВА 3. РЕЛЯЦИОННАЯ АЛГЕБРА
16
В дальнейшем, если не оговаривается иное, мы под декартовым произведением всегда будем подразумевать его расширенную версию. Пусть даны отношения R арности n и S арности m; тогда их (расширенное!) декартово произведение:
R × S = {r × s ∧ r ∈ R ∧ s ∈ S}
– будет отношением размерности n+m. Напомним, что операция × применительно к кортежам означает
их сцепление.
Далее мы попунктно остановимся на каждой из чисто реляционныых операций.
3.1.2 Ограничение
Назначение первой из рассматриваемых нами операций – ограничения – заключается в «отборе»
определенных кортежей, т.е. построении нового отношения, в которое входят только такие кортежи из
исходного отношения, которые удовлетворяют определенному условию. Пусть R – заданное отношение,
а A и B – некоторые два списка идентификаторов атрибутов, а символом θ будем обозначать одну из
операций сравнения =, ̸=, >, <, ≥, ≤. Тогда операция ограничения определяется следующим образом:
R[AθB] = {r|r ∈ R ∧ (r[A]θr[B])},
при условии, что значения выражений r[A] и r[B] – однотипные. Данное определение, строго говоря,
допускает только сравнение между собой значений (составных) атрибутов в рамках одного кортежа,
в то время как на практике часто возникает потребность сравнивать значение (составного) атрибута с
некоторым (заранее известным) константным значением. Сохраняя исходное Коддовское определение,
мы можем писать выражения R[Aθα], где α – некоторая константа, совместимая по типу с r[A], если
принять соглашение:
R[Aθα] = (R × _(Bα ){(α)})[AθBα ]
При этом подразумевается, что запись _(Bα ){(α)} обозначает безымянное отношение с единственным атрибутом Bα , а тело состоит из единственного кортежа α (у которого единственный атрибут, возможно, составной). Результатом R × _(Bα ){(α)} будет отношение, которое отличается от R наличием
дополнительного атрибута, значение которого у всех кортежей будет одинаковым и равняться α. Аналогичным образом, можно сделать еще большее обобщение, положив:

R[AθB], если λ = A и µ = B



R[αθB] = (R × _(Aα ){(α)})[Aα θB], если λ = α и µ = B
,
R[λθµ] =
R[Aθβ] = (R × _(Bβ ){(β)})[AθBβ ], если λ = A и µ = β



R[αθβ] = (R × _(Bα ){(α)} × _(Bβ ){(β)})[Aα θBβ ], если λ = α и µ = β
где A и B – некоторые атрибуты, α и β – константа, причем, как и прежде, значения r[A], r[B], α и β
совместимы по типу.
3.1.3 Проекция
Проекция представляет собой операцию, дуальную (расширенному) декартову произведению. Если
декартово произведение позволяет «наращивать» число атрибутов, то проекция, наоборот, сокращает.
Пусть имеется отношение R(A1 , . . . , An ) и пусть L = Aj1 , . . . , Ajp – список (необязательно различных)
идентификаторов атрибутов отношения R. Тогда проекция отношения R на список атрибутов L определяется следующим образом:
R[L] = {r[L]|r ∈ R},
где r[L] = r[Aj1 , . . . , Ajp ] = (r[Aj1 ], . . . , r[Ajp ]). Таким образом, проекция некоторого исходного отношения на заданный список атрибутов заключается в построении нового отношения, такого, что каждому
3.1. ОРИГИНАЛЬНАЯ АЛГЕБРА КОДДА
17
кортежу из исходного отношения ставится в соответствие единственный (новый) кортеж, конструируемый из требуемых компонента (атрибутов) исходного кортежа. Поскольку отношение является множеством кортежей, повторений, разумеется, не возникает: одному кортежу в результирующем отношении
может соответствовать несколько «прообразов» в исходном отношении. Если список целевых атрибутов
пустой, то, по Кодду1 , проекция на пустое множество атрибутов дает исходное отношение: r[] = r и,
соответственно, R[] = R. Мы, однако, будем считать, что результатом проекции на пустое множество
атрибутов является новое отношение с пустым заголовком.
Отношений с пустым заголовком существует всего два: у одного из них тело пустое, а у другого
содержит единственный элемент — кортеж нулевой арности (). Первое из этих отношений мы будем
обозначать символом ⊥, а второе — символом ⊤. На существование этих двух констант указали К. Дейт
и Х. Дарвен, см. подробное обсуждение в [3-й манифест].
Таким образом, результатом проекции R[] некоторого произвольного отношения R на пустое множество атрибутов будет либо отношение ⊥, если исходное отношение было пустым, либо отношение ⊤,
если исходное отношение было непустым. Очевидно, что ⊥[] = ⊥ и ⊤[] = ⊤.
3.1.4
Соединение
Соединение можно рассматривать как композицию декартова произведения двух отношений с последующим ограничением по заданному условию. Пусть θ ∈ {=, ̸=, >, <, ≥, ≤}, и R1 (A1 , . . . , An ) и
R2 (B1 , . . . , Bm ) – данные отношения. Тогда θ-соединением отношения R1 по атрибуту Ai с отношением R2 по атрибуту Bj определяется следуюющим образом:
R1 [R1 [Ai ]θR2 [Bj ]]R2 = {r1 × r2 |r1 ∈ R1 ∧ r2 ∈ R2 ∧ r1 [Ai ]θr2 [Bj ]}
При этом, во-первых, выражения r[Ai ] и r[Bj ] должны быть однотипными, а вместо отдельных атрибутов Ai и Bj могут фигурировать соответствующие списки атрибутов. Существенно, чтобы отношение θ было тотальным (англ. total), т.е. это должно быть отношение полного порядка на домене
R1 [Ai ] × R1 [Bj ] (независимо от того, являются ли Ai и Bj отдельными атрибутами или же списками).
В случае, если в качестве θ берется равенство, то говорят об экви-соединении. Результатом соединения
всегда является отношение с n + m атрибутами, в котором значения атрибутов Ai и Bj всегда совпадают.
Часто рассматривают версию соединения, называемую естественным соединением, при котором «лишний» атрибут удаляется:
R1 [R1 [Ai ]θR2 [Bj ]]′ R2 = (R1 [R1 [Ai ]θR2 [Bj ]]R2 )[A1 , . . . , An , (B1 , . . . , Bj−1 , Bj+1 , . . . , Bm ]
3.1.5
Деление
Пусть R – бинарное отношение. Тогда образ-множество x по R определяется как:
gR (x) = {y|(x, y) ∈ R}
Пусть R – некоторое заданное отношение, а A – некоторая последовательность атрибутов этого отношения, без повторений. Тогда обозначим A – дополнение A, так что, во-первых, A ∩ A = ∅ и, во-вторых,
A ∪ A – все множество атрибутов отношения R. Тогда делимое отношение R мы рассматриваем как бинарное с (возможно, составными) атрибутами A и A. В таком случае, для любого кортежа r ∈ R можно
говорить об образ-множестве gR (r[A]), и, очевидно, это множество есть подмножество R[A].
Пусть S – также некоторое отношение, и B – последовательность атрибутов этого отношения, такая что S[B] однотипно с R[A]. Тогда деление отношения R на отношение S определяется следующим
образом:
R[A ÷ B]S = {r[A]|r ∈ R ∧ S[B] ⊆ gR (r[A])}
Содержательно, операцию деления можно понимать следующим образом. Пусть отношение S содержит перечень некоторых критериев или свойств, которые идентифицируются (составным) атрибутом B.
1
ГЛАВА 3. РЕЛЯЦИОННАЯ АЛГЕБРА
18
Пусть, далее, отношение R представляет собой бинарное отношение с (возможно, составными) атрибутами A и A, так что значениями атрибута A, по сути, являются идентификаторы упомянутых свойств, а
значения атрибута A – это, предположим, идентификаторы (возможно, составные) некоторых рассматриваемых объектов. В таком случае, результатом деления R[A ÷ B]S будет перечень идентификаторов
объектов, таких, что всякий объект, попавший в выборку, связан, посредством отношения R, со всеми
свойствами, перечисленными в S (и, возможно, еще с некоторыми, которые в S отсутствуют2 ).
3.2 Примеры типовых запросов
В качестве базы данных для (сквозных) примеров запросов будем рассматривать базу данных о производителях, изделиях, которые они производят, и дистрибьютерах, продающих эти изделия. Состав
отношений (точнее, реляционных переменных):
• изделие (атрибуты: номер, название, масса, цвет): R(#R, NR , WR , C);
• деталь (атрибуты: номер, название, масса, код материала, из которого деталь изготовлена): P (#P, NP , WP , M
• состав изделий (т.е. детали, используемые для изготовления изделия; атрибуты: номер изделия,
номер детали): RP (#R, #P );
• производитель (атрибуты: номер, название, город, в котором расположен): M (#M, NM , LM );
• изделия производителя (состав атрибутов: номер производителя, номер изделия): M R(#M, #R);
• дистрибьютор (состав атрибуты: номер, название, город, в котором расположен): D(#D, ND , LD );
• изделия, продаваемые дистрибьютером (состав атрибутов: номер дистрибьютера, номер изделия):
DR(#D, #R).
Далее приведем несколько примеров типовых запросов.
Пример 3.2.1. Найти производителей из Москвы.
Решение. Q1 = M [LM = ’Москва’]
Пример 3.2.2. Найти изделия, которые производятся (в том числе) в Москве
Решение. Q2 = (R[R.#R = M R.#R]M R[M R.#M = m.#M ]Q1 )[R.∗]
Пример 3.2.3. Найти изделия, которые не производятся в Москве.
Решение. Q3 = R − Q2
Пример 3.2.4. Найти изделия, которые производятся только в Москве.
Решение (Вариант №1). Суть решения заключается в том, что из списка изделий, у которых есть
производители из Москвы, мы вычитаем список изделий, у которых есть производители не в Москве.
Q4 = Q2 − (R[R.#R = M R#R]M R[M R.#M = m.#M ](M [LM ̸= ’Москва’]))
Решение (Вариант №2). Q4 =
Замечание. Решение R − Q3 было бы неверным, поскольку в этот список вошли бы также изделия,
которые в данный момент нигде не производятся.
Пример 3.2.5. В каких городах производятся все синие изделия?
Решение. Q5 = (M [M.#M = M R.#M ] (M R[M R.#R ÷ R.#R](R[C = ’Синий’])))[LM ]
Пример 3.2.6. У каких дистрибьюторов в Токио можно купить изделия, которые производятся у всех
производителей из Москвы, и только у них?
2
В общем случае, S может быть некоторым производным, а не исходным, отношением.
3.3. РАСШИРЕНИЯ ИСХОДНОЙ АЛГЕБРЫ. АЛГЕБРА ДЕЙТА
19
Решение. Как и прежде, исходим из предположения, что необязательно, чтобы дистрибьютор продавал все указанные изделия, достаточно, чтобы лишь некоторые (хотя бы одно). Сначала найдем
изделия, которые производятся всеми производителями из Москвы, и только ими:
Q′6 = Q4 [#R] ∩ (M R[M R.#M ÷ M.#M ](M [LM = ’Москва’])
А затем соединим информацией о продаже изделий дистрибьютерами:
Q6 = (D[D.#D = DR.#D]DR[DR.#R = _2.#R]Q′6 )[D.∗]
3.3
Расширения исходной алгебры. Алгебра Дейта
3.4
Задачи и упражнения
Задача 3.4.1. Найти производителей, которые производят только черные изделия
Задача 3.4.2. Найти производителей, у каждого из которых вся продукция – одного и того же цвета
(например, у одного – вся продукция желтая, у другого – синяя, у третьего – зеленая, у четвертого –
тоже желтая).
20
ГЛАВА 3. РЕЛЯЦИОННАЯ АЛГЕБРА
Глава 4
Реляционное исчисление: исчисление
кортежей
4.1
Оригинальное исчисление Кодда
В своей оригинальной работе Кодд называет выражения на реляционном исчислении Alpha-выражениями;
мы так же будем пользоваться этим названием. Реляционное исчисление на кортежах представляет собой
подъязык запросов, основанный на исчислении предикатов первого порядка и предполагающий выражение запросов к базе данных в форме спецификации требований (условий), которым должны удовлетворять кортежи итоговой выборки. Если запросы на языке реляционной алгебры можно, в известной
мере, рассматривать как некие алгоритмы получения требуемых данных (как получить – путем соединения, проекции, и т.п.), то в случае реляционного исчисления в запросе описывается, что требуется
получить (кортежи, такие что ...). Таким образом, запрос на реляционном исчислении состоит из двух
основных частей: в первой указывается, из каких основных отношений мы будем извлекать данные, а
второй определяется условие, которому должен удовлетворять каждый кортеж целевой выборки. Отметим, что высказанные ранее замечания, касающиеся обращения к атрибутам, сохраняют свою силу.
Мы будем примерно придерживаться того же плана изложения, что и Кодд; мы также будем указывать
оригинальные английские эквиваленты основных терминов.
4.1.1
Основные положения
Пусть R1 , . . . , Rn – исходные отношения; тогда каждому такому отношению Ri взаимно-однозначным
образом сопоставим одноместный предикат PRi , такой что если t – некоторый кортеж, то PRi (t) истинно,
если (и только если) кортеж t входит в это отношение. Пусть r – кортежная переменная; тогда договоримся под записью PRi r понимать, что переменной r приписывается отношение Ri в качестве области
определения. Запись PRi r будем называть ранжирующим термом (range term).
Выражения вида r[A], где r – кортежная переменная (или кортеж), а A – идентификатор атрибута,
называются индексированными кортежами (indexed tuple) и, как и прежде, обозначают компоненту кортежа, соответствующую атрибуту A (т.е. значение атрибута A кортежа r).
Пусть θ обозначает одно из отношений =, ̸=, >, <, ≥, ≤, а λ и µ – идексированные кортежи, и α
– некоторая константа. Тогда выражения вида λθµ и λθα называются соединительными термами (join
term).
Класс правильно построенных формул (ППФ) реляционного исчисления определяется индукцией по
построению следующим образом:
• (базис индукции) Класс термов образуется из классов ранжирующих термов и соединительных
термов. Термы считаются ППФ.
• (шаг индукции)
i. если Γ – ППФ, то и ̸ Γ – тоже ППФ;
ii. если Γ1 и Γ2 – ППФ, то и Γ1 ∧ Γ2 и Γ1 ∨ Γ2 – тоже ППФ;
21
ГЛАВА 4. РЕЛЯЦИОННОЕ ИСЧИСЛЕНИЕ: ИСЧИСЛЕНИЕ КОРТЕЖЕЙ
22
iii. если Γ – ППФ, причем r ∈ FV(Γ), то и ∀rΓ и ∃rΓ – тоже ППФ.
Здесь и далее, FV(Γ) обозначает множество переменных, имеющих свободные вхождения в Γ.
4.1.2 Ранжирование переменных
Теперь, зададимся целью – каждой кортежной переменной должна быть приписана вполне определенная область допустимых значений. Для этого будем накладывать некоторые ограничения на построенный выше класс ППФ реляционного исчисления. Ранжирующей называется ППФ, не содержащая
кванторов и состоящая только из ранжирующих термов. Например, следующие формулы являются ранжирующими: P1 r1 , P1 r1 ∨ P2 r2 , P1 r1 ∨ P4 r1 ∧ ¬P5 r1 , P1 r1 ∨ ¬P2 r2 .
Ранжирующей ППФ по переменной r называется ранжирующая ППФ, у которой r – единственная
свободная переменная. Из перечисленных в предыдущем абзаце четырех примеров, к данному классу
относятся только первая и третья формулы. Собственная ранжирующая ППФ по переменной r – это
ранжирующая ППФ по переменной r, удовлетворяющая следующим двум условиям: во-первых, символ отрицания ¬, если вообще входит в формулу, встречается лишь после конъюнкции ∧; во-вторых,
если переменная r входит в несколько ранжирующих термов, то предикатам, входящим в их состав,
должны соответствовать однотипные отношения. Требование к однотипности исходных отношений, используемых для задания области определения переменных, происходит из желания, чтобы эта область
определения представляла собой, в частности, однородное множество элементов (которое содержало бы
только однотипные кортежи).
Требование, чтобы знак логического отрицания не появлялся в формуле иначе, как после знака конъюнкции, гарантирует, что область определения всякой переменной будет получена в результате теоретикомножественных операций над существующими (однотипными) отношениями. При этом объединению
соответствует дизъюнкция ∨, пересечению – конъюнкция ∧, а вычитанию – логическое отрицание, следующее за конъюнкцией ¬∧.
Переменным, связанным кванторами, также следует приписывать конкретные области определения.
Пусть ∆ – ППФ, содержащая r в качестве свободной переменной и не содержащая ранжирующих термов
по этой переменной. Если Γ – некоторая заданная собственная ранжирующая формула по r, и пусть мы
хотим использовать эту формулу, чтобы проранжировать переменную r в формулах ∀x∆ и ∃x∆. Для
этого примем следующие соглашения:
∀Γx(∆) = ∀x(¬Γ ∨ ∆)
∃Γx(∆) = ∃x(Γ ∧ ∆)
Такие кванторы будем называть ранжирующими (range-coupled quantifiers, по Кодду). Приведенный
способ определения ранжирующего квантора всеобщности ∀ мотивирован следующим простым соображением. Мы хотим потребовать, чтобы область определения переменной r задавалась формулой Γ;
это означает, что только такие значения для r мы и будем рассматривать. Поэтому, при всех интересующих нас подстановках r в ¬Γ ∨ ∆, формула Γ будет истинной, а значит, ¬Γ – ложной. В результате, все
выражение ¬Γ ∨ ∆ будет истинно лишь при тех же подстановках r, при которых будет истинна ∆.
Для наших целей представляет интерес выделить в реляционном исчислении класс формул, в которых все переменные проранжированы. Такие ППФ мы будем называть нормально-ранжированными;
они имеют следующий вид:
U1 ∧ · · · ∧ Un ∧ V
(4.1.1)
При этом:
1. n ≥ 1;
2. U1 , . . . , Un – собственные ранжирующие формулы, каждая из которых ранжирует собственную
переменную;
3. формула V либо пустая (последний конъюнкт в 4.1.1 отсутствует), либо V удовлетворяет следующим требованиям:
4.2. ПРИМЕРЫ ТИПОВЫХ ЗАПРОСОВ
23
(a) используются только ранжирующие кванторы (если вообще используются);
(b) каждая свободная переменная в V должна быть проранжирована одим из Ui ;
(c) V не содержит ранжирующих термов.
4.1.3
Общая структура запроса. Alpha-выражения
Формула 4.1.1 описывает выражения, соответствующие декартову произведению нескольких отношений с последующим ограничением. Каждая компонента этого произведения описывается ровно одним из выражений i; каждое такое выражение «вводит» (при этом, фактически, приписывая ей вполне
определенный тип) ровно одну кортежную переменную, которая используется для задания ограничения,
описываемого V . Это ограничение описывается в терминах условия (предиката), которому должен удовлетворять составной кортеж; кортежные переменные, проранжированные U1 , . . . , Un используется для
обращения к отдельным компонентам этого составного кортежа. Содержательно, каждая формула Ui
соответствует некоторому отношению, полученному из (однотипных) исходных отношений с помощью
теоретико-множественных операций: объединения, пересечения и вычитания. Расширим нормальноранжированные формулы до выражений, позволяющих записывать также проекцию.
Простыми Alpha-выражениями называются выражения вида:
(t1 , . . . , tk ) : U1 ∧ · · · ∧ Un ∧ V
(4.1.2)
Здесь, U1 ∧ · · · ∧ Un ∧ V – это нормально-ранжированная формула 4.1.1, которую мы выписали явно
для наглядности и удобства дальнейших ссылок. В дальнейшем, эту часть Alpha-выражения мы будем
часто называть телом (запроса)1 . Заголовком запроса мы будем называть первую часть Alpha-выражения
– t1 , . . . , tk , где каждый ti – это либо кортежная переменная, либо индексированная кортежная переменная. В заголовке могут фигурировать лишь те кортежные переменные, которые «объявлены» в теле запроса. Поскольку в заголовке, по сути, перечисляются атрибуты целевого (итогового отношения, которое
должно стать результатом выполнения запроса), этот перечень также часто называется списком целевых
атрибутов.
Определенный выше класс простых Alpha-выражений естественным образом расширяется до Alphaвыражений. Класс Alha-выражений определяется индукцией по построению:
• (базис индукции) Простые Alpha-выражения считаются Alha-выражениями;
• (шаг индукции) пусть z1 = t : w1 и z2 = t : w2 – уже построенные Alpha-выражения, тогда
следующие выражения также относятся считаются Alpha-выражениями:
i. t : w1 ∨ w2 ,
ii. t : w1 ∧ w2 ,
iii. t : w1 ∧ ¬w2 .
Такое расширение обеспечивает простейшие средства композиции запросов в более сложные – с
помощью теоретико-множественных операций объединения, пересечения и вычитания.
4.1.4
Некоторые расширения Alpha-выражений
4.2 Примеры типовых запросов
Пользуясь базой данных из раздела 3.2, и запишем те же запросы в качестве примеров. Но прежде,
отметим, что непосредственно пользоваться именами отношений в языке реляционного исчисления (в
Alpha-выражениях) нельзя; вместо этого, для каждого отношения X определим соответствующий ему
предикат PX , так что выражение PX r приписывает переменной r отношение X в качестве области определения, а выражение PX (r), в котором r – либо (проранжированная) кортежная переменная, либо кортеж, – истинно тогда и только тогда, когда r входит в отношение X. Также отметим, что в примерах ниже
1
Кодд в своей оригинальной работе не вводил понятия тела и заголовка запроса. Однако в настоящее время это общепринятая терминология.
24
ГЛАВА 4. РЕЛЯЦИОННОЕ ИСЧИСЛЕНИЕ: ИСЧИСЛЕНИЕ КОРТЕЖЕЙ
запись вида Q = t : w, следует читать следующим образом: «обозначим Q отношение, являющееся результатом выполнения запроса t : w». В таком случае, PQ будет обозначать предикат, соответствующий
этому новому отношению.
Пример 4.2.1. Найти производителей из Москвы.
Решение. Q1 = m : PM m ∧ m[LM ] = ’Москва’]
Пример 4.2.2. Найти изделия, которые производятся (в том числе) в Москве
Решение. Q2 = r : PR r ∧ ∃PQ1 q∃PM R mr(r[#R] = mr[#R] ∧ mr[#M ] = q[#M ])
Пример 4.2.3. Найти изделия, которые не производятся в Москве.
Решение. Q3 = r : PR r ∧ ¬PQ2 r
Отметим, что здесь PR r ∧ ¬PQ2 r – это собственная ранжирующая формула по r. Это (простое)
Alpha-выражение имеет вид t : U , т.е. в 4.1.2 n = 1, а компонента V отсутствует.
Пример 4.2.4. Найти изделия, которые производятся только в Москве.
Решение. Q4 = r : PR r∧∃PQ1 q∃PM R mr1 (r[#R] = mr1 [#R]∧mr1 [#M ] = q[#M ])∧¬∃PM m∃PM R mr2 (r[#R] =
mr2 [#R] ∧ mr2 [#M ] = m[#M ] ∧ m[LM ] ̸= ’Москва’)
Пример 4.2.5. В каких городах производятся все синие изделия?
Решение. Q5 = M [LM ] : PM m ∧ ∀PR r(r[C] = ’Синий’ ⇒ ∃PM R mr(mr[#M ] = m[#M ] ∧ mr[#R] =
r[#R]))
Пример 4.2.6. У каких дистрибьюторов в Токио можно купить изделия, которые производятся у всех
производителей из Москвы, и только у них?
Решение. Как и прежде, исходим из предположения, что необязательно, чтобы дистрибьютор продавал все указанные изделия, достаточно, чтобы лишь некоторые (хотя бы одно). Сначала найдем
изделия, которые производятся всеми производителями из Москвы, и только ими:
Q′6 = r : PQ4 r ∧ ∀PQ1 m∃PM R mr(mr[#M ] = m[#M ] ∧ mr[#R] = r[#R])
А затем соединим информацией о продаже изделий дистрибьютерами:
Q6 = d : PD d ∧ ∃PQ′6 r∃PDR dr(dr[#D] = d[#D] ∧ dr[#R] = r[#R])
4.3 Сведе́ние Alpha-выражений к выражениям реляционной алгебры
4.4 Расширения оригинального исчисления. Исчисление Дейта
4.5 Задачи и упражнения
Задача 4.5.1. Найти всевозможные пары производителей, у которых производимый ассортимент в
точности одинаковый (т.е. найти пары (m1 , m2 ) производителей, у которых множества производимых деталей одинаковы).
Задача 4.5.2. У каких производителей весь ассортимент их продукции продается в том же городе, в
котором расположен сам производитель?
Задача 4.5.3. У каких производителей весь ассортимент их продукции, полностью, продается всеми
дистрибьюторами из того же города, в котором расположен сам производитель?
Глава 5
Современные проблемы в области баз
данных
5.1
Поддрежка аспектов ООП
5.2
Иерархические и сетевые модели
5.3
Декларативные языки запросов
5.4
25
26
ГЛАВА 5. СОВРЕМЕННЫЕ ПРОБЛЕМЫ В ОБЛАСТИ БАЗ ДАННЫХ
Download