Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Базы данных проектирование и реализация. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
Поскольку с помощью этого правила определяются функциональные за­висимости, которые всегда справедливы, они являются тривиальными и обычно не представляют интереса.
Правило 2 (присоединение) указывает, что добавление одного и того же множества атрибутов и к левой, и к правой части зависимости при­водит к получению еще одной действительной зависимости.
Правила 3 и 4 (транзитивность
и псевдотранзитивность) указывают,
что функциональные зависимости транзитивны.
Правило 5 (объединение) указывает, что в процессе проектирования может быть выполнена операция, при которой ряд зависимостей X
Z объединяется в одну функциональную зависимость X  YZ.
X
Y,
Правило 6 (декомпозиция) определяет, что можно удалять атрибуты из правой части зависимости. Повторное применение этого правила поз-
воляет разложить функциональную зависимость X
циональных зависимостей X
Y, XZ.
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 ? ZY.
6. Псевдотранзитивность: если X ? Y и YW ? Z, то XW ?
? Z YW.
7. Дополнение: если Х ? Y и Z = RXY, то X ? Z.
Система аксиом вывода 1–7 для многозначных зависимостей явля­ется полной [10].
Существуют и совместные правила вывода, объединяющие функци­ональные и многозначные зависимости.
1. Копирование: если X
Y, то X ? Y (функциональная зависи-
мость является и многозначной).
2.
Объединение: если X ? Y и Z ? W, где W Y и YZ = φ, то 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]