|
||||
|
Лекция № 8. Создание базовых отношенийПредметом этой лекции будет довольно подробное рассмотрение оператора создания базового отношения. Мы подвергнуть разбору сам оператор в записи на псевдокоде, проанализируем все его составляющие и их работу, разберем способы модификации, т. е. изменения базовых отношений. 1. Металингвистические символыПри описании синтаксических конструкций, использующихся в записи оператора создания базового отношения на псевдокоде, применяются различные металингвистические символы. Это всевозможные открывающие и закрывающие скобки, разнообразные сочетания точек и запятых, словом, символы, несущие каждый свой смысл и облегчающие программисту задачу написания кода. Введем в рассмотрение и поясним смысл основных металингвистических символов, наиболее часто использующихся при проектировании базовых отношений. Итак: 1) металингвистический символ «{}». Синтаксические конструкции в фигурных скобках представляют собой обязательные синтаксические единицы. При задании базового отношения, обязательными элементами являются, например, базовые атрибуты; без объявления базовых атрибутов ни одно отношение не может быть спроектировано. Поэтому при записи оператора создания базового отношения на псевдокоде базовые атрибуты перечисляются в фигурных скобках; 2) металингвистический символ «[]». В этом случае все наоборот: синтаксические конструкции в квадратных скобках представляют собой необязательные синтаксические элементы. Необязательными синтаксическими единицами в операторе создания базового отношения, в свою очередь, являются виртуальные атрибуты и первичный, и кандидатный, и внешний ключи. Здесь, разумеется, тоже присутствуют свои тонкости, но о них мы поговорим позднее, когда перейдем непосредственно к проектированию оператора создания базового отношения; 3) металингвистический символ «|». Этот символ буквально означает «либо», как аналогичный символ в математике. Применение этого металингвистического символа означает, что необходимо выбрать между двумя или более конструкциями, разделенными, соответственно этим символом; 4) металингвистический символ «…». Многоточие, поставленное непосредственно после каких-либо синтаксических единиц, означает возможность повторения этих предшествующих металингвистическому символу синтаксических элементов; 5) металингвистический символ «,..». Этот символ означает почти тоже самое, что и предыдущий. Только в случае применения металингвистического символа «,..», повторение синтаксических конструкций происходит через запятую, что зачастую гораздо более удобно. С учетом этого, можно говорить об эквивалентности следующих двух синтаксических конструкций:
и
2. Пример создания базового отношения в записи на псевдокодеТеперь, когда мы выяснили значения основных металингвистических символов, использующихся при записи оператора создания базового отношения на псевдокоде, мы можем перейти собственно к рассмотрению самого этого оператора. Как можно было понять по упоминаниям выше, оператор создания базового отношения в записи на псевдокоде включает в себя объявления базовых и виртуальных атрибутов, первичного, кандидатных и внешних ключей. Кроме того, как будет показано и разъяснено выше, этот оператор охватывает также ограничения значений атрибутов и ограничения кортежей, а еще так называемые ограничения ссылочной целостности. Первые два ограничения, а именно ограничение значения атрибута и ограничение кортежа, объявляются после специального зарезервированного слова check. Ограничения ссылочной целостности могут быть двух видов: on update, что означает «при обновлении», и on delete, что означает «при удалении». Что это значит? Это значит, что при обновлении или при удалении атрибутов отношений, на которые ссылается внешний ключ, необходимо поддерживать целостность по состоянию. (Подробнее об этом мы поговорим позднее.) Сам оператор создания базового отношения используется нами уже изученный – оператор Create, только для создания именно базового отношения добавляется ключевое слово table («отношение»). И, разумеется, так как отношение само по себе больше и включает в себя все рассмотренные ранее конструкции, а также новые дополнительные конструкции, оператор создания получится довольно внушительного вида. Итак, запишем на псевдокоде общий вид оператора, используемого для создания базовых отношений:
Итак, мы видим, что базовых и виртуальных атрибутов, кандидатных и внешних ключей может быть объявлено несколько, так как после соответствующих синтаксических конструкций стоит металингвистический символ «,..». После объявления первичного ключа этого символа нет, потому что базовые отношения, как уже было сказано ранее, допускают наличие только одного первичного ключа. Далее рассмотрим подробнее механизм объявления базовых атрибутов. При описании в операторе создания базового отношения любого атрибута в общем случае задаются его имя, тип, ограничения его значений, флажок допустимости Null-значений и значения по умолчанию. Нетрудно понять, что тип атрибута и ограничения его значений определяют его домен, т. е. буквально множество допустимых значений данного конкретного атрибута. Ограничение значений атрибута записывается как условие, зависящее от имени атрибута. Вот небольшой пример для облегчения понимания этого материала:
Здесь условие «1 <= Курс and Курс <= 5» вместе с определением целого типа данных действительно полностью обусловливают множество допустимых значений атрибута, т. е. буквально его домен. Флажок допустимости Null-значений (Null | not Null) запрещает (not Null) или, наоборот, разрешает (Null) появление Null-значений среди значений атрибутов. Если взять рассмотренный только что пример, то механизм применения флажков допустимости Null-значений выглядит следующим образом:
Итак, порядковый номер курса студента никогда не может принимать Null-значения, не может быть неизвестным составителям базы данных и не может не существовать. Значения по умолчанию (default (значение по умолчанию)) используются при вставке кортежа в отношения, если в операторе вставки значения атрибутов явно не заданы. Интересно заметить, что значения по умолчанию могут быть и Null-значениями, если только Null-значения для данного конкретного атрибута объявлены допустимыми. Теперь рассмотрим определение виртуального атрибута в операторе создания базового отношения. Как мы уже говорили ранее, задание виртуального атрибута заключается в задании формул его вычисления через другие базовые атрибуты. Рассмотрим пример объявления виртуального атрибута «Стоимость Руб.» в виде формулы, зависящей от базовых атрибутов «Вес Кг» и «Цена Руб. за Кг».
Чуть выше мы рассмотрели ограничения атрибутов, которые записывались как условия, зависящие от имен атрибутов. Теперь рассмотрим второй вид ограничений, объявляемых при создании базового отношения, а именно ограничения кортежа. Что такое ограничение кортежа, чем оно отличается от ограничения атрибута? Ограничение кортежа тоже записывается как условие, зависящее от имени базового атрибута, но только в случае ограничения кортежа, условие может зависеть от нескольких имен атрибутов одновременно. Рассмотрим пример, иллюстрирующий механизм работы с ограничениями кортежей:
Таким образом, применение ограничения к кортежу сводится к подстановке значений кортежа вместо имен атрибутов. Продвигаемся далее в рассмотрении оператора создания базового отношения. После объявления базовых и виртуальных атрибутов могут быть объявлены, а могут и не объявляться ключи: первичный, кандидатные и внешние. Как мы уже говорили ранее, подсхема базового отношения, которой в другом (или в том же самом) базовом отношении соответствует первичный или кандидатный ключ в контексте первого отношения называется внешним ключом. Внешние ключи представляют механизм ссылок кортежей одних отношений на кортежи других отношений, т. е. есть объявления внешних ключей связаны с навязыванием уже упоминавшихся так называемых ограничений ссылочной целостности. (Этим ограничением будет посвящена вся следующая лекция, поскольку целостность по состоянию (т. е. целостность, обеспечиваемая ограничениями целостности) – это крайне важное условие успешного функционирования базового отношения и всей базы данных.) Объявление первичных и кандидатных ключей, в свою очередь, навязывает схеме базового отношения соответствующие ограничения уникальности, о который мы уже говорили ранее. И, наконец, следует сказать о возможности удаления базового отношения. Нередко в практике проектирования баз данных необходимо удалить старой ненужное отношение, чтобы не загромождать программный код. Сделать это можно с помощью уже знакомого нам оператора Drop. В полном общем виде оператор удаления базового отношения выглядит следующим образом:
3. Ограничение целостности по состояниюОграничение целостности реляционного объекта данных по состоянию – это так называемый инвариант данных. При этом целостность следует уверенно отличать от безопасности, которая, в свою очередь, подразумевает защиту данных от несанкционированного доступа к ним с целью раскрытия, изменения или разрушения данных. В общем случае ограничения целостности реляционных объектов данных классифицируются по уровням иерархии этих самых реляционных объектов данных (иерархия реляционных объектов данных – это последовательность вложенных друг в друга понятий: «атрибут – кортеж – отношение – база данных»). Что это означает? Это означает, что ограничения целостности зависят: 1) на уровне атрибута – от значений атрибута; 2) на уровне кортежа – от значений кортежа, т. е. от значений нескольких атрибутов; 3) на уровне отношений – от отношения, т. е. от нескольких кортежей; 4) на уровне базы данных – от нескольких отношений. Итак, теперь нам остается только рассмотреть более подробно ограничения целостности по состоянию каждого из приведенных понятий. Но прежде дадим понятия процедурной и декларативной поддержки ограничений целостности по состоянию. Итак, поддержка ограничений целостности может быть двух видов: 1) процедурной, т. е. созданной при помощи написания программного кода; 2) декларативной, т. е. созданной путем объявлений тех или иных ограничений для каждого из названных выше вложенных понятий. Декларативная поддержка ограничений целостности реализуется в контексте оператора Create создания базового отношения. Поговорим об этом подробнее. Начнем рассмотрение совокупности ограничений снизу нашей иерархической лестницы реляционных объектов данных, т. е. с понятия атрибута. Ограничение уровня атрибута включает в себя: 1) ограничения типа значений атрибута. Например, условие целочисленности значений, т. е. условие integer для атрибута «Курс» из одного из рассмотренного ранее базового отношения; 2) ограничение значений атрибута, записываемое как условие, зависящее от имени атрибута. Например, анализируя то же самое базовое отношение, что и в пре дыдущем пункте, видим, что в том отношении имеется и ограничение значений атрибута с использованием опции check, т. е.:
3) ограничение уровня атрибутов включает в себя ограничения Null-значений, определяемые уже знакомым нам флажком допустимости (Null) или, наоборот, недопустимости (not Null) Null-значений. Как мы уже упоминали ранее, первые два ограничения определяют ограничение домена атрибута, т. е. значение его множества определения. Далее согласно иерархической лестнице реляционных объектов данных, нужно говорить о кортежах. Итак, ограничение уровня кортежа сводится к ограничению кортежа и записывается как условие, зависящее от имен нескольких базовых атрибутов схемы отношения, т. е., это ограничение целостности по состоянию значительно меньше и проще аналогичного, только соответствующего атрибуту. И снова целесообразно будет вспомнить пройденный нами ранее пример базового отношения, имеющего необходимое нам сейчас ограничение кортежа, а именно:
И, наконец, последнее значимое в контексте ограничения целостности по состоянию понятие – это понятие уровня отношений. Как мы уже говорили раньше, ограничение уровня отношения включает в себя ограничение значений первичного (primary key) и кандидатного (candidate key) ключей. Любопытно, что ограничения, накладываемые на базы данных, относятся уже не к ограничениям целостности по состоянию, а к ограничениям ссылочной целостности. 4. Ограничения ссылочной целостностиИтак, ограничение уровня баз данных включает ограничение ссылочной целостности внешних ключей (foreign key). Коротко мы уже упоминали об этом, когда говорили об ограничениях ссылочной целостности при создании базового отношения и внешних ключах. Теперь настало время поговорить об этом понятии более подробно. Как мы уже говорили раньше, внешний ключ объявляемого базового отношения ссылается на первичный или кандидатный ключ какого-то другого (чаще всего) базового отношения. Напомним, что при этом отношение, на которое ссылается внешний ключ, называется ссылочным или родительским, потому что оно как бы «порождает» один атрибут или несколько атрибутов в ссылающемся базовом отношении. А, в свою очередь, отношение, содержащее внешний ключ, называется дочерним, тоже по вполне понятным причинам. В чем же заключается ограничение ссылочной целостности? А заключается оно в том, что каждому значению внешнего ключа дочернего отношения обязательно должно соответствовать значение какого-либо ключа отношения родительского, если только значение внешнего ключа не содержит Null-значений в каких-либо атрибутах. Кортежи дочернего отношения, нарушающие это условие, называются висящими. Действительно, если внешний ключ дочернего отношения ссылается на атрибут, которого на самом деле в родительском отношении нет, то он не ссылается ни на что. Именно таких ситуаций и требуется всячески избегать, это и означает поддерживать ссылочную целостность. Но, зная, что ни одна база данных никогда не допустит создания висящего кортежа, разработчики следят за тем, чтобы изначально висящих кортежей в базе данных не было и все имеющиеся ключи ссылались на вполне реальный атрибут отношения родительского. Но тем не менее бывают ситуации, когда висящие кортежи образуются уже в процессе функционирования базы данных. Что это за ситуации? Известно, что при удалении кортежей из родительского отношения или при обновлении значения ключа кортежа родительского отношения ссылочная целостность может нарушиться, т. е. могут возникнуть висящие кортежи. Для исключения возможности их появления при объявлении значения внешнего ключа задается одно из трех имеющихся правил поддержания ссылочной целостности, применяемых соответственно при обновлении значения ключа в родительском отношении (т. е., как мы уже упоминали раньше, on update) или при удалении кортежа из родительского отношения (on delete). Необходимо отметить, что добавление нового кортежа в родительское отношение не может нарушить ссылочную целостность по вполне понятным причинам. Ведь, если этот кортеж только что добавили в базовое отношение, раньше на него не мог ссылаться ни один атрибут по причине его отсутствия! Итак, что же это за три правила, применяющиеся для поддержания в базах данных ссылочной целостности? Перечислим их. 1. Restrict, или правило ограничения. Если мы при задании нашего базового отношения, при объявлении внешних ключей в ограничении ссылочной целостности применили это правило ее поддержания, то обновление ключа в родительском отношении или удаление кортежа из родительского отношения просто не может быть выполнено в том случае, если на этот кортеж ссылается хотя бы один кортеж дочернего отношения, т. е. операция Restrict банально запрещает производить какие-либо действия, могущие привести к появлению висящих кортежей. Проиллюстрируем применение этого правила следующим примером. Пусть даны два отношения: Родительское отношение Дочернее отношение Мы видим, что кортежи дочернего отношения (2, …) и (2, …) ссылаются на кортеж (…, 2) родительского отношения, а кортеж (3, …) дочернего отношения ссылается на кортеж (…, 3) родительского отношения. Кортеж (100, …) дочернего отношения является висящим, он недопустим. Здесь только кортежи родительского отношения (…, 1) и (…, 4) допускают обновление значений ключа и удаление кортежей, потому что на них не ссылается ни один из внешних ключей дочернего отношения. Составим оператор создания базового отношения, включающего в себя объявление всех вышеназванных ключей:
2. Cascade, или правило каскадной модификации. Если при объявлении внешних ключей в нашем базовом отношении мы использовали правило поддержания ссылочной целостности Cascade, то обновление ключа в родительском отношении или удаление кортежа из родительского отношения вызывает автоматическое обновление или удаление соответствующих ключей и кортежей дочернего отношения. Рассмотрим пример, чтобы лучше понять механизм работы правила каскадной модификации. Пусть даны уже знакомые нам базовые отношения из предыдущего примера: Родительское отношение и Дочернее отношение Допустим, мы в таблице, задающей отношение «Родительское отношение» обновим некоторые кортежи, а именно заменим кортеж (…, 2) на кортеж (…, 20), т. е. получим новое отношение: Родительское отношение И пусть при этом в операторе создания нашего базового отношения «Дочернее отношение» при объявлении внешних ключей мы использовали правило поддержания ссылочной целостности Cascade, т. е. оператор создания наших базовых отношений выглядит следующим образом:
Тогда что же произойдет с отношением дочерним при обновлении родительского отношения указанным выше образом? Оно примет следующий вид: Дочернее отношение Таким образом, действительно, правило Cascade обеспечивает каскадное обновление всех кортежей дочернего отношения в ответ на обновления отношения родительского. 3. Set Null, или правило присвоения Null-значений. Если же мы в операторе создания нашего базового отношения при объявлении внешних ключей применяем правило поддержания ссылочной целостности Set Null, то обновление ключа родительского отношения или удаление кортежа из родительского отношения влечет за собой автоматическое присвоение Null-значений тем атрибутам внешнего ключа дочернего отношения, который Null-значения допускают. Следовательно, правило применимо, если такие атрибуты имеются. Рассмотрим пример, который мы уже использовали ранее. Пусть нам даны два базовых отношения: «Родительское отношение» Дочернее отношение Как можно заметить, атрибуты дочернего отношения допускают Null-значения, следовательно, правило Set Null в данном конкретном случае применимо. Допустим теперь, что из родительского отношения был удален кортеж (…, 1), а кортеж (…, 2) обновлен, как и в предыдущем примере. Таким образом, родительское отношение принимает следующий вид: Родительское отношение Тогда с учетом того, что при объявлении внешних ключей дочернего отношения нами применялось правило поддержания ссылочной целостности Set Null, дочернее отношение примет следующий вид: Дочернее отношение На кортеж (…, 1) не ссылался ни один ключ дочернего отношения, поэтому его удаление не влечет за собой никаких последствий. Сам оператор создания базового отношения с использованием правила Set Null при объявлении внешних ключей отношения выглядит следующим образом:
Итак, мы видим, что наличие трех различных правил поддержания ссылочной целостности обеспечивают то, что во фразах on update и on delete функции могут быть разными. Необходимо помнить и понимать, что вставка кортежей в дочернее отношение или обновление значений ключа дочерних отношений не будут выполнены, если это будет приводить к нарушению ссылочной целостности, т. е. к появлению так называемых висящих кортежей. Удаление же кортежей из дочернего отношения ни при каких условиях не может привести к нарушению ссылочной целостности. Интересно, что дочернее отношение одновременно может выступать и родительским со своими правилами поддержания ссылочной целостности, если внешние ключи других базовых отношений ссылаются на какие-то его атрибуты, как на первичные ключи. Если у программистов возникает желание обеспечить выполнение ссылочной целостности какими-то отличными от приведенных стандартных правил, то процедурная поддержка таких нестандартных правил поддержания ссылочной целостности обеспечивается с помощью так называемых триггеров. К сожалению, подробное рассмотрение этого понятия не сходит в наш курс лекций. 5. Понятие индексовСоздание ключей в базовых отношениях автоматически связано с созданием индексов. Дадим определение понятия индекса. Индекс – это системная структура данных, в которой размещается обязательно упорядоченный перечень значений какого-либо ключа со ссылками на те кортежи отношения, в которых эти значения встречаются. Индексы в системах управления базами данных бывают двух видов: 1) простые. Простой индекс берется для подсхемы схемы базового отношения из одного атрибута; 2) составные. Соответственно составной индекс – это индекс для подсхемы, состоящей из нескольких атрибутов. Но, кроме деления на простые и составные индексы, в системах управления базами данных существует деление индексов на уникальные и неуникальные. Итак: 1) уникальные индексы – это индексы, ссылающиеся не более чем на один атрибут. Уникальные индексы, как правило, соответствуют первичному ключу отношения; 2) неуникальные индексы – это индексы, могущие соответствовать нескольким атрибутам одновременно. Неуникальные ключи, в свою очередь, чаще всего соответствуют внешним ключам отношения. Рассмотрим пример, иллюстрирующий деление индексов на уникальные и неуникальные, т. е. рассмотрим следующие отношения, заданные таблицами: Здесь соответственно Primary key – первичный ключ отношения, Foreign key – внешний ключ. Понятно, что в этих отношениях, индекс атрибута Primary key – уникальный, так как он соответствует первичному ключу, т. е. одному атрибуту, а индекс атрибута Foreign key – неуникальный, ведь он соответствует ключам внешним. И его значение «20» соответствует одновременно первой и третьей строкам таблицы-отношения. Но иногда индексы могут создаваться без отношения к ключам. Это делается в системах управления базами данных для поддержки производительности операций сортировки и поиска. Например, дихотомический поиск значения индекса в кортежах будет реализован в системах управления базами данных за двадцать итераций. Откуда получены эти сведения? Они были получены путем несложных вычислений, т. е. следующим образом:
Создаются индексы в системах управления базами данных при помощи уже известного нам оператора Create, но только с добавлением ключевого слова index. Выглядит такой оператор следующим образом:
Здесь мы видим знакомый нам металингвистический символ «,..», обозначающий возможность повтора аргумента через запятую, т. е. в этом операторе может быть создан индекс, соответствующий нескольким атрибутам. Если требуется объявить уникальный индекс, перед словом index добавляют ключевое слово unique, и тогда весь оператор создания в базовом отношении индекса принимает следующий вид:
Тогда в самом общем виде, если вспомнить правило обозначения необязательных элементов (металингвистический символ []), оператор создания индекса в базовом отношении будет выглядеть следующим образом:
Если требуется удалить из базового отношения уже имеющийся индекс, используют оператор Drop, также уже известный нам:
Почему здесь используется уточненное имя индекса «имя базового отношения. Имя индекса»? В операторе удаления индекса всегда используется его уточненное имя, потому что имя индекса должно быть уникальным в пределах одного отношения, но не больше. 6. Модификация базовых отношенийДля успешной и продуктивной работы с различными базовыми отношениями очень часто разработчикам необходимо каким-либо образом модифицировать это базовые отношения. Какие основные необходимые варианты модификации встречаются чаще всего в практике проектирования баз данных? Перечислим их: 1) вставка кортежей. Очень часто нужно в уже сформированное базовое отношение вставить новые кортежи; 2) обновление значений атрибутов. А необходимость этой модификации в практике программирования встречается еще чаще, чем предыдущая, ведь при поступлении новой информации об аргументах вашей базы данных неминуемо придется какую-то старую информацию обновлять; 3) удаление кортежей. И с примерно равной вероятностью возникает необходимость удалить из базового отношения те кортежи, присутствие которых в вашей базе данных более не требуется в силу новой поступившей информации. Итак, мы обозначили основные моменты модификации базовых отношений. Как же можно достичь каждой из поставленных целей? В системах управления базами данных чаще всего существуют встроенные, базовые операторы модификации отношений. Дадим их описание в записи на псевдокоде: 1) оператор вставки в базовое отношение новых кортежей. Это оператор Insert. Выглядит он следующим образом:
Металингвистический символ «,..», поставленный после имени атрибута и значения атрибута, говорит нам, что этот оператор допускает одновременное добавление нескольких атрибутов в базовое отношение. В этом случае необходимо имена атрибутов и значения атрибутов перечислять через запятую в согласованном порядке. Ключевое слово into в сочетании с общим названием оператора Insert означает «вставить в» и показывает, в какое отношение необходимо вставить указанные в скобках атрибуты. Ключевое слово Values в этом операторе и означает «значения», «величины», которые и присваиваются этим вновь объявленным атрибутам; 2) теперь рассмотрим оператор обновления значений атрибутов в базовом отношении. Этот оператор называется Update, что в переводе с английского и означает буквально «обновить». Дадим полный общий вид этого оператора в записи на псевдокоде и расшифруем ее:
Итак, в первой строчке оператора после ключевого слова Update записывается имя базового отношения, в котором необходимо произвести обновления. Ключевое слово Set переводится с английского «задать», и в этой строчке оператора указываются имена атрибутов, которые необходимо обновить, и соответствующие новые значения атрибутов. В одном операторе можно обновить сразу несколько атрибутов, что следует из применения металингвистического символа «,..». В третьей строке после ключевого слова Where записывается условие, показывающее, какие именно атрибуты данного базового отношения необходимо обновить; 3) оператор Delete, позволяющий удалять какие-либо кортежи из базового отношения. Запишем его полный вид на псевдокоде и разъясним значение всех отдельных синтаксических единиц:
Ключевое слово from в сочетании с названием оператора Delete переводится как «удалить из». И после этих ключевых слов в первой строчке оператора указывается имя базового отношения, из которого необходимо удалить какие-либо кортежи. А во второй строчке оператора после ключевого слова Where («где») указывается условие, по которому отбираются кортежи, более не требующиеся в нашем базовом отношении. |
|
||
Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Другие сайты | Наверх |
||||
|