Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Базы данных проектирование и реализация. Учебное пособие
.pdf
Поскольку с помощью этого правила определяются функциональные зависимости, которые всегда справедливы, они являются тривиальными и
обычно не представляют интереса.
Правило 2 (присоединение) указывает, что добавление одного и того
же множества атрибутов и к левой, и к правой части зависимости приводит к получению еще одной действительной зависимости.
Правила 3 и 4 (транзитивность
и псевдотранзитивность) указывают,
что функциональные зависимости транзитивны.
Правило 5 (объединение) указывает, что в процессе проектирования
может быть выполнена операция, при которой ряд зависимостей X
Z объединяется в одну функциональную зависимость X YZ.
X
Y,
Правило 6 (декомпозиция) определяет, что можно удалять атрибуты
из правой части зависимости. Повторное применение этого правила поз-
воляет разложить функциональную зависимость X
циональных зависимостей X
Y, X Z.
YZ на ряд функ-
Правила вывода Армстронга можно обобщить и распространить как
на функциональные, так и на многозначные зависимости.
Пусть R – схема некоторого отношения и X, Y, W, Z R.
1. Рефлексивность: X ? X.
2. Пополнение: если X ? Y, то XZ ? Y.
3. Объединение: если Х ? Υ и Χ ? Ζ, то X ? YZ.
4. Проективность: если Х ? Υ и Χ ? Ζ, то Χ ? Υ Ζ,
X
Y – Z.
?
5. Транзитивность: если X ? Y и Y ? Z, то X ? Z – Y.
6. Псевдотранзитивность: если X ? Y и YW ? Z, то XW ?
? Z – YW.
7. Дополнение: если Х ? Y и Z = R – XY, то X ? Z.
Система аксиом вывода 1–7 для многозначных зависимостей является полной [10].
Существуют и совместные правила вывода, объединяющие функциональные и многозначные зависимости.
1. Копирование: если X
Y, то X ? Y (функциональная зависи-
мость является и многозначной).
2.
Объединение: если X ? Y и Z ? W, где W Y и Y ∩ Z = φ, то X ? W
В совокупности все эти правила являются полными [10].
51

4.5. НОРМАЛИЗАЦИЯ ТАБЛИЦ
Нормализация, или устранение лишних зависимостей между атрибутами одной таблицы, путем декомпозиции выполняется поэтапно:
приведение таблицы к первой нормальной форме (1НФ), т. е.
устранение всех составных атрибутов и повторяющихся групп в записях
(таблицы должны иметь вид рис. 4.1);
приведение ко второй нормальной форме (2НФ), выделение всех
неполных зависимостей в отдельные таблицы;
приведение к третьей нормальной форме (3НФ), выделение всех
транзитивных зависимостей в отдельные таблицы;
приведение к нормальной форме Бойса–Кодда (БКНФ, усиленной
третьей нормальной форме). Отношение находится в БКНФ, если оно
находится в 3НФ и в ней отсутствуют зависимости атрибутов первичного ключа от неключевых атрибутов. Ситуация, когда отношение будет находиться в 3НФ, но не в БКНФ, возникает при условии, что отношение имеет два (или более) возможных ключа, которые являются составными и имеют общий атрибут. На практике такая ситуация
встречается довольно редко, для всех прочих отношений 3НФ и БКНФ эквивалентны. Формально отношение находится в БКНФ, когда каждая нетривиальная и неприводимая слева функциональная зависимость обладает
потенциальным ключом в качестве детерминанта [32];
приведение к четвертой нормальной форме, выделение всех мно-
гозначных зависимостей в отдельные таблицы. Достаточным признаком
четвертой нормальной формы является наличие в таблице не более двух
атрибутов.
Существуют нормальные формы и высшего порядка, имеющие
в большей степени теоретическое значение [32].
4.6. ПОДДЕРЖКА ЦЕЛОСТНОСТИ ДАННЫХ
Целостность данных должна быть обеспечена для поддержки внутреннего логического соответствия данных. В современных распределенных базах данных поддержка целостности обеспечивается как на
уровне клиентского приложения, так и централизованно, когда логика
поддержания целостности хранится в самой базе данных.
Декларативная целостность обеспечивается путем указания в описании данных ограничений целостности и отношений
между таблицами.
Ограничения целостности могут быть представлены как ограничения
52

значений: диапазон, шаблон значений, значение из определенного множества. Отношения между таблицами могут задаваться путем указания
первичных ключей и ключей связи (внешних ключей). СУБД сохраняет
определенные декларативно свойства данных и отношения между таблицами в процессе ввода данных, их обновления и удаления.
Существуют три типа декларативной целостности данных.
Целостность сущности (
таблицы) требует, чтобы все записи в таб-
лице имели уникальный идентификатор – первичный ключ.
Целостность столбцов – ограничения на данные, которые могут
быть занесены в столбец. Эти ограничения могут включать:
тип и формат поля;
диапазон значений;
недопустимость пустого поля;
ссылку на домен (если СУБД поддерживает такой тип объектов);
требование уникальности значений какого-либо поля.
Ссылочная целостность – это связь между таблицами, обеспечиваемая парой первичный – внешний ключ. Таблица с первичным ключом
называется родительской, а таблица с внешним ключом – дочерней. Характеристика обязательности позволяет правильно определить условия
вставки, удаления и обновления связанных записей:
во всех случаях нельзя записать в дочернюю таблицу значение
внешнего ключа, отсутствующее в родительской таблице;
нельзя удалить запись в родительской таблице и изменить значе-
ние первичного ключа, если в дочерней таблице существует связанная
запись. Однако в некоторых случаях устанавливается режим каскадного
удаления или обновления. Этот режим устанавливается, если связь
между родительской и дочерней таблицей является обязательной
(например, клиент – заказ). Необходимость изменения значений первичных ключей
возникает крайне редко, поскольку в качестве первичных
ключей, как правило, используются искусственные атрибуты, диапазон
значений которых позволяет идентифицировать необходимое множество записей.
Процедурная целостность данных обеспечивается с помощью спе-
циальных инструментов – триггеров
3
и хранимых процедур. Триггеры
3
Триггер – одна из разновидностей хранимых процедур. Исполнение триг-
гера происходит при выполнении для таблицы какого-либо оператора языка
манипулирования данными (ЯМД). Триггеры используются для проверки целостности данных, а также для отката транзакций.
53

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

5. ЯЗЫК SQL РЕЛЯЦИОННЫХ СУБД
Язык базы данных – язык с использованием формального синтак-
сиса, предназначенный для определения, создания, организации доступа и поддержки базы данных [14].
Современные СУБД, как правило, поддерживают некоторый язык,
содержащий все необходимые средства для работы с БД, начиная от ее
создания, и обеспечивающий функции СУБД, поддерживаемые на «языковом» уровне.
1.
Создание, модификация и удаление объектов базы данных (таб-
лиц, индексов, представлений и т.п.), включая и саму базу.
2.
Манипулирование данными: пополнение, модификация, удале-
ние, выборка.
3.
Управление доступом к базе данных – управление разрешениями
(правами) на выполнение определенных операций над объектами базы
данных.
4.
Реализация алгоритмов обработки и обеспечения целостности
данных.
Примеры таких языков: PL/SQL для ORACLE, Transact SQL (T-SQL)
для MS SQL Server, PL/pgSQL для PostgreSQL. Все они являются процедурным расширением языка SQL.
Язык SQL (Structured Query Language) – декларативный язык программирования, применяемый для создания, модификации и управления данными в реляционной БД, управляемой соответствующей СУБД,
является стандартным языком наиболее распространенных в настоящее
время реляционных СУБД.
55

5.1. ИСТОРИЯ СОЗДАНИЯ И СТАНДАРТЫ SQL
В начале 1970-х годов в одной из исследовательских лабораторий
компании IBM была разработана экспериментальная реляционная
СУБД IBM System/R, для которой затем был создан специальный язык
SEQUEL, позволявший относительно просто управлять данными в этой
СУБД. Аббревиатура SEQUEL расшифровывалась как Structured
English QUEry Language – «структурированный английский язык запросов». Позже по юридическим соображениям язык SEQUEL был переименован в SQL.
Целью разработки было
создание простого непроцедурного языка,
которым мог воспользоваться любой пользователь, даже не имеющий
навыков программирования..
Первыми СУБД, поддерживающими новый язык, стали в 1979 году
Oracle V2 от компании Relational Software Inc. (впоследствии ставшей
компанией Oracle) и System/38 от IBM, основанная на System/R.
Поскольку к началу 1980-х годов существовало несколько вариантов СУБД от разных производителей, причем каждый из них обладал
собственной
реализацией языка запросов, было принято решение разработать стандарт языка, который будет гарантировать переносимость
программного обеспечения с одной СУБД на другую (при условии, что
они будут поддерживать этот стандарт).
В 1983 году Международная организация по стандартизации (ISO)
и Американский национальный институт стандартов (ANSI) приступили к разработке стандарта языка SQL. После множества консультаций
и
отклонения нескольких предварительных вариантов в 1986 году ANSI
представил свою первую версию стандарта, описанного в документе
ANSI X3.135-1986 под названием «Database Language SQL» (Язык баз
данных SQL).
Со временем к стандарту накопилось несколько замечаний и пожеланий, особенно с точки зрения обеспечения целостности и корректности данных, в результате чего в 1989 году этот стандарт был расширен,
и получил
название SQL89. С этого времени стандарт языка регулярно
обновляется и совершенствуется. Кроме того, подавляющее большинство коммерческих программ, связанных с обработкой баз данных, расширяет возможности SQL за рамки того, что определено ANSI, добавляя полезные новые черты.
История версий стандарта представлена в таблице.
56

Год Название Изменения
1986 SQL-86 Первый вариант стандарта, принятый институтом ANSI
и одобренный ISO в 1987 году
1989 SQL-89 Незначительная редакция, добавляющая ограничения це-
лостности, принята как FIPS 127-1
1992 SQL-92 Значительные изменения, был принят как Основная версия
1999 SQL:1999 Добавлена поддержка регулярных выражений, рекурсив-
ных запросов, поддержка триггеров, поддержка процедур-
ных операторов и операторов управления потоком, неска-
лярные типы данных (массивы) и некоторые объектно-ори-
ентированные возможности (например, структурирован-
ные типы)
2003 SQL:2003 Введены расширения для работы с XML-данными, окон-
ные функции (применяемые для работы с OLAP-базами
данных), генераторы последовательностей и столбцы
с автоматически сгенерированными значениями (включая
столбцы идентификаторов)
2006 SQL:2006 Функциональность работы с XML-данными значительно
расширена:
определяет способы импорта и хранения данных XML
в базе данных SQL, манипулирования ими в базе данных
и публикации как XML, так и обычных данных SQL
в форме XML. Кроме того, он позволяет приложениям ин-
тегрировать запросы в свой код SQL с помощью XQuery,
языка запросов XML, для одновременного доступа к обыч-
ным
данным SQL и XML-документам
2008 SQL:2008 Улучшены возможности оконных функций, устранены не-
которые неоднозначности стандарта SQL:2003
Разрешает определения ORDER BY за пределами курсора.
Добавляет триггеры INSTEAD OF, оператор TRUNCATE,
предложение FETCH.
2011 SQL:2011 Улучшены возможности оконных функций, устранены не-
которые неоднозначности стандарта SQL:2003
Одной из основных новых функций является улучшенная
поддержка временных баз данных
2016 SQL:2016 Улучшены возможности оконных функций, устранены не-
которые неоднозначности стандарта SQL:2003
Добавляет сопоставление шаблонов строк, полиморфные
табличные функции, JSON-функции для создания доку-
ментов JSON, доступа к частям документов JSON и про-
верки наличия в строке допустимых данных JSON.
57

Дальнейшее рассмотрение возможностей SQL основано на стандарте SQL-92, который принят как Основная версия, включающая все
базовые свойства языка [36].
SQL используется, как правило, в информационных системах, имеющих не одного, а многих пользователей, которые могут обладать разными правами на работу с данными. Обычно пользователи являются
владельцами объектов, которые они создали.
5.2. СИНТАКСИС SQL
Набор структурных компонентов языка, их характеристики и правила, определяющие связи между компонентами, представляют собой синтаксис языка. Основными компонентами SQL являются следующие.
1.
Язык определения данных ЯОД (DDL – Data Definition Language).
2.
Язык манипулирования данными ЯМД (DML – Data Manipulation
Language).
3.
Язык управления доступом к данными (DCL – Data Control
Language).
4.
Язык управления транзакциями (TCL – Transaction Control
Language).
DDL – язык определения данных ЯОД включает команды:
1) CREATE – создание объектов базы данных (таблицы, индексы,
представления и т.п., включая саму базу данных);
2) DROP – удаление объектов базы данных;
3) ALTER – изменение объектов базы данных.
Эти команды не затрагивают непосредственно самих данных.
Язык манипулирования данными ЯМД – язык, который нужен для
добавления, удаления, изменения данных и
для выборки их из базы. Эта
группа команд включает:
1) оператор SELECT – выборка данные;
2) оператор INSERT – добавление новых записей;
3) оператор UPDATE – изменение значений полей в существующих
записях;
4) оператор DELETE – удаление записей.
DCL – набор операторов, необходимых для предоставления доступа
к данным пользователям БД. Пользователь (User) – один из объектов
базы данных, создаваемый командой CREATE USER. Поскольку в базе,
58

как правило, имеются конфиденциальные данные, необходимо ограничивать доступ к этим данным с помощью операторов:
GRANT – оператор предоставления пользователю или группе набор
каких-либо разрешений;
REVOKE – оператор отзыва разрешений.
TCL – набор команд, позволяющих управлять транзакциями – груп-
пами команд, которые все должны завершиться успешно. В случае неудачного завершения хотя бы одной команды
из транзакции транзакция
откатывается, восстанавливая состояние базы данных на момент начала
транзакции (отменяются результаты выполнения предыдущих команд):
START TRANSACTION обозначает начало транзакции;
COMMIT TRANSACTION подтверждает выполнение команд
внутри транзакции;
ROLLBACK TRANSACTION отменяет все сделанные внутри тран-
закции изменения ( откатывает транзакцию);
SAVEPOINT создает точку сохранения в пределах транзакции.
Точка сохранения представляет собой место в последовательности команд транзакции, которое может выступать в качестве промежуточной
точки сохранения. Откат текущей транзакции может быть выполнен не
к началу транзакции, а к точке сохранения.
При описании языка SQL принимаются следующие соглашения:
ключевые слова команд будут записываться в верхнем регистре для
их выделения. Также будут использоваться следующие обозначения, не
являющиеся частью синтаксиса SQL:
{} (фигурные скобки) – содержимое скобок рассматривается как еди-
ное целое для остальных символов;
| (вертикальная черта) – разделяет альтернативные элементы;
[] (квадратные скобки) – отмечают не обязательные элементы;
… (три точки) – отмечают многократное повторение предшествую-
щих элементов, разделяемых пробелом;
.,.. (три точки с запятой) – отмечают многократное повторение пред-
шествующих элементов, разделяемых запятой;
<> (угловые скобки) – в этих скобках записываются условные имена
конкретных значений;
_ (подчеркивание) – подчеркиванием отмечаются элементы, опреде-
ляемые по умолчанию.
; (точка с запятой) – завершающий элемент SQL-запросов.
59

5.2.1. ТИПЫ ДАННЫХ В ЯЗЫКЕ SQL
Типы данных, используемые в стандарте SQL92, можно подразделить на следующие группы:
строковые типы;
числовые типы;
типы для представления даты и времени.
К строковым типам относятся
ной и переменной длины
. Данные, хранящиеся в виде символьных
символьные строки фиксирован-
строк фиксированной длины, всегда занимают один и тот же объем памяти, определяемый при объявлении поля, независимо от реального размера строки, занесенной в поле. Объявление строки фиксированной
длины имеет вид
CHARACTER (n),
где n – длина строки, определяющая размер поля, к которому это объявление относится
.
Длина строк переменной длины не является постоянной для всех
данных, а зависит от реального размера строки, хранящейся в поле таблицы базы данных. Объявление строки переменной длины имеет вид
VARCHAR (n),
где n – число, определяющее максимально возможную длину строки.
Числовые типы подразделяются:
на целочисленные типы;
вещественные типы с фиксированной точкой;
вещественные типы с плавающей точкой;
двоичные строки фиксированной и переменной длины.
Стандартом SQL92 устанавливаются два
INTEGER – целое число со знаком, использующее 4 байта. Может
целочисленных типа:
представлять числа в диапазоне от –2 147 483 648 до 2 147 483 647;
SMALLINT – короткое целое число со знаком, использующее
2 байта. Может представлять целые числа в диапазоне от –32 768 до
32 767.
Вещественные типы с фиксированной точкой предназначены для
точного представления дробных чисел. Эти типы, по сути, являются
60
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
