6) внешний ключ – это ключ, объявленный в базовом отношении, который при этом ссылается на первичный или кандидатный ключ того же самого или какого-то другого базового отношения.
При этом отношение, на которое ссылается внешний ключ, называется ссылочным (или родительским) отношением. А отношение, содержащее внешний ключ, называется дочерним.
В записи на псевдокоде внешний ключ обозначается как foreign key, в скобках непосредственно после этих слов указывается имя атрибута данного отношения, являющегося внешним ключом, а после этого записывается ключевое слово references («ссылается») и указать имя базового отношения и имя атрибута, на который и ссылается данный конкретный внешний ключ.
Также при создании базового отношения для каждого внешнего ключа записывается условие, называемое ограничением ссылочной целостности, но подробно мы будем говорить об этом позднее.
Лекция № 8. Создание базовых отношений
Предметом этой лекции будет довольно подробное рассмотрение оператора создания базового отношения. Мы подвергнуть разбору сам оператор в записи на псевдокоде, проанализируем все его составляющие и их работу, разберем способы модификации, т. е. изменения базовых отношений.
1. Металингвистические символы
При описании синтаксических конструкций, использующихся в записи оператора создания базового отношения на псевдокоде, применяются различные металингвистические символы. Это всевозможные открывающие и закрывающие скобки, разнообразные сочетания точек и запятых, словом, символы, несущие каждый свой смысл и облегчающие программисту задачу написания кода.
Введем в рассмотрение и поясним смысл основных металингвистических символов, наиболее часто использующихся при проектировании базовых отношений. Итак:
1) металингвистический символ «{}». Синтаксические конструкции в фигурных скобках представляют собой обязательные синтаксические единицы. При задании базового отношения, обязательными элементами являются, например, базовые атрибуты; без объявления базовых атрибутов ни одно отношение не может быть спроектировано. Поэтому при записи оператора создания базового отношения на псевдокоде базовые атрибуты перечисляются в фигурных скобках;
2) металингвистический символ «[]». В этом случае все наоборот: синтаксические конструкции в квадратных скобках представляют собой необязательные синтаксические элементы. Необязательными синтаксическими единицами в операторе создания базового отношения, в свою очередь, являются виртуальные атрибуты и первичный, и кандидатный, и внешний ключи. Здесь, разумеется, тоже присутствуют свои тонкости, но о них мы поговорим позднее, когда перейдем непосредственно к проектированию оператора создания базового отношения;
3) металингвистический символ «|». Этот символ буквально означает «либо», как аналогичный символ в математике. Применение этого металингвистического символа означает, что необходимо выбрать между двумя или более конструкциями, разделенными, соответственно этим символом;
4) металингвистический символ «…». Многоточие, поставленное непосредственно после каких-либо синтаксических единиц, означает возможность повторения этих предшествующих металингвистическому символу синтаксических элементов;
5) металингвистический символ «,..». Этот символ означает почти тоже самое, что и предыдущий. Только в случае применения металингвистического символа «,..», повторение синтаксических конструкций происходит через запятую, что зачастую гораздо более удобно.
С учетом этого, можно говорить об эквивалентности следующих двух синтаксических конструкций:
единица [, единица] …
и
единица,.. ;
2. Пример создания базового отношения в записи на псевдокоде
Теперь, когда мы выяснили значения основных металингвистических символов, использующихся при записи оператора создания базового отношения на псевдокоде, мы можем перейти собственно к рассмотрению самого этого оператора. Как можно было понять по упоминаниям выше, оператор создания базового отношения в записи на псевдокоде включает в себя объявления базовых и виртуальных атрибутов, первичного, кандидатных и внешних ключей. Кроме того, как будет показано и разъяснено выше, этот оператор охватывает также ограничения значений атрибутов и ограничения кортежей, а еще так называемые ограничения ссылочной целостности.
Первые два ограничения, а именно ограничение значения атрибута и ограничение кортежа, объявляются после специального зарезервированного слова 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 имя базового отношения;
3. Ограничение целостности по состоянию
Ограничение целостности реляционного объекта данных по состоянию – это так называемый инвариант данных.
При этом целостность следует уверенно отличать от безопасности, которая, в свою очередь, подразумевает защиту данных от несанкционированного доступа к ним с целью раскрытия, изменения или разрушения данных.
В общем случае ограничения целостности реляционных объектов данных классифицируются по уровням иерархии этих самых реляционных объектов данных (иерархия реляционных объектов данных – это последовательность вложенных друг в друга понятий: «атрибут – кортеж – отношение – база данных»).
Что это означает? Это означает, что ограничения целостности зависят:
1) на уровне атрибута – от значений атрибута;
2) на уровне кортежа – от значений кортежа, т. е. от значений нескольких атрибутов;
3) на уровне отношений – от отношения, т. е. от нескольких кортежей;
4) на уровне базы данных – от нескольких отношений.
Итак, теперь нам остается только рассмотреть более подробно ограничения целостности по состоянию каждого из приведенных понятий. Но прежде дадим понятия процедурной и декларативной поддержки ограничений целостности по состоянию.
Итак, поддержка ограничений целостности может быть двух видов:
1) процедурной, т. е. созданной при помощи написания программного кода;
2) декларативной, т. е. созданной путем объявлений тех или иных ограничений для каждого из названных выше вложенных понятий.
Декларативная поддержка ограничений целостности реализуется в контексте оператора Create создания базового отношения. Поговорим об этом подробнее. Начнем рассмотрение совокупности ограничений снизу нашей иерархической лестницы реляционных объектов данных, т. е. с понятия атрибута.
Ограничение уровня атрибута включает в себя:
1) ограничения типа значений атрибута.
Например, условие целочисленности значений, т. е. условие integer для атрибута «Курс» из одного из рассмотренного ранее базового отношения;
2) ограничение значений атрибута, записываемое как условие, зависящее от имени атрибута.
Например, анализируя то же самое базовое отношение, что и в пре дыдущем пункте, видим, что в том отношении имеется и ограничение значений атрибута с использованием опции check, т. е.:
check (1 <= Курс and Курс <= 5);
3) ограничение уровня атрибутов включает в себя ограничения Null-значений, определяемые уже знакомым нам флажком допустимости (Null) или, наоборот, недопустимости (not Null) Null-значений.
Как мы уже упоминали ранее, первые два ограничения определяют ограничение домена атрибута, т. е. значение его множества определения.
Далее согласно иерархической лестнице реляционных объектов данных, нужно говорить о кортежах. Итак, ограничение уровня кортежа сводится к ограничению кортежа и записывается как условие, зависящее от имен нескольких базовых атрибутов схемы отношения, т. е., это ограничение целостности по состоянию значительно меньше и проще аналогичного, только соответствующего атрибуту.
И снова целесообразно будет вспомнить пройденный нами ранее пример базового отношения, имеющего необходимое нам сейчас ограничение кортежа, а именно:
check (0 < min Вес Кг and min Вес Кг < max Вес Кг);
И, наконец, последнее значимое в контексте ограничения целостности по состоянию понятие – это понятие уровня отношений. Как мы уже говорили раньше, ограничение уровня отношения включает в себя ограничение значений первичного (primary key) и кандидатного (candidate key) ключей.