1. Определить все поля (или группы полей), от которых зависят другие поля.
2. Создать новую таблицу для каждого такого поля (или группы полей) и группы зависящих от него полей и переместить их в эту таблицу. Поле (или группа полей), от которого зависят все остальные перемещенные поля, станет при этом первичным ключом новой таблицы.
3. Удалить перемещенные поля из исходной таблицы, оставив лишь те из них, которые станут внешними ключами.
Для приведения таблицы Orderslnfo к третьей нормальной форме создадим новую таблицу Customers и переместим в нее поля CustomerID и Address. Поле Address из исходной таблицы удалим, а поле CustomerID оставим - теперь это внешний ключ (рис. 20):
Orders OrderDetails
CustomersРисунок 20 Приведение таблицы Orderslnfo к третьей нормальной форме
Orders: | ||
OrderID | CustomerID | OrderDate |
10265 | BLONP | 07.25.96 |
10278 | BERGS | 08.12.96 |
10280 | BERGS | 08.14.96 |
10289 | BSBEV | 08.26.96 |
10297 | BLONP | 09.14.96 |
10308 | ANATR | 09.18.96 |
Customers: | |
CustomerID | Address |
ANATR | Avda. De la Constitucion 2222 |
BERGS | Berguvsvagen 8 |
BLONP | 24, place Kleber |
BSBEV | Fauntleroy Circus |
Итак, после приведения исходной таблицы к третьей нормальной форме таблиц стало три - Customers, Orders и OrderDetails. Например, после приведения рассмотренной выше базы данных к третьей нормальной форме налицо следующие улучшения:
• Сведения об адресе клиента можно хранить в базе данных, даже если это только потенциальный клиент, еще не разместивший ни одного заказа.
• Сведения о заказанном продукте можно удалять, не опасаясь удаления данных о клиенте и заказе.
Изменение адреса клиента или даты регистрации заказа теперь требует изменения только одной записи.
Если в отношении, находящемся в третьей нормальной форме, отсутствуют многозначные зависимости, но имеются другие зависимости от ключа, то третья нормальная форма будет иметь аномалии операций. В этом случае рассматривают усиленную третью нормальную форму (форму Бойса-Кодда).
Отношение находится в нормальной форме Бойса-Кодда, если оно находится в третьей нормальной форме и каждый детерминант отношения является возможным ключом отношения. Атрибут (или комбинацию атрибутов), от которого какой-либо другой атрибут зависит функционально (полно), называют детерминантом. Рассмотрим пример. Пусть отношение, которое моделирует сдачу текущей сессии, имеет следующую структуру:
(Номер зачетной книжки, Идентификатор студента, Дисциплина, Дата, Оценка)
Это отношение находится в третьей нормальной форме. Но в данном отношении у нас есть два детерминанта - Номер зачетной книжки и Идентификатор студента. Известно, что каждому студенту ставится в соответствие один номер зачетной книжки и один идентификатор. Для приведения к нормальной форме Бойса-Кодда надо разделить отношение, например на два со следующими схемами:
(Идентификатор студента, Дисциплина, Дата, Оценка)
(Номер зачетной книжки, Идентификатор студента)
Или
(Номер зачетной книжки, Дисциплина, Дата, Оценка)
(Номер зачетной книжки, Идентификатор студента)
Четвертая нормальная форма запрещает хранить независимые компоненты в одной таблице, когда между этими компонентами существуют отношения многие-ко-многим. Можно решить проблему приведения к четвертой нормальной форме, поместив каждый многозначный атрибут в отдельную таблицу вместе с ключом от которого этот атрибут зависит.
Допустим, существует отношение, моделирующее сдачу экзаменов:
(Номер зачетной книжки, Группа, Дисциплина)
Перечень дисциплин, которые должен сдавать студент в сессию зависит не от его Фамилии, а от группы, в которой учится данный студент. Группа зависит от учебного плана, в котором перечислены все дисциплины, изучаемые по данной специальности.
В приведенном выше отношении существуют две многозначные зависимости:
Группа – Дисциплина
Группа – номер зачетки
Группа определяет список студентов, которые в ней учатся. Приведенное выше отношение, для соответствия четвертой нормальной форме декомпозируют на два: (номер зачетной книжки, Группа), (Группа, Дисциплина). Операции модификации теперь упрощаются: добавление нового студента связано с добавлением одного кортежа в первое отношение, а добавление дисциплины связано с добавлением одного кортежа во второе отношение. Кроме того, можем хранить любое количество групп, с определенным перечнем дисциплин , в которые еще не зачислены студенты.
Пятая нормальная форма была предложена для того, чтобы исключить аномалии, связанные с особым типом ограничительных условий, называемых совместимыми зависимостями. Эти зависимости имеют в основном теоретический интерес. Не было предложено правил приведения к пятой нормальной форме. На практике не находит применения.
Нормализация устраняет избыточность данных, что позволяет снизить объем хранимых данных и избавиться от описанных выше аномалий их изменения.
4.3.Как проектируют базы данных
Обычно современные СУБД содержат средства, позволяющие создавать таблицы и ключи. Существуют и утилиты, поставляемые отдельно от СУБД (и даже обслуживающие несколько различных СУБД одновременно), позволяющие создавать таблицы, ключи и связи.
Еще один способ создать таблицы, ключи и связи в базе данных - это написание так называемого DDL-сценария (DDL - Data Definition Language).
Наконец, есть еще один способ, который становится все более и более популярным, - это использование специальных средств, называемых CASE-средствами (CASE означает Computer-Aided System Engineering). Существует несколько типов CASE-средств, но для создания баз данных чаще всего используются инструменты для создания диаграмм “сущность-связь” (entity-relationship diagrams, E/R diagrams). С помощью этих инструментов создается так называемая логическая модель данных, описывающая факты и объекты, подлежащие регистрации в ней (в таких моделях прототипы таблиц называются сущностями (entities), а поля - их атрибутами (attributes). После установления связей между сущностями, определения атрибутов и проведения нормализации создается так называемая физическая модель данных для конкретной СУБД, в которой определяются все таблицы, поля и другие объекты базы данных. После этого можно сгенерировать либо саму базу данных, либо DDL-сценарий для ее создания.
5. ЯЗЫК ФОРМИРОВАНИЯ ЗАПРОСОВ К БАЗЕ ДАНЫХ.
Structured Query Languge (SQL)
Прототип языка SQL был разработан в конце 1970-х годов в компании IBM (SQL) в первом прототипе реляционной СУБД System R. Первый международный стандарт языка был принят в 1989 г. Бурное развитие информационных технологий и СУБД потребовало расширение стандарта. И в 1992, а затем 1999 г. были приняты соответственно второй и третий стандарты языка SQL. Современные перспективные СУБД содержат в своем составе SQL, соответствующий одному из стандартов. SQL/3 является полным языком и содержит не только операторы запросов, но и язык описания, манипулирования данными и операторы, предназначенные для администрирования БД.
Ниже перечислены основные операторы SQL.
Операторы определения данных:
CREATE TABLE - создать таблицу;
DROP TABLE - удалить таблицу;
ALTER TABLE - изменить таблицу;
CREATE VIEW - создать представление;
ALTER VIEW - изменить представление;
DROP VIEW - удалить представление;
CREATE INDEX - создать индекс;
DROP INDEX - удалить индекс
Операторы манипулирования данными.
DELETE - удалить строки;
INSERT - вставить строку;
UPDATE - обновить строку.
Язык запросов
SELECT - выбрать строки.
Средства управления транзакциями.
COMMIT - завершить транзакцию;
ROLLBACK - откатить транзакцию;
SAVEPOINT - сохранить промежуточную точку выполнения транзакции.
Средства администрирования данных.
ALTER DATABASE - изменить БД;
ALTER DBAREA - изменить область хранения БД;
ALTER PASSWORD - изменить пароль;
CREATE DATABASE - создать БД;
CREATE DBAREA - создать область хранения;
DROP DATABASE - удалить БД;
DROP DBAREA - удалить область хранения БД;
GRANT - предоставить права;
REVOKE - лишить прав.
Программный SQL
DECLARE - определить курсор для запроса;
OPEN - открыть курсор;
FETCH - считать строку из множества строк, определенных курсором;
CLOSE - закрыть курсор;
PREPARE - подготовить оператор SQL к динамическому выполнению;
EXECUTE - выполнить оператор SQL, ранее подготовленный к динамическому выполнению.
Необходимо отметить, что в каждой СУБД своя специфика реализации языка. Это, как правило, касается типов данных, способов задания констант, арифметических и логических операций и т.д. Здесь рассмотрим операторы манипулирования данными и оператор SELECT.
Рассмотрим один из наиболее сложных операторов языка – оператор SELECT. Его синтаксис приведен ниже.
SELECT
[ALL | DISTINCT] [<псевдоним>.]<выражение>[AS<колонка>]
[,[<псевдоним>.] <список выбора>[AS<колонка>]...]
FROM <БД>[,[<БД>...]
[WHERE <условие связи>
[AND <условие связи>...]
[AND/OR <условие отбора>
[AND/OR <условие отбора>...]]]
[GPOUP BY <колонка>[,<колонка>...]]
[ORDER BY <колонка>[,<колонка>...]]]
[HAVING <условие отбора>]
Здесь ключевое слово ALL означает, что в результирующую выборку будут включаться все записи, удовлетворяющие запросу. DISTINСT предотвращает повторный вывод одних и тех же записей.
<выражение> может содержать:
- поле базы данных;
- константу; указанное значение константы появится в каждом ряду результата запроса;