2. Условия целостности данных
Чтобы информация, хранящаяся в базе данных, была однозначной и непротиворечивой, в реляци-онной модели устанавливаются некоторые ограничительные условия. Ограничительные условия — это правила, определяющие возможные значения данных. Они обеспечивают логическую основу для под-держания корректных значений данных в базе. Ограничения целостности позволяют свести к мини-муму ошибки, возникающие при обновлении и обработке данных.
Важнейшими ограничениями целостности данных являются:
категорийная целостность (целостность объектов, целостность сущностей);
ссылочная целостность.
Ограничение категорийной целостности заключается в следующем. Кортежи отношения пред-ставляют в базе данных экземпляры определенных объектов реального мира или, в соответствии с терминологией реляционных СУБД - сущностей, или, что то же самое, категорий. Например, строка таблицы СТУДЕНТЫ представляет элемент (конкретный экземпляр) категории (сущности) «студент». Первичный ключ таблицы однозначно определяет каждый кортеж и, следовательно, каждый элемент категории. Таким образом, для извлечения данных, содержащихся в строке таблицы, или для манипулирования этими данными необходимо знать значение ключа для этой строки. Поэтому строка не может быть занесена в базу данных до тех пор, пока не будут определены все атрибуты ее первичного ключа. Это правило называется правилом категорийной целостности и кратко формули-руется следующим образом: никакой атрибут первичного ключа строки базового отношения не может быть пустым (не может содержать значения NULL). Под базовым отношением имеется в виду именованное отношение (отношение, которому было присвоено имя), которое не является производным от других отношений, а является совершенно самостоятельным. Базовое отношение не может быть связано с другими отношениями базы данных, но с ним могут быть связаны другие отношения базы данных. В БД предыдущего примера (см. рис.1) имеются два базовых отношения: AUTHOR и TITLES.
Второе условие накладывает на внешние ключи ограничения для обеспечения целостности данных, называемой ссылочной целостностью.
Если две таблицы связаны между собой, то внешний ключ одной таблицы должен содер- жать только те значения, которые уже имеются среди значений первичного ключа другой таблицы, по которому осуществляется связь с этой таблицей. Если корректность значений внешних ключей не конт- ролируется СУБД, то может нарушиться ссылочная целостность данных. Это можно пояснить на рассматриваемом ранее примере следующим образом. Если удалить из таблицы СТУДЕНТЫ строку (например, при отчислении студента), имеющую хотя бы одну связанную с ней строку в таблице УСПЕВАЕМОСТЬ, то это приведет к тому, что в таблице УСПЕВАЕМОСТЬ останутся записи об успеваемости студента, который уже отчислен. Такая же ситуация будет наблюдаться и в том случае, если внешнему ключу таблицы УСПЕВАЕМОСТЬ ошибочно будет присвоено значение, отсутствующее в значениях ключа связанной таблицы.
Ограничения категорийной и ссылочной целостности автоматически поддерживаются во всех объектно-реляционных СУБД (без участия пользовательского приложения или пользователя). Для соблюдения категорийной целостности достаточно гарантировать отсутствие в любом отношении корте-жей с одним и тем же значением первичного ключа. Что же касается ссылочной целостности, то здесь обеспечение целостности выглядит несколько сложнее. При обновлении ссылающегося отношения (при вставке новых кортежей или модификации значения внешнего ключа в существующих кортежах) достаточно следить за тем, чтобы не появлялись некорректные значения внешнего ключа (то есть такие значения, которых нет в первичном ключе того отношения, на которое ведёт ссылка). А вот при удалении кортежа из отношения, на которое ведёт ссылка, возможно использовать один из трёх подходов, каждый из которых поддерживает целостность по ссылкам:
Первый подход заключается в том, что запрещается производить удаление кортежа, на который существуют ссылки (то есть сначала нужно либо удалить ссылающиеся кортежи, либо соответствующим образом изменить значения их внешнего ключа). Например, при попытке удаления из таблицы СТУДЕНТЫ строки, в поле «№_студенческого_билета» которой имеется значение 22991380, СУБД выдаст сообщение об ошибке, ведущей к нарушению ссылочной цело-стности, и не совершит никаких действий. Это произойдёт потому, что на значение 22991380 первичного ключа таблицы СТУДЕНТЫ ссылаются как минимум два значения внешнего ключа «№_студенческого_билета» таблицы УСПЕВАЕМОСТЬ.
Второй подход (называемый также каскадным удалением) состоит в том, что при удалении кор-тежа из отношения, на которое ведёт ссылка, из ссылающегося отношения автоматически удаляются все ссылающиеся кортежи. То есть, удаление из таблицы СТУДЕНТЫ строки, в поле «№_студен-ческого _билета» которой имеется значение 23980282 приведёт к тому, что все строки таблицы УС-ПЕВАЕМОСТЬ, имевшие значение поля «№_студенческого_билета» 23980282 будут автоматически удалены.
Возможен и третий вариант, когда при удалении кортежа, на который имеются ссылки, во всех ссылающихся кортежах значение внешнего ключа автоматически становится неопределённым (NULL) или принимает оговоренное заранее значение «по умолчанию». При этом теряется инфор-мация о ссылочной принадлежности соответствующих строк таблицы с внешним ключом. Напри-мер, удаление из таблицы СТУДЕНТЫ строки, в поле «№_студенческого_билета» которой имеется значение 23980282, в этом случае приведёт к тому, что во всех строках таблицы УСПЕВАЕМОСТЬ, имевших значение поля «№_студенческого_билета» 23980282, это значение будет заменено на NULL. При этом теряется информация о ссылочной принадлежности строк таблицы УСПЕВАЕ-МОСТЬ, имевших в столбце «№_студенческого_билета» значение 23980282.
В случае необходимости модификации значений первичного ключа, на которые существуют ссылки во внешних ключах других таблиц БД, также возможно применение одного из трёх, перечисленных выше, вариантов. В этом случае второй вариант называется каскадным изменением.
В общем случае поведение системы, при котором изменение или удаление значений первичного ключа отношения однозначно запрещается при наличии ссылающихся на него значений внешних ключей других отношений, называется ограничением (restrict). Тогда как отображение изменений или удалений значений первичного ключа отношения на соответствующих значениях ссылающихся на него внешних ключей других отношений называется каскадированием (cascading). Установлением (relation) называется метод, при котором удаление или изменение значений первичного ключа вызывает установку соответствующих значений внешнего ключа в NULL, или в значение «по умолчанию». Во всех развитых объектно-реляционных СУБД (Oracle 7 и выше, Microsoft SQL Server 2000, InterBase 6 и выше, DB2 и т.п.) можно выбрать один из указанных выше способов поддержания ссылочной целостности для каждой отдельной ситуации определения внешнего ключа. Конечно, для принятия такого решения необходимо анализировать требования конкретной прикладной области4.
