После определения основных объектов и характеризующих их атрибутов надо продумать "поведенческие" аспекты твоей базы данных. Другими словами, определить, что будет происходить при вставке, корректировке и удалении реальных за писей. Останутся ли при этом данные в твоей базе правильными? Не появится ли в ней противоречивая информация? Эти вопросы порождают известную в теории проблему обеспечения целостности данных. Целостность бывает двух видов: целостность сущностей и целостность по ссылкам.
Объекту или сущности реального мира в реляционных БД соответствуют строки таблиц. Требование целостности сущностей состоит в том, что любая строчка таблицы должна отличаться от любой другой строчки этой же таблицы. Это требование ты уже выполнил создав первичный ключ, то есть уникальный идентификатор строк. Поэтому вставить две одинаковые записи данных в таблицу ты уже точно не сможешь: система не позволит.
С обеспечением требований по ссылкам на другие таблицы дело обстоит сложнее. Лучше показать это на примере. Допустим, ты разрабатываешь базу данных для сопровождения своего форума, и тебе надо хранить информацию о зарегистрированных пользователях. Каждый пользователь состоит в определенной группе, в соответствии с которой ему назначены права (например, administrators, moderators, registered, banned и т.д.). При правильном проектировании структуры у тебя появятся две связанные таблицы:
GROUPS (id_group, name_group, rights) первичный ключ id_group
Атрибут fk_id_group появляется в таблице USERS не потому, что номер группы является собственным свойством пользователя, а лишь для того, чтобы при необходимости восстановить полную информацию о группе. Значение атрибута fk_id_group в любой строке таблицы USERS должно соответствовать значению атрибута id_group в некоторой строке таблицы GROUPS. Такой атрибут называется внешним ключом (foreign key), поскольку его значения одноз начно характеризуют объекты, представленные строками некоторого другого, внешнего отношения (то есть задают значения их первичного ключа). Отношение, в котором определен внешний ключ, ссылается на соответствующее отношение, в котором такой же атрибут является первичным ключом.
Требование целостности по ссылкам состоит в том, что для каждого значения внешнего ключа в таблице, к которой ведет ссылка, должна найтись строка с таким же значением первичного ключа. Или значение внешнего ключа должно быть неоп ределенным, то есть ни на что не указывать. В нашем примере это означает, что если для пользователя форума указан номер группы, эта группа должна обязательно существовать в таблице GROUPS.
Каким образом обеспечить ссылочную целостность? Понятно, что при обновлении ссылающегося отношения (например, в таблице USERS вставляешь новые строки или корректируешь значения внешнего ключа, то есть переводишь пользователя в новую группу) достаточно следить за тем, чтобы не появлялись некорректные значения внешнего ключа. Но как быть при удалении из таблицы строки, к которой ведет ссылка? Предусмотрены две возможные операции: каскадирование (cascade) или ограничение (restrict). Эти операции можно установить на связь между двумя таблицами.
При каскадировании удаление строк в таблице приводит к удалению соответствующих строк в связанном отношении. Например, удаление информации о какой-нибудь группе приведет к удалению информации о всех пользователях этой группы. Подумай, нужно ли тебе такое? Если установить на связь операцию ограничения, то будут удаляться лишь те строки, для которых связанной информации в другой таблице нет. Если такая информация имеется, то удаление осуществить нельзя. В этом случае сначала нужно или удалить ссылающиеся строки, или соответствующим образом изменить значения их внешнего ключа. Например, удаление информации о какой-либо группе на форуме возможно выполнить в том случае, если в этой группе нет ни одного пользователя.
Необходимо также предусмотреть технологию того, что будет происходить при попытке обновления первичного ключа отношения, на которое ссылается некоторый внешний ключ. Здесь имеются те же возможности, что и при удалении: можно каскадировать или ограничить операцию. Например, ты захотел изме-ненить id_group в таблице GROUP на форуме и одновременного отразить все изменения на заинтересованных пользователях в таблице USERS. Тогда установи операцию каскадирования при обновлении данных на связь между этими таблицами.
В современных реляционных СУБД, как правило, можно выбрать способ поддержания целостности по ссылкам для каждой отдельной ситуации определения внешнего ключа. Конечно, для принятия такого решения необходимо тщательно анализировать требования конкретной предметной области.