Проблема целостности состоит в обеспечении правильности данных в базе в любой момент времени. Это касается защиты данных от непреднамеренных ошибок и их предотвращения. Этим проблема целостности отличается от проблемы безопасности, в остальном эти два вопроса тесно соприкасаются.
Имеются два основных вида ограничения целостности, которые должны поддерживаться СУБД:
структурные ограничения. Эти ограничения во многих случаях задаются функциональными зависимостями и проверяются путем проверки равенства значений соответствующих данных в базе;
ограничения реальных значений данных, хранимых в базе. Обычно такие ограничения требуют, чтобы значения поля принадлежали некоторому диапазону значений, либо выражают некоторое арифметическое соотношение между значениями различных полей.
Существуют и другие ограничения целостности. Например, ограничения на условия выполнения параллельных операций над данными в базе; ограничения типа старый–новый, когда БД переходит в новое состояние.
В общем случае целостность может быть нарушена при сбое оборудования, программной ошибке, ошибке человека-оператора, ошибках в исходных данных и т.п.
Рассмотрим примеры различных типов ограничений целостности.
1. Значения первичного ключа любого отношения (файла) должны быть уникальны.
2. Отношение (файл), кроме первичного ключа, может содержать возможные ключи, значения которых должны быть также уникальными.
Эти два примера соответствуют структурным ограничениям.
3. В заданном отношении для каждого кортежа между значением поля А и значением поля В должно всегда выполняться условие, что первое больше второго. Ограничение специфицируется специальным выражением.
|
4. Значения, которые принимает некоторый атрибут, должны быть ограничены заданным диапазоном. Ограничение специфицируется специальным выражением.
5. Для некоторого атрибута (или комбинации атрибутов) может существовать конечный (небольшой по размеру) набор допустимых значений (например, по атрибуту ОБРАЗОВАНИЕ могут быть только значения НАЧАЛЬНОЕ, НЕПОЛНОЕ СРЕДНЕЕ, СРЕДНЕЕ, НЕПОЛНОЕ ВЫСШЕЕ,
ВЫСШЕЕ). Ограничение специфицируется специальным выражением при описании данных.
6. Значения некоторого атрибута должны удовлетворять определенному формату.
7. Множество значений одного из атрибутов отношения должно удовлетворять некоторому статистическому условию. Например, конкретное значение не должно превышать более чем в два раза среднее значение. Ограничение реализуется СУБД при контроле выполняемых операций.
8. Множество значений некоторого столбца отношения является подмножеством значений другого столбца этого отношения. Ограничение контролируется при выполнении операций.
Рассмотренные примеры 3–8 соответствуют второму виду ограничений – ограничений на значения данных.
9. Требуется ограничить обновление данных в заданном отношении таким образом, чтобы для указанного атрибута имело место в каждом кортеже некоторое соотношение между старым и новым значениями.
Чтобы специфицировать подобное ограничение, в языках должны быть предусмотрены возможности реализации ссылки на старое и новое значения.
10. Если транзакция А (транзакция – это разовый прогон некоторой процедуры) и транзакция В выполняют изменения одних и тех же данных в базе, то в случае их параллельного выполнения может быть нарушена целостность данных в базе. В этом случае СУБД должна реализовать специальный режим выполнения параллельных вычислений. Например, транзакция В не может обратиться к данным, пока с ними не закончится работа в транзакции A.
|
11. Если транзакция выполняет несколько изменений в БД которые связаны между собой ограничениями целостности, то в этом случае ограничения целостности можно проверять только после выполнения транзакции. Такие ограничения называют отложенными.
Рассмотренных примеров достаточно, чтобы создать представление о составе задач, подлежащих решению при проектировании средств обеспечения целостности данных в базе.
Основная идея обеспечения ограничений целостности данных заключается в том, чтобы использовать язык ЯМД как средство выражения этих ограничений. Декларация ограничений целостности содержит две части. В первой из них должно быть выражено само ограничение, а во второй – описывается, когда, при каких условиях должна выполняться сама проверка. Языки манипулирования данными реальных систем позволяют в той или иной мере поддерживать если не все, то многие из рассмотренных ограничений целостности.
Оптимизация запросов
Рассмотрим методы оптимизации выражений реляционной алгебры, используемые процессором языка запросов при перефразировке запросов пользователей (составленных на языке запросов высокого уровня перед их выполнением).
Например, от пользователя системы поступает запрос вида
|
Будем считать, что в БД отношение R 1(A 1, A 2)представлено файлом из десяти тысяч записей, причем записей с A 2 = 11 в этом файле всего, например, 15. А отношение R 2(A 3, A 4) представлено файлом из двадцати тысяч записей, причем записей с A 3 = 55 в нем всего 50. Если этот поступивший запрос сразу же начать выполнять, не попытавшись его оптимизировать, придется выполнить большой объем работ: для построения декартова произведения придется выполнить 10 000 ´ 20 000 = 200 000 000 обращений к записям. Селекцию выполним сразу при формировании декартова произведения, поэтому в итоге для реализации запроса придется выполнить 200 000 000 обращений к записям файлов.
Если же исходное выражение преобразовать к виду
то объем требуемой вычислительной работы будет существенно сокращен.
Действительно, для вычисления селекции (sA2=11 R 1(A 1, A 2))необходимо выполнить десять тысяч обращений к записям. Для вычисления селекции (sA3=55 R 2(A 3, A 4))потребуется выполнить двадцать тысяч обращений. И для окончательного формирования отчета на запрос необходимо построить декартово произведение (sA2=11 R 1(A 1, A 2)) ´ (sA3=55 R 2(A 3, A 4)), используя файлы записей, полученные при вычислении селекции, т.е. придется выполнить еще 15 ´ 50 = 750 обращений к записям файлов промежуточных результатов. В итоге требуется выполнить лишь 10 000 + 20 000 + 750 = 30 750 обращений, что существенно (в несколько раз) меньше, чем в предыдущем случае.