Введение в системы БД (542480), страница 73
Текст из файла (страница 73)
305 Глава 8. Целостность Донных СОМБТВА1МТ РС4 18 ЕИРТ1 ( Р ИНЕВЕ СОЬОВ = СОЬОВ ( 'Вег)' ) ) АМО С1тХ н 'Ьолдоп' ) ) Смысл: "Красные детали должны храниться в Лондоне". СОМЯТВА1МТ ЯСК солт(я) =солт(я(я()) ); Смысл: "Номера поставщиков должны быть уникальны*' или, более формально, "Ключ (Б() — это потенциальный ключ отношения поставщиков" (раздел 8.8). СОМБТВА1МТ РС7 1Р ИОТ ( 18 ЕИРТ1 ( Р ) ) ТНЕИ СОПИТ ( Р ИНЕВЕ СОЬОВ = СОЬОВ ( 'Веб' ) ) > 0 ЕИО 1Г Смысл: "Если летали вообще имеются, то одна из них должна быть красной".
Отметим, кстати, что этот пример отличается от всех рассмотренных ранее, поскольку данное ограничение может быть нарушено и при выполнении операции ОЕЬЕТЕ. Ограничения переменных-отношений всегда проверяются немедленно (фактически как часть процедуры выполнения любого оператора, способного нарушить данное ограничение). Таким образом, любой оператор, в котором предпринимается попытка присвоить данной переменной-отношению значение, нарушающее одно из установленных для нее ограничений, будет просто отвергнут.
8.5. Ограничения баз данных Ограничение базы данных — это ограничение, устанавливающее взаимосвязь между различными переменными-отношениями. Приведем несколько примеров. СОИБТВА1ИТ ОВС1 18 ЕИРТ1 ( ( Я 101М БР ) ИНЕВЕ ЯТАТОЯ < 20 АМО От? > Отт ( 500 ) ) Смысл: "Поставщики со статусом, меньшим 20, не могут поставлять детали в количестве свыше 500 штук". Упражнение. Какие операции должны отслеживаться СУБД для приведения ограниченна ОВС1 в действие? СОМБТВА1МТ ОВС2 ЯР ( Я( ) Б Я ( Я() ) Смысл; "Каждый номер поставщика в переменной-отношении поставок должен присутствовать н в переменной-отношении поставщиков".
(Напомним, что, как указывалось в главе 6, знак "<" здесь означает "полмножество".) Поскольку атрибут Б( в переменной- отношении Я составляет потенциальный ключ, по сути, это ограничение является ссылочным ограничением для поставок в отношении поставщиков (т.е.
ключ (Я() в переменной-отношении БР является внешним ключом, посредством которого сведения о поставках связываются с соответствующими поставщиками). Обсуждение этого вопроса будет продолжено в разделе 8.8. СОМЯТВА1МТ ОВСЗ ЯР ( Р$ ) = Р ( Р0 ) 306 Часть 11 Реляционная модель Смысл: "Кажлая деталь должна быть поставлена хотя бы один раз".
Замечание. Конечно, возможен случай, когда каждая поставка включает точно одну деталь, как следствие того факта, что ключ (Р)) в переменной-отношении Р является потенциальным ключом лля деталей и существует ссылочное ограничение в отношении поставок и деталей. Однако мы не будем приводить это ограничение здесь, а обсуждение данного вопроса продолжим, опять же, в разделе 8.8.
Последние два примера показывают, что (в общем случае) проверка ограничений базы данных не может быть выполнена немедленно, а должна быть отложена до конца транзакции, т.е. до момента выполнения оператора СОИИ1Т (при необходимости уточнить какие-либо сведения относительно оператора СОИИ1Т; см.
главу 3). Для доказательства этого утверждения допустим противное и предположим, что проверка должна выполняться немедленно. Пусть в данный момент вообще отсутствуют сведения о каких-либо поставках и деталях. Тогда лобавление сведений о любой детали будет ошибочным, поскольку при этом будет нарушено ограничение ОВСЗ. Аналогично любая попытка ввести сведения о поставке также приведет к ошибке, поскольку в этом случае будет нарушено ограничение ОВС24. Если во время выполнения оператора СОИИ1Т будет обнаружено нарушение ограничения базы данных, это вызовет откат данной транзакции. 8.6. "Золотое правило" Замечание.
Материал этого раздела ичвет фундачентапьное значение. Однако вопросы, которые здесь рассчатриваются, на практике, к сожапению, не нашпи ни изирокой поддержки, ни даже достаточного начинания, хотя, в принципе, они довольно простые. Предупреждение для читатепя. В разделе 3.4 главы 3 мы установили, что любое отношение имеет связанный с ним предикат, а кортежи этого отношения выражают истинные высказывания, порождаемые данным предикатом.
В разделе 5.3 главы 5 упоминалось догбщение замкнутости мира, согласно которому, если в определенном отношении не существует определенного кортежа, мы имеем право предположить, что соответствующее ему высказывание ложно. Мы не подчеркивали этот факт прежде, но читателю должно быть понятно, что переменная-отношение тоже имеет предикат, а именно — предикат, который будет общим для всех возможных отношений, представляющих допустимые значения для данной переменной-отношения. Например, рассмотрим переменную-отношение поставщиков Б.
Предикат для этой переменной-отношения можно сформулировать примерно так. Поставщик с данным ночером поставщика (Яб) ичеет данное ичя (ЯВАИЕА данное значение статуса (СТАТУЯ) и размещается в данноч городе (С1ТУ), кроче того, в любой заданный мочент никакие два поставщика не ичеют одинаковых номеров поставщика. 4 В действительности в (3.3) предлагается множественная форлпа присвоения, которая позволила бы вставлять детали и поставки в пределах одной операции. Если бы такие операции присвоения поддерживались системой, то ограничения базы данны хюгли бы конвпропироваться немедленно 307 Глава 8.
Целостность данньп Это утверждение и не точное, и не полное, но вполне приемлемое для наших целей. Также должно быть понятно, что предикат данной переменной-отношения по свой сути является критерием приемлемости изменений для рассматриваемой переменной- отношения, т.е, он предписывает, будет ли допустима определенная операция 1МБЕНТ, ОРОАТЕ или НЕСЕТЕ для данной переменной-отношения.
Например, попытка вставить сведения о новом поставщике с тем же номером поставщика, что и номер уже существующего поставщика, несомненно, должна быть отвергнута. Следовательно, в идеальном случае СУБД должен быть известен и понятен предикат каждой переменной-отношения в базе данных, что позволит системе корректно обрабатывать всевозможные попытки внесения изменений. Но такая цель, конечно, недостижима.
Например, не существует способа сформулировать для СУБД понятие о том, что определенный поставщик должен быть "в" определенном городе. Также неясно, каким образом СУБД может быть заранее известно, что предикат для переменной-отношения поставщиков является таким, что, например, первый из приведенных ниже кортежей будет допустимым, а второй — нет.
( Я$ : Я$ ( 'Я1' ) ВМАМЕ : МАМЕ ( 'ВпШ~' ) БТАТОЯ : 20 С1ТТ 3 'Ьопдол' ) ( Б$ : Б$ ( 'ВВ' ! ВМАМЕ : МАМЕ ( 'Вп1сп' ) БТАТОЯ : 50 СХТТ : 'Нове' ) Конечно, если пользователь предоставит последний кортеж для ввода в базу данных, то все, что система сможет сделать, — это убедиться, что никаких нарушений известных ей ограничений целостности нет. И, несомненно, система затем примет кортеж для добавления в базу данных и в дальнейшем будет воспринимать ега как истинное высказывание. Итак, можем сделать вывод, что система "не знает и не понимает" (и "не может знать и понимать") предикат переменной-отношения поставщиков на все (ООЬ, Однако ей известив достаточно хорошее приближение к этому предикату, а конкретнее — ей известны ограничения целостности, которые применимы к записям о поставщиках.
Следовательно, мы определяем предикат переменной-отиошения для переменной- отношения поставщиков (или в общем случае для любой переменной-отношения) как логическое умножение (логическая операция И) всех ограничений переменной-отношения, которые установлены для данной переменной-отношения. Например, предикат переменной-отношения для переменной-отношения Б выглядит примерно так. ( 1Б ЕНРТТ ( Я МНЕНЕ ЯТАТОЯ < 1 ОН ВТАТОЯ > 100 ) ) АМО ( 1Я ЕМРТТ ( Б МНЕНЕ С1ТТ = 'Ьолдоп' АМР БТАТОЯ и 20 ) ) АМО ( СОНЕТ ( Я ) = СОНЕТ ( Б ( Б$ ) ) ! (Кроме того, системе, конечно, известно, что атрибуты Б$, БМАХЕ, ЯТАТОБ и С1ТТ должны иметь типы Я$, МАМЕ, 1НТЕОЕН и СНАЯ соответственно.) 308 Часть 11.
Реляционная модель Отметим, что реально существуют два предиката, связанных с любой данной переменной-отношением: неформальный, или внешний, предикат, который понятен пользователям, но непонятен системе, и формальный, или внутренний, который понятен и пользователям, и системе. Конечно, внутренним предикатом является именно тот предикат, который мы подразумеваем под "предикатом переменной-отношения", и именно внутренний предикат система проверяет всякий раз, когда предпринимаются попытки изменить данную переменную-отношение.
В дальнейшем под термином предикат (когда он используется в связи с переменной-отношением) мы будем подразумевать именно внутренний предикат, кроме случаев, когда явно будет указано противоположное. Исходя из предшествующих определений теперь можно сформулировать золотое правило (по крайней мере его первую версию). Ни одна из операций изменения не имеет права переводить пераченную- отноигение в состояние, нарушающее ее собственньш предикат.