46928 (597308), страница 12
Текст из файла (страница 12)
Отношение
находится в нормальной форме Бойса-Кодда (НФБК) тогда и только тогда, когда детерминанты всех функциональных зависимостей являются потенциальными ключами.
Нормализация отношений вплоть до нормальной формы Бойса-Кодда основывалась на понятии функциональной зависимости и теореме Хеза, гарантировавшей, что декомпозиция будет происходить без потерь информации.
Дальнейшая нормализация связана уже с обобщением понятия функциональной зависимости.
Атрибуты (множества атрибутов)
и
многозначно зависят от
, (
), тогда и только тогда, когда из того, что в отношении
содержатся кортежи
и
следует, что в отношении
содержится также и кортеж к
.
Корректность дальнейшей декомпозиции основывается на теореме Фейджина, которая говорит о том, что декомпозиция отношения на две проекции является декомпозицией без потерь тогда и только тогда, когда в отношении имеется некоторая многозначная зависимость.
Если в отношении имеется функциональная зависимость, то автоматически имеется и тривиальная многозначная зависимость, определяемая этой функциональной зависимостью.
Многозначная зависимость
называется нетривиальной многозначной зависимостью, если не существует функциональных зависимостей
и
.
Отношение
находится в четвертой нормальной форме (4НФ) тогда и только тогда, когда отношение находится в НФБК и не содержит нетривиальных многозначных зависимостей.
Имеют место зависимости специального вида, когда отношение не может быть подвергнуто декомпозиции без потерь на две проекции, но может быть декомпозировано на большее число проекций. Такие зависимости называются зависимостями соединения и являются обобщением понятия многозначной зависимости.
Отношение
находится в пятой нормальной форме (5НФ) тогда и только тогда, когда любая имеющаяся зависимость соединения является тривиальной.
Выводы
При разработке базы данных можно выделить несколько уровней моделирования:
-
Сама предметная область
-
Модель предметной области
-
Логическая модель данных
-
Физическая модель данных
-
Собственно база данных и приложения
Ключевые решения, определяющие качество будущей базы данных закладываются на этапе разработки логической модели данных. "Хорошие" модели данных должны удовлетворять определенным критериям:
-
Адекватность базы данных предметной области
-
Легкость разработки и сопровождения базы данных
-
Скорость выполнения операций обновления данных (вставка, обновление, удаление)
-
Скорость выполнения операций выборки данных
Первая нормальная форма (1НФ) - это обычное отношение. Отношение в 1НФ обладает следующими свойствами:
-
В отношении нет одинаковых кортежей.
-
Кортежи не упорядочены.
-
Атрибуты не упорядочены.
-
Все значения атрибутов атомарны.
Отношения, находящиеся в 1НФ являются "плохими" в том смысле, что они не удовлетворяют выбранным критериям - имеется большое количество аномалий обновления, для поддержания целостности базы данных требуется разработка сложных триггеров.
Отношение
находится во второй нормальной форме (2НФ) тогда и только тогда, когда отношение находится в 1НФ и нет неключевых атрибутов, зависящих от части сложного ключа.
Отношения в 2НФ "лучше", чем в 1НФ, но еще недостаточно "хороши" - остается часть аномалий обновления, по-прежнему требуются триггеры, поддерживающие целостность базы данных.
Отношение
находится в третьей нормальной форме (3НФ) тогда и только тогда, когда отношение находится в 2НФ и все неключевые атрибуты взаимно независимы.
Отношения в 3НФ являются самыми "хорошими" с точки зрения выбранных нами критериев - устранены аномалии обновления, требуются только стандартные триггеры для поддержания ссылочной целостности.
Переход от ненормализованных отношений к отношениям в 3НФ может быть выполнен при помощи алгоритма нормализации. Алгоритм нормализации заключается в последовательной декомпозиции отношений для устранения функциональных зависимостей атрибутов от части сложного ключа (приведение к 2НФ) и устранения функциональных зависимостей неключевых атрибутов друг от друга (приведение к 3НФ).
Корректность процедуры нормализации (декомпозиция без потери информации) доказывается теоремой Хеза.
Операторы SQL
Основу языка SQL составляют операторы, условно разбитые не несколько групп по выполняемым функциям.
Можно выделить следующие группы операторов (перечислены не все операторы SQL):
Операторы определения объектов базы данных
-
CREATE SCHEMA - создать схему базы данных
-
DROP SHEMA - удалить схему базы данных
-
CREATE TABLE - создать таблицу
-
ALTER TABLE - изменить таблицу
-
DROP TABLE - удалить таблицу
-
CREATE DOMAIN - создать домен
-
ALTER DOMAIN - изменить домен
-
DROP DOMAIN - удалить домен
-
CREATE COLLATION - создать последовательность
-
DROP COLLATION - удалить последовательность
-
CREATE VIEW - создать представление
-
DROP VIEW - удалить представление
Операторы манипулирования данными
-
SELECT - отобрать строки из таблиц
-
INSERT - добавить строки в таблицу
-
UPDATE - изменить строки в таблице
-
DELETE - удалить строки в таблице
-
COMMIT - зафиксировать внесенные изменения
-
ROLLBACK - откатить внесенные изменения
Наиболее важными для пользователя являются операторы манипулирования данными (DML).
INSERT - вставка строк в таблицу
Пример 1. Вставка одной строки в таблицу Р (поля PNUM и PNAME):
INSERT INTO
P (PNUM, PNAME)
VALUES (4, "Иванов");
Пример 2. Вставка в таблицу нескольких строк, выбранных из другой таблицы (в таблицу TMP_TABLE вставляются данные о поставщиках из таблицы P, имеющие номера, большие 2):
INSERT INTO
TMP_TABLE (PNUM, PNAME)
SELECT PNUM, PNAME
FROM P
WHERE P.PNUM>2;
UPDATE - обновление строк в таблице
Пример 3. Обновление нескольких строк в таблице Р (присвоить значение Пушников полю PNAME в записях, в которых в поле PNUM стоит значение 1):
UPDATE P
SET PNAME = "Пушников"
WHERE P.PNUM = 1;
DELETE - удаление строк в таблице
Пример 4. Удаление нескольких строк в таблице:
DELETE FROM P
WHERE P.PNUM = 1;
Пример 5. Удаление всех строк в таблице:
DELETE FROM P;
Оператор SELECT
Оператор SELECT является фактически самым важным для пользователя и самым сложным оператором SQL. Он предназначен для выборки данных из таблиц, т.е. он, собственно, и реализует одно их основных назначение базы данных - предоставлять информацию пользователю.
Оператор SELECT всегда выполняется над некоторыми таблицами, входящими в базу данных.
Замечание. На самом деле в базах данных могут быть не только постоянно хранимые таблицы, а также временные таблицы и так называемые представления. Представления - это просто хранящиеся в базе данные SELECT-выражения. С точки зрения пользователей представления - это таблица, которая не хранится постоянно в базе данных, а "возникает" в момент обращения к ней. С точки зрения оператора SELECT и постоянно хранимые таблицы, и временные таблицы и представления выглядят совершенно одинаково. Конечно, при реальном выполнении оператора SELECT системой учитываются различия между хранимыми таблицами и представлениями, но эти различия скрыты от пользователя.
Результатом выполнения оператора SELECT всегда является таблица. Таким образом, по результатам действий оператор SELECT похож на операторы реляционной алгебры. Любой оператор реляционной алгебры может быть выражен подходящим образом сформулированным оператором SELECT. Сложность оператора SELECT определяется тем, что он содержит в себе все возможности реляционной алгебры, а также дополнительные возможности, которых в реляционной алгебре нет.
Отбор данных из одной таблицы
Пример 6. Выбрать все данные (ставим *) из таблицы Р (ключевые слова SELECT… FROM…):
SELECT *
FROM P;
Замечание. В результате получим новую таблицу, содержащую полную копию данных из исходной таблицы P.
Пример 7. Выбрать все строки (ставим *) из таблицы Р, удовлетворяющих некоторому условию (ключевое слово WHERE…) (где в поле PNUM стоит значение, большее 2):
SELECT *
FROM P
WHERE P.PNUM > 2;
Замечание. В качестве условия в разделе WHERE можно использовать сложные логические выражения, использующие поля таблиц, константы, сравнения (>, <, = и т.д.), скобки, союзы AND (и) и OR(или), отрицание NOT (не).
Пример 8. Выбрать значения некоторого поля (например, все значения (*) поля NAME) из исходной таблицы Р (указание списка отбираемых колонок):
SELECT P.NAME
FROM P;
Замечание. В результате получим таблицу с одной колонкой, содержащую все наименования поставщиков.
Замечание. Если в исходной таблице присутствовало несколько поставщиков с разными номерами, но одинаковыми наименованиями, то в результатирующей таблице будут строки с повторениями - дубликаты строк автоматически не отбрасываются.
Пример 9. Выбрать некоторые колонки из исходной таблицы, удалив из результата повторяющиеся строки (ключевое слово DISTINCT):
SELECT DISTINCT P.NAME
FROM P;
Замечание. Использование ключевого слова DISTINCT приводит к тому, что в результатирующей таблице будут удалены все повторяющиеся строки.
Пример 10. Использование скалярных выражений и переименований колонок в запросах (ключевое слово AS…):
SELECT
TOVAR.PRICE,
"=" AS EQU,
TOVAR.KOL*TOVAR.PRICE AS SUMMA
FROM TOVAR;
В результате получим таблицу с колонками, которых не было в исходной таблице TOVAR:
| TNAME | KOL | PRICE | EQU | SUMMA |
| Болт | 10 | 100 | = | 1000 |
| Гайка | 20 | 200 | = | 4000 |
| Винт | 30 | 300 | = | 9000 |
Пример 11.Упорядочение результатов запроса (ключевое слово ORDER BY…):
SELECT















