Теперь, когда мы выяснили значения основных
металингвистических символов, использующихся при записи оператора
создания базового отношения на псевдокоде, мы можем перейти собственно к
рассмотрению самого этого оператора. Как можно было понять по
упоминаниям выше, оператор создания базового отношения в записи на
псевдокоде включает в себя объявления базовых и виртуальных атрибутов,
первичного, кандидатных и внешних ключей. Кроме того, как будет показано
и разъяснено выше, этот оператор охватывает также ограничения значений
атрибутов и ограничения кортежей, а еще так называемые ограничения
ссылочной целостности.
Первые два ограничения, а именно ограничение значения
атрибута и ограничение кортежа, объявляются после специального
зарезервированного слова check.
Ограничения ссылочной целостности могут быть двух видов: on update, что означает «при обновлении», и on delete,
что означает «при удалении». Что это значит? Это значит, что при
обновлении или при удалении атрибутов отношений, на которые ссылается
внешний ключ, необходимо поддерживать целостность по состоянию.
(Подробнее об этом мы поговорим позднее.)
Сам оператор создания базового отношения используется нами уже изученный – оператор Create, только для создания именно базового отношения добавляется ключевое слово table
(«отношение»). И, разумеется, так как отношение само по себе больше и
включает в себя все рассмотренные ранее конструкции, а также новые
дополнительные конструкции, оператор создания получится довольно
внушительного вида.
Итак, запишем на псевдокоде общий вид оператора, используемого для создания базовых отношений:
Create table имя базового отношения
{имя базового атрибута
тип значений базового атрибута
check (ограничение значения атрибута)
{Null | not Null}
default (значение по умолчанию)
},..
[имя виртуального атрибута
as (формула вычисления)
],..
[,check (ограничение кортежа)]
[,primary key (имя атрибута,..)]
[,candidate key (имя атрибута,..)]…
[,foreign key (имя атрибута,..) references имя ссылочного отношения (имя атрибута,..)
on update {Restrict | Cascade | Set Null}
on delete {Restrict | Cascade | Set Null}
]…
Итак, мы видим, что базовых и виртуальных
атрибутов, кандидатных и внешних ключей может быть объявлено несколько,
так как после соответствующих синтаксических конструкций стоит
металингвистический символ «,..». После объявления первичного ключа
этого символа нет, потому что базовые отношения, как уже было сказано
ранее, допускают наличие только одного первичного ключа.
Далее рассмотрим подробнее механизм объявления базовых атрибутов.
При описании в операторе создания базового отношения
любого атрибута в общем случае задаются его имя, тип, ограничения его
значений, флажок допустимости Null-значений и значения по умолчанию.
Нетрудно понять, что тип атрибута и ограничения его значений определяют
его домен, т. е. буквально множество допустимых значений данного
конкретного атрибута. Ограничение значений атрибута записывается как условие, зависящее от имени атрибута. Вот небольшой пример для облегчения понимания этого материала:
Create table имя базового отношения
Курс
integer
check (1 <= Курс and Курс <= 5;
Здесь условие «1 <= Курс and Курс <=
5» вместе с определением целого типа данных действительно полностью
обусловливают множество допустимых значений атрибута, т. е. буквально
его домен.
Флажок допустимости Null-значений (Null | not Null)
запрещает (not Null) или, наоборот, разрешает (Null) появление
Null-значений среди значений атрибутов.
Если взять рассмотренный только что пример, то механизм
применения флажков допустимости Null-значений выглядит следующим
образом:
Create table имя базового отношения
Курс
integer
check (1 <= Курс and Курс <= 5);
Not Null;
Итак, порядковый номер курса студента
никогда не может принимать Null-значения, не может быть неизвестным
составителям базы данных и не может не существовать.
Значения по умолчанию (default (значение по умолчанию)) используются при вставке кортежа в отношения, если в операторе вставки значения атрибутов явно не заданы.
Интересно заметить, что значения по умолчанию могут быть
и Null-значениями, если только Null-значения для данного конкретного
атрибута объявлены допустимыми.
Теперь рассмотрим определение виртуального атрибута в операторе создания базового отношения.
Как мы уже говорили ранее, задание виртуального атрибута
заключается в задании формул его вычисления через другие базовые
атрибуты. Рассмотрим пример объявления виртуального атрибута «Стоимость
Руб.» в виде формулы, зависящей от базовых атрибутов «Вес Кг» и «Цена
Руб. за Кг».
Create table имя базового отношения
Вес Кг
тип значений базового атрибута Вес Кг
check (ограничение значения атрибута Вес Кг)
not Null
default (значение по умолчанию)
Цена Руб. за Кг
тип значений базового атрибута Цена Руб. за Кг
check (ограничение значения атрибута Цена Руб. за Кг)
not Null
default (значение по умолчанию)
…
Стоимость Руб.
as (Вес Кг * Цена Руб. за Кг)
Чуть выше мы рассмотрели ограничения
атрибутов, которые записывались как условия, зависящие от имен
атрибутов. Теперь рассмотрим второй вид ограничений, объявляемых при
создании базового отношения, а именно ограничения кортежа.
Что такое ограничение кортежа, чем оно отличается от
ограничения атрибута? Ограничение кортежа тоже записывается как условие,
зависящее от имени базового атрибута, но только в случае ограничения
кортежа, условие может зависеть от нескольких имен атрибутов
одновременно.
Рассмотрим пример, иллюстрирующий механизм работы с ограничениями кортежей:
Create table имя базового отношения
min Вес Кг
тип значений базового атрибута min Вес Кг
check (ограничение значения атрибута min Вес Кг)
not Null
default (значение по умолчанию)
max Вес Кг
тип значений базового атрибута max Вес Кг
check (ограничение значения атрибута max Вес Кг)
not Null
default (значение по умолчанию)
check (0 < min Вес Кг and min Вес Кг < max Вес Кг);
Таким образом, применение ограничения к кортежу сводится к подстановке значений кортежа вместо имен атрибутов.
Продвигаемся далее в рассмотрении оператора создания
базового отношения. После объявления базовых и виртуальных атрибутов
могут быть объявлены, а могут и не объявляться ключи: первичный, кандидатные и внешние.
Как мы уже говорили ранее, подсхема базового отношения,
которой в другом (или в том же самом) базовом отношении соответствует
первичный или кандидатный ключ в контексте первого отношения называется внешним ключом. Внешние ключи представляют механизм ссылок
кортежей одних отношений на кортежи других отношений, т. е. есть
объявления внешних ключей связаны с навязыванием уже упоминавшихся так
называемых ограничений ссылочной целостности. (Этим ограничением
будет посвящена вся следующая лекция, поскольку целостность по состоянию
(т. е. целостность, обеспечиваемая ограничениями целостности) – это
крайне важное условие успешного функционирования базового отношения и
всей базы данных.)
Объявление первичных и кандидатных ключей, в свою
очередь, навязывает схеме базового отношения соответствующие ограничения
уникальности, о который мы уже говорили ранее.
И, наконец, следует сказать о возможности удаления
базового отношения. Нередко в практике проектирования баз данных
необходимо удалить старой ненужное отношение, чтобы не загромождать
программный код. Сделать это можно с помощью уже знакомого нам оператора
Drop. В полном общем виде оператор удаления базового отношения выглядит следующим образом:
Drop table имя базового отношения;
|