Распечатать страницу

Связи между таблицами в Microsoft VFP

« Назад

Выберем на вкладке Data диспетчера проекта базу данных HomeLibrary и нажмем на кнопку Modify. В открывшемся проектировщике базы данных установим между таблицами связи (рис. 2.9).

8.1.-Связи-таблиц-базы-данных-HomeLibrary.dbc

Рис. 2.9. Связи таблиц базы данных HomeLibrary.dbc

Связь, например, таблицы Authors с таблицей BooksAuthors устанавливается мышкой: захватывается первичный индекс таблицы Authors (он выделен жирным шрифтом) и перетаскивается к одноименному индексу таблицы BooksAuthors. Тип устанавливаемой связи – 1:М (1 ко многим). Таблица Authors в установленной связи является родительской, а BooksAuthors – дочерней.

Установленную связь можно отредактировать (рис. 2.10), дважды ударив по отображающей ее линии мышкой.

8.2.-Диалог-Edit-Relationship

Рис. 2.10. Диалог Edit Relationship

Установленные связи дают возможность ввести правила обеспечения ссылочной целостности данных.

Нажмем в диалоге Edit Relationship кнопку Referential Integrity или выберем пункт Edit Referential Integrity меню Database, откроем построитель ссылочной целостности данных и приведем его табличную часть в соответствие с рис. 2.11.

8.3.-Формирование-правил-обеспечения-ссылочной-целостности-данных

Рис. 2.11. Формирование правил обеспечения ссылочной целостности данных

Для таблиц Authors и BooksAuthors установлено правило обновление "Каскад", означающее, что при изменении кода автора (поле AuthorId) в таблице Authors такие же изменения произойдут в соответствующих записях таблицы BooksAuthors. Все это VFP, пока действует правило, будет обеспечивать автоматически без участия пользователя.

Для прочих таблиц указано правило обновление "Игнорировать". В общем случае применительно к таблице Books оно означает, что при изменении поля BookId в этой таблице поле BookId соответствующих записей таблиц BooksAuthors и BooksContent останутся неизмененным. Или, иными словами, нарушается ссылочная целость данных. Однако на практике такая ситуация невозможна, поскольку поле BookId имеет тип Integer (AutoInc), то есть недоступно для редактирования. То же справедливо и для поля TypeId, поэтому в связке WorkType – BooksContent также задано правило обновления "Игнорировать".

Правило удаления "Запретить", установленное для всех таблиц означает, что нельзя будет удалить запись родительской таблицы, например Authors, если в дочерней таблице имеются связанные записи. Такой запрет обоснован. Поэтому, чтобы удалить запись в Authors, нужно прежде найти и удалить все связанные с ней записи в BooksAuthors. Выполнение этой операцию, в свою очередь, будет обоснованным, если при этом из таблицы Books удаляются записи о книгах удаляемого автора.

Правило вставки "Игнорировать" распространяется на все таблицы. Оно разрешает добавлять в дочернюю таблицу запись, не имеющую соответствующего индексного значения в родительской. Так, теоретически в таблицу BooksContent можно добавить запись, в которой значение поля TypeId не совпадает ни с одним значением одноименного поля в родительской таблице WorkType. Или, другими словами, это поле адресует несуществующий вид произведения. На практике, однако, этого не произойдет, поскольку пользователь будет определять значение поля TypeId таблицы BooksContent, выбирая его из списка имеющихся значений. Кроме того, сохранение записи таблицы BooksContent с неопределенным значением поля TypeId будет запрещено.

По аналогичным причинам правило вставки "Игнорировать" установлено и на другие таблицы.

Замечание. При модификации таблиц базы данных установленные для этой таблицы правила контроля ссылочной целостности данных сбрасываются.

Ответственность за соблюдение введенных правил возлагается на процедуры, генерируемые VFP и записываемые в хранимые процедуры базы данных.

Открыв эти процедуры (команда меню Database – Edit Stored Procedures), обнаружим среди них в частности процедуры __RI_DELETE_authors( ) и __RI_UPDATE_authors( ), относящиеся к таблице Authors и реализующие заданные правила удаления и обновления.

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