- •Часть 2. Реляционная модель.
- •Глава 4. Реляционные объекты данных: домены и отношения.
- •4.1. Вводный пример
- •4.2. Домены
- •4.3. Отношения
- •4.4. Виды отношений
- •4.5. Отношения и предикаты
- •4.6. Реляционные базы данных
- •4.7. Резюме
- •Глава 8.
- •8.1. Введение
- •8.2. Определение данных
- •8.3. Обработка данных: операции выборки
- •8.3.1. Получить цвета и города для деталей "не из Парижа" с весом, большим десяти
- •8.3.2. Для всех деталей получить номер детали и ее вес в граммах
- •8.3.3. Получить полную информацию обо всех поставщиках
- •8.3.4. Получить информацию обо всех парах поставщиков и деталей, совмещенных в одном городе
- •8.3.5. Получить все пары имен городов, таких что поставщик, находящийся в первом городе, поставляет деталь, хранящуюся во втором городе
- •8.3.6. Получить все пары номеров поставщиков, таких что оба поставщика в каждой паре размещаются в одном и том же городе
- •8.3.7. Получить общее число поставщиков
- •8.3.8. Получить максимальное и минимальное количество для детали р
- •8.3.9. Для каждой поставляемой детали получить номер детали и общее количество поставки
- •8.3.10. Получить номера для всех деталей, поставляемых более чем одним поставщиком
- •8.3.11. Получить имена поставщиков, поставляющих деталь р2
- •8.3.12. Получить имена поставщиков, поставляющих по крайней мере одну красную деталь
- •8.3.13. Получить номера поставщиков, статус которых меньше текущего максимального статуса в таблице s
- •8.3.14. Получить имена поставщиков, поставляющих деталь р2
- •8.3.15. Получить имена поставщиков, которые не поставляют деталь р2
- •8.3.16. Получить имена поставщиков, поставляющих все детали
- •8.3.17. Получить номера деталей, которые или весят более 16 фунтов, или поставляются поставщиком s2, или и то и другое
- •8.4. Обработка данных: операции обновления
- •Table-term
- •I join-table-expression
- •8.6. Условные выражения
- •8.7. Скалярные выражения
- •8.8. Встроенный sql
- •8.8.1. Единичный select. Получить статус и город для поставщика, чей номер поставки задан базовой переменной givens#
- •8.8.2. Insert. Вставить новую деталь в таблицу р (номер детали, ее назв. И вес определены базовыми переменными р#, pname, pwt соответственно, цвет и город неизвестны)
- •8.8.3, Update. Увеличить статус всех поставщиков из Лондона на значение, определенное базовой переменной raise
- •8.8.4. Delete. Удалить все поставки для поставщиков из города,
- •8.9. Резюме
4.5. Отношения и предикаты
Хотя мы не останавливались на этом вопросе, читатель, наверное, интуитивно понимает, что каждое отношение имеет некоторую интерпретацию, причем пользователи должны знать ее для эффективного использования базы данных. Например, интерпретация отношения S может быть следующей:
Поставщик с определенным номером (S#) имеет определенное имя (SNAME) и определенное значение статуса (STATUS) и располагается в определенном городе (CITY); кроме того, нет двух поставщиков с одинаковыми номерами.
Это утверждение не очень точное, но оно подходит для наших целей. Формально, предыдущее утверждение — это пример того, что называют предикатом, или функцией значения истинности; в нашем конкретном случае — функцией четырех аргументов. Подстановка значений этих аргументов эквивалентна вызову функции (или "подтверждению" предиката), а значит, получению выражения, называемого высказыванием, которое может быть либо истиной либо ложью. Например, при подстановке
S# = 'S1' SNAME = 'Smith' STATUS = 20 CITY = 'London'
получим высказывание, являющееся истиной. А при подстановке
S# = 'Sl' SNAME = 'Abbey' STATUS =45 CITY = 'Tucson'
получим высказывание, являющееся ложью (потому что поставщик с номером Sl имеет имя не Abbey, статус не 45 и располагается не в Туксоне). И в любой момент времени отношение содержит в точности те кортежи, при которых предикат является истиной.
Из вышесказанного следует, что (например) кортеж, представленный в качестве кандидата для вставки в некоторое отношение, будет принят СУБД только в том случае, если он не противоречит соответствующему предикату (т.е. соответствующее высказывание не будет ложью). Вообще предикат данного отношения составляет критерий возможности обновления для этого отношения; т.е. критерий для решения, является ли некоторое обновление допустимым (или по крайней мере "правдоподобным") для данного отношения.
Для того чтобы система могла определить допустимость обновления данного отношения, ей должен быть известен предикат этого отношения. Конечно, сейчас СУБД не может в точности знать предикат для данного отношения. Например, в случае отношения S СУБД не может знать точно, что предикат для кортежа (Sl,Smith,20,London) будет истиной, а для кортежа (Sl,Abbey,45, Tucson) — нет.(////)
/////Здесь мы используем очевидное сокращение, согласно которому выражение (Sl,Smith,20,London) соответствует кортежу {<S#:'S1'>, <SNAME:'Smith'>, <STATUS:20>, <CITY:'London'>}./////
Однако СУБД считает кортеж приемлемым, если выполнены следующие условия:
• Значение S# принадлежит домену номеров поставщиков.
• Значение SNAME принадлежит домену имен.
• Значение STATUS принадлежит домену значений статуса.
• Значение CITY принадлежит домену названий городов.
• Значение S# должно быть уникальным среди всех значений отношения.
Иначе говоря, для базового отношения, такого как S, в СУБД используются определенные, объявленные для этого отношения, правила целостности, такие как правило о том, что значение S# уникально и принадлежит домену номеров поставщиков. Поэтому формально мы можем определить "значение" (известное СУБД) данного базового отношения как логическое умножение (логическая операция И) всех известных СУБД применяемых к этому отношению правил. И именно в этом смысле СУБД будет проверять допустимость обновления данного отношения.
Мы будем еще несколько раз возвращаться к значению отношения в последующих главах.