Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #52, МАРТ 2005 г.

Своя структура

Лавров Владислав (l-vv@r66.ru)

Спецвыпуск: Хакер, номер #052, стр. 052-024-6


Требование целостности по ссылкам состоит в том, что для каждого значения внешнего ключа в таблице, к которой ведет ссылка, должна найтись строка с таким же значением первичного ключа. Или значение внешнего ключа должно быть неопределенным, то есть ни на что не указывать. В нашем примере это означает, что если для пользователя форума указан номер группы, эта группа должна обязательно существовать в таблице GROUPS.

Каким образом обеспечить ссылочную целостность? Понятно, что при обновлении ссылающегося отношения (например, в таблице USERS вставляешь новые строки или корректируешь значения внешнего ключа, то есть переводишь пользователя в новую группу) достаточно следить за тем, чтобы не появлялись некорректные значения внешнего ключа. Но как быть при удалении из таблицы строки, к которой ведет ссылка? Предусмотрены две возможные операции: каскадирование (cascade) или ограничение (restrict). Эти операции можно установить на связь между двумя таблицами.

При каскадировании удаление строк в таблице приводит к удалению соответствующих строк в связанном отношении. Например, удаление информации о какой-нибудь группе приведет к удалению информации о всех пользователях этой группы. Подумай, нужно ли тебе такое? Если установить на связь операцию ограничения, то будут удаляться лишь те строки, для которых связанной информации в другой таблице нет. Если такая информация имеется, то удаление осуществить нельзя. В этом случае сначала нужно или удалить ссылающиеся строки, или соответствующим образом изменить значения их внешнего ключа. Например, удаление информации о какой-либо группе на форуме возможно выполнить в том случае, если в этой группе нет ни одного пользователя.

Необходимо также предусмотреть технологию того, что будет происходить при попытке обновления первичного ключа отношения, на которое ссылается некоторый внешний ключ. Здесь имеются те же возможности, что и при удалении: можно каскадировать или ограничить операцию. Например, ты захотел измененить id_group в таблице GROUP на форуме и одновременного отразить все изменения на заинтересованных пользователях в таблице USERS. Тогда установи операцию каскадирования при обновлении данных на связь между этими таблицами.

В современных реляционных СУБД, как правило, можно выбрать способ поддержания целостности по ссылкам для каждой отдельной ситуации определения внешнего ключа. Конечно, для принятия такого решения необходимо тщательно анализировать требования конкретной предметной области.

Алгоритм использования нормализации

Этап 1. Проанализируй свою схему на предмет наличия сущностей, которые скрыто моделируют несколько разных взаимосвязанных объектов реального мира (именно это соответствует ненормализованным отношениям). Если такое имеет место, то раздели каждую из этих сущностей на несколько новых и установи между ними соответствующие связи. Полученная схема будет находиться в первой нормальной форме.

Назад на стр. 052-024-5  Содержание  Вперед на стр. 052-024-7