- •7.7.6. Определить общее количество поставщиков
- •7.7.7. Определить в поставках максимальное
- •7.7.8. Для каждой поставляемой детали указать номер и общий объем поставки в штуках
- •7.7.9. Указать номера всех типов деталей, поставляемых более чем одним поставщиком
- •7.7.10. Определить имена поставщиков детали с номером т2'
- •7.7.11. Определить имена поставщиков по крайней мере одной красной детали
- •7.7.12. Указать номера поставщиков, статус которых меньше текущего максимального статуса
- •7.7.13. Указать имена поставщиков детали с номером 'р2'
- •7.7.14. Выбрать имена поставщиков, которые не поставляют деталь с номером 'р2'
- •7.7.15. Определить имена поставщиков всех типов деталей
- •7.7.16. Определить номера деталей, которые либо весят более 16 фунтов, либо поставляются поставщиком с номером 's2', либо и то, и другое
- •7.8. Резюме
- •8.2. Ограничения типа
- •8.3. Ограничения атрибута
- •8.4. Ограничения переменной-отношения
- •8.5. Ограничения баз данных
- •8.6. "Золотое правило"
- •8.7. Ограничения состояния и ограничения перехода
- •8.8. Ключи
- •3. Пусть r1 и r2 — ссылающаяся и ссылочная переменные-отношения соответственно.
- •8.9. Средства языка sql
- •8.10. Резюме
- •9.1. Введение
- •9.2. Для чего нужны представления
- •9.3. Выборка данных из представлений
- •9.4. Обновление данных в представлениях
- •9.5. Моментальные снимки
- •9.6. Поддержка представлений в языке sql
- •9.7. Резюме
- •Часть III
- •10.1. Введение
- •10.2. Основные определения
- •10.3. Тривиальные и нетривиальные зависимости
- •10.4. Замыкание множества зависимостей
- •10.5. Замыкание множества атрибутов
- •10.6. Неприводимые множества зависимостей
- •10.7. Резюме
- •Глава 1 1
- •I Переменные-отношения в знф I
- •11.2. Декомпозиция без потерь
- •11.3. Первая, вторая и третья нормальные формы
- •11.4. Сохранение зависимостей
- •11.5. Нормальная форма Бойса-Кодда
- •11.6. Замечание по поводу атрибутов, содержащих в качестве значений отношения
- •11.7. Резюме
- •12.1. Введение
- •12.2. Многозначные зависимости и четвертая нормальная форма
- •12.3. Зависимости соединения и пятая нормальная форма
- •Соединение по комбинации атрибутов j#,s#
- •Исходное состояние spj
- •12.4. Общая схема процедуры нормализации
- •12.5. Денормализация
- •12.6. Ортогональное проектирование (небольшое отступление от темы)
- •12.7. Другие нормальные формы
- •12.8. Резюме
- •12.3. Brosda V., Vossen g. Update and Retrieval Through a Universal Schema Interface // acm tods. — December, 1988. — 13, № 4.
- •12.5. Date c.J. Will the Real Fourth Normal Form Please Stand Up? // c. J. Date and Hugh Darwen. Relational Database Writings 1989-1991.— Reading, Mass.: Addison-Wesley, 1992.
- •12.20.Kent w. The Universal Relation Revisited // acm tods. — December, 1983. — 8, № 4.
- •12.22.Maier d., Ullman j.D. Fragments of Relations // Proc. 1983 sigmod Intern. Conf. On Management of Data. — San Jose, Calif. — May, 1983.
- •12.24.Maier d., Ullman j.D. Maximal Objects and the Semantics of Universal Relation Databases // acm tods. — March, 1983. — 8, № 1.
- •Глава 13
- •13.1. Введение
- •13.2. Общий подход
- •Каждыи экземпляр сущности ности «Произведение"
- •13.3. Модель "сущность/связь"
- •13.5. Проектирование базы данных с помощью метода er-моделирования
- •13.6. Краткий анализ er-модели
- •13.7. Резюме
8.6. "Золотое правило"
Замечание. Материал этого раздела имеет фундаментальное значение. Однако вопросы, которые здесь рассматриваются, на практике, к сожалению, не нашли ни широкой поддержки, ни даже достаточного понимания, хотя, в принципе, они довольно простые. Предупреждение для читателя.
В разделе 3.4 главы 3 мы установили, что любое отношение имеет связанный с ним предикат, а кортежи этого отношения выражают истинные высказывания, порождаемые данным предикатом. В разделе 5.3 главы 5 упоминалось допущение замкнутости мира, согласно которому, если в определенном отношении не существует определенного кортежа, мы имеем право предположить, что соответствующее ему высказывание ложно.
Мы не подчеркивали этот факт прежде, но читателю должно быть понятно, что переменная-отношение тоже имеет предикат, а именно — предикат, который будет общим для всех возможных отношений, представляющих допустимые значения для данной переменной-отношения. Например, рассмотрим переменную-отношение поставщиков S. Предикат для этой переменной-отношения можно сформулировать примерно так.
4 В действительности в [3.3] предлагается множественная форма присвоения, которая позволила бы вставлять детали и поставки в пределах одной операции. Если бы такие операции присвоения поддерживались системой, то ограничения базы данных могли бы контролироваться немедленно
Поставщик с данным номером поставщика (Si) имеет данное имя (SNAME), данное значение статуса (STATUS) и размещается в данном городе (CITY), кроме того, в любой заданный момент никакие два поставщика не имеют одинаковых номеров поставщика.
Это утверждение и не точное, и не полное, но вполне приемлемое для наших целей.
Также должно быть понятно, что предикат данной переменной-отношения по свой сути является критерием приемлемости изменений для рассматриваемой переменной-отношения, т.е. он предписывает, будет ли допустима определенная операция INSERT, UPDATE или DELETE для данной переменной-отношения. Например, попытка вставить сведения о новом поставщике с тем же номером поставщика, что и номер уже существующего поставщика, несомненно, должна быть отвергнута.
Следовательно, в идеальном случае СУБД должен быть известен и понятен предикат каждой переменной-отношения в базе данных, что позволит системе корректно обрабатывать всевозможные попытки внесения изменений. Но такая цель, конечно, недостижима. Например, не существует способа сформулировать для СУБД понятие о том, что определенный поставщик должен быть "в" определенном городе. Также неясно, каким образом СУБД может быть заранее известно, что предикат для переменной-отношения поставщиков является таким, что, например, первый из приведенных ниже кортежей будет допустимым, а второй — нет.
{St : St ( 'SI' ) ,
SNAME : NAME ( 'Smith' ) ,
STATUS : 20 ,
CITY : 'London' }
{ St SNAME STATUS CITY
St ( 'S6' )
NAME ( 'Smith' ) ,
50
'Rome' }
Конечно, если пользователь предоставит последний кортеж для ввода в базу данных, то все, что система сможет сделать, — это убедиться, что никаких нарушений известных ей ограничений целостности нет. И, несомненно, система затем примет кортеж для добавления в базу данных и в дальнейшем будет воспринимать его как истинное высказывание.
Итак, можем сделать вывод, что система "не знает и не понимает" (и "не может знать и понимать") предикат переменной-отношения поставщиков на все 100%. Однако ей известно достаточно хорошее приближение к этому предикату, а конкретнее — ей известны ограничения целостности, которые применимы к записям о поставщиках. Следовательно, мы определяем предикат переменной-отношения для переменной-отношения поставщиков (или в общем случае для любой переменной-отношения) как логическое умножение (логическая операция И) всех ограничений переменной-отношения, которые установлены для данной переменной-отношения. Например, предикат переменной-отношения для переменной-отношения S выглядит примерно так.
( IS_EMPTY ( S WHERE STATUS < 1 OR STATUS > 100 ) ) AND
( IS EMPTY ( S WHERE CITY = 'London' AND STATUS Ф 20 ) ) AND
( COUNT ( S ) = COUNT ( S { St } ) )
(Кроме того, системе, конечно, известно, что атрибуты St, SNAME, STATUS и CITY должны иметь типы St, NAME, INTEGER и CHAR соответственно.)
Отметим, что реально существуют два предиката, связанных с любой данной переменной-отношением: неформальный, или внешний, предикат, который понятен пользователям, но непонятен системе, и формальный, или внутренний, который понятен и пользователям, и системе. Конечно, внутренним предикатом является именно тот предикат, который мы подразумеваем под "предикатом переменной-отношения", и именно внутренний предикат система проверяет всякий раз, когда предпринимаются попытки изменить данную переменную-отношение. В дальнейшем под термином предикат (когда он используется в связи с переменной-отношением) мы будем подразумевать именно внутренний предикат, кроме случаев, когда явно будет указано противоположное.
Исходя из предшествующих определений теперь можно сформулировать золотое правило (по крайней мере его первую версию).
Ни одна из операций изменения не имеет права переводить переменную-отношение в состояние, нарушающее ее собственный предикат.
Необходимо также подчеркнуть, что в этом случае под переменной-отношением необязательно подразумевается непременно базовая переменная-отношение. Золотое правило применимо ко всем переменным-отношениям, как к базовым, так и к производным. В следующей главе мы возвратимся к этому вопросу.
В завершение раздела отметим, что точно так, как для каждой переменной-отношения имеется некоторый связанный с ней предикат, так и для всей базы данных имеется связанный с ней предикат базы данных, который определяется как логическое умножение (логическая операция И) всех ограничений базы данных и всех ограничений переменных-отношений, которые были установлены в этой базе данных. Поэтому мы можем расширить формулировку золотого правила следующим образом5.
Ни одна из операций изменения не имеет права переводить переменную-отношение в состояние, нарушающее ее собственный предикат. Аналогично ни одна из транзакций изменения не имеет права переводить базу данных в состояние, нарушающее ее собственный предикат.