МП-целостность при проектировании реляционных моделей баз данных

Автор: Миронов В.В., Миронов К.В.

Журнал: Онтология проектирования @ontology-of-designing

Рубрика: Инжиниринг онтологий

Статья в выпуске: 4 (58) т.15, 2025 года.

Бесплатный доступ

Обсуждается особый вид целостности в базах данных – целостность «множественности предка» (МП-целостность), понятие которого было введено авторами на концептуально-онтологическом уровне применительно к моделям «сущность–связь». В данной статье это понятие распространяется на реляционную модель с целью практического применения при создании баз данных. Рассматриваются связанные с этим видом целостности понятия: линия восходящего родства, отношение и ограничение множественности предка. Для перехода к реляционной модели требуется учѐт также первичных и внешних ключей, ссылочной целостности, табличных триггеров. В качестве универсального средства обеспечения целостности в реляционной среде предлагается подход на основе применения триггеров базы данных. Триггеры обнаруживают и блокируют операции вставки и обновления строк в таблицах, которые ведут к нарушению целостности. Отмечается необходимость процедурного программирования триггеров, а также сложность переноса данных между системами баз данных разного вида из-за различий языков процедурного программирования. Предлагается подход на основе использования возможностей поддержания ссылочной целостности. В этом случае целостность множественности предка обеспечивается как часть ссылочной целостности. Конкретное решение зависит от использования простых/составных, натуральных/суррогатных ключей, а также от технических ограничений среды реализации базы данных. Может потребоваться введение избыточных компонентов в состав ключей для отслеживания экземпляра предка вдоль линий восходящего родства. Приведены тестовые примеры реляционных моделей в различных реляционных средах (полностью – в MySQL и MariaDB, и частично в PostgreSQL, MS SQL Server, Oracle Database).

Еще

Модель «сущность–связь», реляционная модель, множественность предка, ли- ния восходящего родства, триггеры базы данных, внешние ключи, ссылочная целостность

Короткий адрес: https://sciup.org/170211137

IDR: 170211137   |   УДК: 001.92   |   DOI: 10.18287/2223-9537-2025-15-4-552-565

Текст научной статьи МП-целостность при проектировании реляционных моделей баз данных

Онтологический подход при проектировании баз данных (БД) [1, 2] позволяет задавать целевые информационные потребности и ограничения целостности на этапе концептуального проектирования БД [3, 4]. В работе [5], базируясь на онтологическом подходе, введена целостность множественности предка (МП-целостность) – специфическое ограничение целостности, которое часто встречается на практике. Рассмотрение МП-целостности выполнено в рамках модели «сущность–связь» (СС-модель) – модели концептуального уровня абстракции, отражающей онтологические особенности предметной области в виде системы классов сущностей и связей. Подобные модели разрабатываются на начальной стадии проектирования БД независимо от способа её реализации. На следующей стадии создаются логические модели, учитывающие возможности и ограничения используемой системы управления БД (СУБД) [6–8]. Наиболее распространённой основой для построения БД являются реляционные СУБД [9].

Данная статья посвящена исследованию практического применения МП-целостности в реляционной среде. Обсуждаются базовые положения МП-целостности, существенные особенности реляционной модели (РМ), обеспечение МП-целостности на основе суррогатных и натуральных ключей. На это исследование значительное влияние оказали работы в области философия «реляционной онтологии» [10, 11], онтологических аспектов системного анализа [12–14], применение онтологического подхода [15, 16].

1 Базовые положения МР-целостности

Здесь представлено развитие базовых понятий и положений МР-целостности, введённых в [5] (см. рисунок 1).

а)                  б)

Рисунок 1 – К понятию МП-целостности:

а) – пример СС-модели как модели классов; б) – пример экземпляров сущностей и связей; в) – сущности и связи как множества экземпляров; г) – МП-отношение двух ЛВР;

д) – экземпляры с несогласованной МП-целостностью

E a = { e i , e 2 , e 3 }

R a / b = { r 1/4 , •••, r 2/6 }

E b = { e 4 , •••, e 7 }

R b / c = { r 4/8 , •••, r 7/11}

E c = { e 8 , •••, e 14 }

г)

д)

в)

СС-модель задаёт онтологию БД в виде множества классов сущностей и множества классов бинарных связей типа «родитель–ребёнок» («один-ко-многим»). Рассматривается связка «класс–экземпляр», в которой каждый класс содержит множество экземпляров.

Линия восходящего родства (ЛВР) – цепочка «ребёнок–родитель», ведущая от некоторого потомка к некоторому предку («снизу вверх»). ЛВР представляет собой последовательность классов сущностей E , в которой каждая последующая сущность является родителем своей предшествующей сущности через некоторую связь R из множества классов связей (см. рисунок 1а):

„     „  R b/С     R a/b „

L = Ec ---* Eb ---* Ea.

ЛВР как класс представляет собой множество экземпляров l , где экземпляры – это цепочки экземпляров сущностей e , ведущих от экземпляра потомка к экземпляру своего предка (см. рисунок 1б):

L - { 1 8\ 1 , U\ 1 , 11 0\ 1 , 11 1\ 1 , 11 2 \ 1 , 11 3 \2 Д14\П1111 }.

Например, ЛВР-экземпляры I 8\ 1 и I 14\ Пи11 представляют собой цепочки

/ S .       1 /4.                                      Г 7 /

\ 1 - e 8 ---- * e 4 --- * e 1   и   Ч4\null = e 14 ----- * e 7 4 null.

ЛВР как функция для каждого аргумента – экземпляра потомка – задаёт экземпляр предка (или null-значение). Например, на рисунке 1б

( 8 ) - Ц e 9 ) - i^ !0 ) - Ж 1 ) - L(f>2 2 ) - e 1, L( 1 3 ) - e 2 , L( eM) - null.

МП-отношение – это совокупность М нескольких ЛВР, ведущих разными путями от общего потомка (МП-потомка) к общему предку (МП-предку). На рисунке 1г представлено МП-отношение, содержащее две ЛВР:

/c,      a°^>                     Rd/С.     Яа/

- {L 1 IL 2 J,  L 1 - E c      * E b      * E a ,  L 2 - Ec * E^     * E a .

МП-ограничение – это условие (предикат), заданное на МП-отношении, которое накладывается на совместные значения экземпляров МП-предка, полученные для каждого экземпляра МП-потомка через различные ЛВР. Это может быть:

  • ■    МП-равенство (МП + ), если требуется, чтобы у каждого экземпляра МП-потомка был один и тот же экзем

пляр МП-предка для всех ЛВР;

  • ■    МП-неравенство (МП-), если требуется, чтобы у каждого экземпляра МП-потомка были разные экземпля

ры МП-предка всех ЛВР;

  •    более сложное условие.

Таким образом, МП-целостность СС-модели соответствует выполнению всех установленных МП-ограничений. В примере на рисунке 1д приведены два экземпляра МП-отношения, которые не удовлетворяют условиям МП + /МП-. Если в этом примере требуется МП+-целостность, то у экземпляров е 6 и е2 б должен быть один общий экземпляр МП-предка; если же требуется МП--целостность, то у экземпляров е4 и е 24 должно быть два разных экземпляра МП-предка.

  • 2    Особенности реляционной модели для МП-целостности

Для выполнения МП-целостности в РМ требуется учитывать их особенности [10]. В РМ классам сущностей соответствуют таблицы реляционной БД. Атрибутам сущностей соответствуют столбцы таблицы. Экземплярам сущностей соответствуют строки таблицы. Строки идентифицируются значениями столбцов, составляющих первичный ключ ( Primary Key – PK). PK может быть задан двумя способами:

  •    в виде суррогатного ключа ( Surrogate Key - SK) - дополнительного числового столбца в таблице, для которого при вставке новой строки автоматически генерируются уникальные значения (значения SK неизменны в течение жизни строки таблицы);

  •    в виде натурального ключа ( Natural Key - NK) - одного или нескольких столбцов таблицы, соответствующих первичным атрибутам сущности ( NK могут быть составными, значения NK могут изменяться в течение жизни строки таблицы).

Помимо PK в таблице может быть задано несколько альтернативных ключей ( Unique Key - UK), каждый из которых тоже идентифицирует строки таблицы. Связи между сущностями реализуются с помощью внешних ключей ( Foreign Key - FK), которые представляют собой PK (или UK) таблицы-родителя, скопированные в таблице-ребёнке. Таким образом, FK является ссылкой из таблицы-ребёнка на таблицу-родителя. Для идентифицирующих связей FK входит в состав PK таблицы, а для неидентифицирующих не входит.

В БД автоматически поддерживается ссылочная целостность ( Referential Integrity - RI) , основанная на принципе: не должно быть детей несуществующих родителей, т.е. для каждого значения FK должно существовать такое же значение PK ( UK ) в таблице-родителе. В СУБД реализуется RI путём контроля операций обработки данных в соответствии с выбранными типами RI -правил, например:

  •    правило RESTRICT («строгое», действует по умолчанию) блокирует операцию вставки, удаления или обновления, если она ведёт к нарушению ссылочной целостности;

  •    правило ON UPDATE CASCADE («каскадное обновление») автоматически обновляет значения FK при обновлении соответствующего PK/UK и др.

Для обеспечения нестандартных требований целостности предусмотрены триггеры БД ( DB Triggers ) - особые процедуры, хранимые в БД. Триггер связан с таблицей и автоматически запускается при работе с данными в этой таблице. Например, триггер типа BEFORE INSERT запускается перед выполнением операции вставки в таблицу новой записи, а триггер типа BEFORE UPDATE - перед выполнением операции обновления существующей записи. Процедура триггера может в т.ч. проверять текущее содержимое таблиц БД и на этом основании блокировать выполнение операции.

  • 3    МП-целостность при использовании суррогатных ключей

При обеспечении МП-целостности в реляционной БД на основе SK необходимо учитывать две особенности: неидентифицирующий характер связей между таблицами; неизменность значений ключей - идентификаторов строк таблицы.

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

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

При переходе к РМ сущности становятся таблицами (см. рисунок 2б). В каждой таблице, если она не является полным иждивенцем, размещается SK ( SK обозначены звёздами, а имена содержат префикс «Ид» - идентификатор). Связи преобразуются в FK ( FK обозначены треугольниками, указывающими на соответствующий ключ родительской таблицы).

а)

Сп

Спец

ИдСпец

ИдСпец      Гр

Группа

ИдГруп

ИдГруп ИдСтуд

UR1

Ст

Студент

Цк

ИдСпец

Цикл

ИдЦикл

Пр

Предмет

ИдЦикл

ИдПред

PK

ИдСтуд       ИдПред

Сд

Сдача

UR2

б)

Рисунок 2 - Пример моделей с неидентифицирующими связями: а) - СС-модель; б) - реляционная модель на основе суррогатных ключей

Таблицы, являющиеся полными иждивенцами (таблица Сдача ), получают составной PK (отмечен тёмным квадратом), компонентами которого являются FK , ссылающиеся на родителей-кормильцев. Для FK задаются RI -правила (поскольку значения SK не изменяются в течение жизненного цикла (ЖЦ), это RESTRICT -правило). На рисунке 2а МП-отношение Сд -• Сп запрещает студенту сдачу «чужих» предметов и содержит две ЛВР, заданные цепочками ссылок FK :

1 2 3 4 6

Сд -• Сп = { Сд —> Ст —> Гр —> Сп | Сд —> Пр —> Цк —> Сп } .

Здесь стрелка обозначает RI -ограничение; слева от стрелки - таблица, в которой определено это ограничение; справа - родительская таблица, на которую ссылается ограничение; над стрелкой указано имя ограничения.

Операции, которые потенциально могут привести к нарушению МП-целостности, связаны с операциями работы с данными FK во всех таблицах МП-отношения, за исключением таблицы МП-предка (таблицы Спец ).

  •    Для таблицы, являющейся МП-потомком, - это операции вставки новой строки (INSERT) или изменения (UPDATE) в существующей строке значений FK, являющихся компонентами PK. В примере на рисунке 2б это относится к таблице Сдача, в которую может быть добавлена новая или изменена имеющаяся строка так, что появляется сдача студентом «чужого» предмета. Такие операции возможны без нарушения RI-целостности: для этого достаточно, чтобы новые значения FK соответствовали какому-нибудь студенту из таблицы Студент и какому-нибудь предмету из таблицы Предмет.

  •    Для промежуточных таблиц МП-отношения - это изменение в существующей строке значения FK. Например, при переводе некоторого студента в группу, обучающуюся на другой специальности, путём изменения значения FK UR3 RI-целостность сохранится, но МП-целостность будет нарушена.

  • 3 .1 Обеспечение МП-целостности на основе триггеров базы данных

Предлагаются два подхода к обеспечению МП-целостности в этом случае: с помощью табличных триггеров или с помощью избыточных FK .

Этот подход предполагает создание БД-триггеров, контролирующих ситуации нарушения МП-целостности и блокирующих соответствующие операции обработки данных. Это

BEFORE -триггеры, срабатывающие перед исполнением операции.

Сп

Спец

ИдСпец

Гр

ИдСпец

Группа

ИдГруп

Ст

ИдГруп

Студент

ИдСтуд

ИдСтуд

UR1           Сд

PK

Цк

ИдСпец

Цикл

ИдЦикл

Пр Предмет

ИдПред

ИдЦикл

ИдПред

UR2

На рисунке 3 приведён пример РМ на основе SK (см. рисунок 2б), дополненной триггерами для обеспечения МП-целостности. Триггеры обозначены шестиугольниками, тип триггера указан в разрыве линии, соединяющей его с родительской таблицей:

  •    BI - триггер Т1 BEFORE INSERT , привязан к таблице Сдача ;

  •    BU - триггеры Т2 - Т6 BEFORE UPDATE , привязаны к таблицам Сдача , Студент , Предмет , Группа и Цикл соответственно.

Триггер Т1 срабатывает перед вставкой новой строки в таблицу Сд (Сдача), соответствующую МП-потомку. Процедура триггера, основываясь на вставляемых значениях столбцов-

Рисунок 3 – Пример использования        атрибутов сдачи ИдСтуд и ИдПред, должна суррогатных ключей и триггеров         определить значения атрибутов ИдСпец по раз- для обеспечения МП-целостности ным ЛВР (т.е. соответствующие сдававшему студенту и сданному предмету) и в случае их несовпадения выдать команду блокирования операции вставки.

Триггер Т2 срабатывает перед изменением строки в МП-потомке в таблице Сд. Процеду- ра триггера должна выполнить те же действия, что и в триггере Т1, т.е. для изменяемых значений атрибутов сдачи ИдСтуд и ИдПред определить значения атрибутов ИдСпец сдававшего студента и сданного предмета и при несовпадении блокировать операцию обновления.

Триггеры Т3–Т6 срабатывают перед изменением строки в промежуточных таблицах МП-отношения (в таблицах Ст, Пр, Гр и Цк соответственно). Особенность этих таблиц в том, что модифицируемой строке в общем случае может соответствовать ноль, одна или несколько дочерних строк в МП-потомке (в таблице Сд). Поэтому процедуры этих триггеров должны отыскивать строки, являющиеся МП-потомками модифицируемой строки, и проверять для них МП-целостность (отсутствие сдачи студентами «чужих» предметов), в противном случае блокировать модификацию.

Языки процедур для триггеров различаются в различных реляционных СУБД. В данном случае используется язык PL / SQL (диалект MySQL 8.0 / MariaDB 10).

Программный код триггера Т1 (см. листинг 1) создаёт триггер BEFORE INSERT с именем Т1 , привязанный к таблице Сдача (строка 1). Опция FOR EACH ROW (строка 2) задаёт выполнение процедуры триггера для каждой вставляемой строки («строчный» триггер). Объявляются две целочисленные переменные (строка 3). В переменную ИдСпецСтуд заносится значение идентификатора специальности сдавшего студента, извлечённое по ЛВР Сд Ст Гр Сп командой SELECT (строки 4–7), а в переменную ИдСпецПред – значение идентификатора специальности сданного предмета, извлечённое аналогичным образом по ЛВР Сд Пр Цк Сп (строки 8–11). Значения этих переменных сравниваются (строка 11) и в случае неравенства возбуждается исключительное состояние SQLSTATE '45000' , которое отменяет вставку новой строки в таблицу и выдаёт сообщение MESSAGE_TEXT (строка 13).

Листинг 1 – Программный код INSERT-триггера для контроля вставки в таблицу Сдача

  • 1    CREATE TRIGGER Т1 BEFORE INSERT ON Сдача

  • 2    FOR EACH ROW BEGIN

  • 3      DECLARE ИдСпецСтуд, ИдСпецПред INT;

  • 4      SET ИдСпецСтуд = (

  • 5         SELECT Спец.ИдСпец FROM Группа NATURAL JOIN Студент

  • 6         WHERE Студент.ИдСтуд = NEW.ИдСтуд );

  • 7      SET ИдСпецПред = (

  • 8         SELECT Спец.ИдСпец

  • 9         FROM Спец NATURAL JOIN Цикл NATURAL JOIN Предмет

  • 10         WHERE Предмет.ИдПред = NEW.ИдПред );

  • 11      IF ИдСпецСтуд != ИдСпецПред THEN

  • 12        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT =

  • 13          "Триггер Т1: ОТМЕНА вставки — нарушение МР-целостности «Сдача –• Спец»";

  • 14       END IF;

  • 15    END;

Программный код триггера Т2 имеет аналогичный вид с той разницей, что опция INSERT заменена на опцию UPDATE, « Т1 » – на « Т2 », «вставки» – на «обновления».

Программный код триггера Т3 (см. листинг 2) содержит две числовые переменные ( Ид-СпецСтуд и ИдСпецПред , строка 3). Дальнейшая обработка происходит при условии, что изменению в строке таблицы Студент подвергается значение FK , ссылающегося на таблицу Группа (строка 4), причём у соответствующего студента имеются дочерние строки в таблице Сдача (строка 5). В случае выполнения этого условия в переменную ИдСпецСтуд заносится значение идентификатора специальности сдавшего студента, извлечённое по ЛВР Ст Гр Сп командой SELECT (строки 7–8), а в переменную ИдСпецПред – значение идентификатора специальности сданного предмета, извлечённое аналогичным образом по пути Ст →→ Сд Пр Цк Сп (строки 9–11). Поскольку участок Ст →→ Сд может содержать расщепление, команда SELECT (строка 10) содержит опцию DISTINCT , устраняющую дубликаты результирующего идентификатора специальности. Значения переменных ИдСпецСтуд и ИдСпецПред сравниваются (строка 12), и в случае неравенства возбуждается исключительное состояние, которое отменяет обновление, и выдаётся соответствующее сообщение (строка 13).

Листинг 2 – Программный код UPDATE-триггера для промежуточной таблицы

1 CREATE TRIGGER Т3 BEFORE UPDATE ON Студент

  • 2   FOR EACH ROW BEGIN

  • 3      DECLARE ИдСпецСтуд, ИдСпецПред INT;

  • 4      IF NEW.ИдГруп != OLD.ИдГруп AND EXISTS (

  • 5       SELECT * FROM Студент NATURAL JOIN Сдача WHERE Студент.ИдСтуд = NEW.ИдСтуд )

  • 6     THEN

  • 7        SET ИдСпецСтуд = (

  • 8         SELECT Группа.ИдСпец FROM Группа WHERE Группа.ИдГруп = NEW.ИдГруп );

  • 9        SET ИдСпецПред = (

  • 10         SELECT DISTINCT Цикл.ИдСпец FROM Сдача NATURAL JOIN Предмет NATURAL JOIN Цикл

  • 11         WHERE Сдача.ИдСтуд = NEW.ИдСтуд );

  • 12       IF ИдСпецСтуд != ИдСпецПред THEN

  • 13         SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT =

  • 14           "Триггер Т3: ОТМЕНА обновления — нарушение МР-целостности «Сдача—•Спец»";

  • 15         END IF;

  • 3. 2 Обеспечение МП-целостности на основе избыточных внешних ключей

16       END IF;

17    END;

Этот подход предполагает использование системных возможностей по контролю RI-целостности для того, чтобы обеспечить МП-целостность. Для этого требуется внесения избыточных атрибутов в состав FK так, чтобы иметь возможность проследить PK МП-предка вдоль ЛВР до МП-потомка. СУБД поддерживает RI-целостность с помощью скрытых си- стемных триггеров, поэтому в данном случае можно воспользоваться этим механизмом, чтобы не вводить пользовательские триггеры. Для этого необходимо продублировать идентификатор МП-предка в составе всех FK вдоль ЛВР. Это позволит контролировать идентификатор МП-предка вдоль всей ЛВР вплоть до МП-потомка. Важно, чтобы для таких FK действовало каскадное поддержание ссылочной целостности: любое допустимое изменение идентификатора МП-предка в промежуточных таблицах должно передаваться в дочерние таблицы. В результате для проверки МП-целостности остаётся проконтролировать совпаде-

ние этих идентификаторов по разным ЛВР у МП-потомка.

На рисунке 4 приведён пример РМ на основе SK (см. рисунок 2б). Идентификатор МП-предка Ид-Спец продублирован во всех таблицах, причём в таблице МП-потомка он сделан общим для обеих ЛВР.

FK , задающие цепочки ЛВР, содержат идентификатор МП-предка, для чего в промежуточных таблицах предусмотрены соответствующие UK (обозначены тёмными ромбами). Например, уникальный ключ UK1 в таблице Студент задан как

UK3     ИдСпец

ИдГруп

Гр

Сп

Спец

ИдСпец

Цк

Цикл

—• ИдСпец

ИдЦикл

UK4

UC4

•— Студент

ИдПред

Пр          ИдЦикл

Предмет —• ИдСпец

UC3

R 2   ИдГруп

1 ИдСпец

ИдСтуд

Рисунок 4 – Пример использования суррогатных ключей и избыточных внешних ключей для обеспечения МП-целостности

CONSTRAINT UK1 UNIQUE (ИдСпец, ИдСтуд) .

На него из таблицы Сдача ссылается FK UC1 , заданный как

CONSTRAINT UC1 FOREIGN KEY (ИдСпец, ИдГруп) REFERENCES Группа (ИдСпец, ИдГруп)

ON UPDATE CASCADE .

Здесь RI -правило ON UPDATE CASCADE обеспечивает автоматическую коррекцию значения ИдСпец в таблице Сдача при изменении ИдСпец в таблице Студент . В результате этого изменённое значение ИдСпец в таблице Группа (например, при переводе студента в группу, которая соответствует другой специальности) корректируется в строках таблицы Студент , которые соответствуют данной группе. Это изменение аналогичным образом переходит в таблицу Сдача, где блокируется вследствие нарушения ссылочной целостности по FK UC2 (поскольку изменение не касается ЛВР Сд Пр Цк Сп ).

В рассмотренном случае при нарушении МП-целостности происходит нарушение ссылочной целостности, о чём сообщается пользователю. Это может дезориентировать пользователя и затруднить понимание ситуации. Кроме того, этот подход неприменим для случая отрицательной МП-целостности, когда требуется обеспечить различие МП-предков для разных ЛВР. Более удобно использовать в МП-потомке разные имена идентификаторов МП-предка для различных ЛВР с последующим явным сравнением их значений.

На рисунке 5 этот подход иллюстрируется на примере рассмотренной модели (см. рисунок 4). Здесь в таблице МП-потомка Сдача предусмотрено два идентификатора МП-предка: ИдСпецС и ИдСпецП . Значение ИдСпецС каскадно наследуется через ЛВР Сд Ст Гр Сп , а значение ИдСпецП – через ЛВР Сд Пр Цк Сп . Сравнение этих значений может быть выполнено двумя способами: с помощью ограничения CHECK , заданного в таблице Сдача (рисунок 5а), или с помощью BI / BU -триггеров, прикреплённых к таблице (рисунок 5б). При использовании первого способа в определение таблицы вводится ограничение целостности

CONSTRAINT CH1 CHECK (ИдСпецС = ИдСтудП) .

Сообщение о нарушении данного ограничения однозначно укажет на нарушение МП-целостности. Этот способ работает не во всех СУБД. Например, если для ProgreSQL 15 он успешно применим, то текущие версии MySQL 8 / MariaDB 10 не допускают использование FK в условии действия ограничения CHECK .

UC1

ИдСтуд

J

г

ИдПред

PK 2

UC2

UC1

ИдСтуд

ИдПред

PK 2

UC2

Сд

Сдача

ИдСпецС

ИдСпецП

Сд

Сдача

ИдСпецС       ИдСпецП

а)                                                           б)

Рисунок 5 – Пример использования различных идентификаторов МП-предка в МП-потомке: а) – на основе условия CHECK; б) – на основе триггеров

В подобных случаях проверку совпадения / несовпадения идентификаторов МП-предка можно возложить на триггеры. В листинге 3 представлен программный код INSERT-триггера Т1 , который сравнивает новые значения ИдСпецС и ИдСпецП и блокирует операцию в случае несовпадения. Программный код UPDATE-триггера имеет аналогичный вид.

Листинг 3 – Программный код INSERT-триггера для МП-потомка Сдача

  • 1    CREATE TRIGGER Т1 BEFORE INSERT ON Студент

  • 2   FOR EACH ROW BEGIN

  • 3       IF NEW.ИдСпецС != NEW.ИдСпецП THEN

    4         SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT =

  • 5           "Триггер Т1: ОТМЕНА вставки — нарушение МР-целостности «Сдача–•Спец»";

  • 6         END IF;

  • 7    END;

4 МП-целостность при использовании натуральных ключей

Реляционная БД, основанная на NK, в отличие от БД, основанной на SK , может иметь идентифицирующие связи между таблицами, и значения ключей могут изменяться в течение ЖЦ строк таблицы. Идентифицирующие связи означают, что экземпляры дочерних сущностей идентифицируются в контексте своих родителей. На концептуальной модели это обстоятельство отражено с помощью тёмных квадратов в символах связи. На рисунке 6а приведён пример СС-модели, в которой все связи идентифицирующие, т.е. все сущности (кроме сущности Спец) идентифицируются в контексте своих родителей (студенческие группы локально идентифицируются в пределах своей специальности, студенты - в пределах группы и т.д.). На рисунке 6б приведена соответствующая РМ, где имена натуральных ключевых атрибутов имеют префикс «Код». PK (кроме МП-предка) являются составными и включают в качестве компонент PK таблиц-родителей. FK (кроме ссылки на МП-предка) также являются составными. В результате идентификатор МП-предка присутствует в составе PK своих потомков, что позволяет использовать подход к МП-целостности, аналогичный подходу с избыточными FK (см. рисунок 4).

Изменчивость NK в течение ЖЦ порождает необходимость поддержания каскадной ссылочной целостности, но не создаёт непосредственной угрозы для МП-целостности. Например, изменение идентификатора КодГруппы в таблице Группа (см. рисунок 6б) приводит к необходимости каскадного обновления одноимённых атрибутов в FK дочерних таблиц Студент и Сдача , что сохраняет МП-целостность. Нарушение МП-целостности может возникнуть при изменении FK , например, при переводе студента на другую специальность. Таким образом, в этом случае ситуация та же, что и при неизменных SK .

Сп

а)

КодСпец КодГруп

PK

UC3

КодСпец

'---кп л Гп\/п

КодГруп

КодСтуд

Гр

Группа

Ст

Студент

КодСпец Цк

Пр

Предмет

КодСпец

КодГруп        КодЦикл

КодСтуд        КодПред

Сд

Сдача

б)

КодСпец

КодЦикл

UC4

КодСпец кил I 11Л л —'

КодЦикл

КодПред

Рисунок 6 - Пример моделей с идентифицирующими связями: а) - СС-модель; б) - реляционная модель на основе натуральных ключей

Для обеспечения каскадной ссылочной целостности в этих случаях удобно использовать FK с опцией ON UPDATE CASCADE . Например, если PK в таблице Студент задан как CONSTRAINT PK_Ст PRIMARY KEY (КодСпец, КодГруп, КодСтуд) , то на него из таблицы Сдача ссылается FK UC1 , заданный как CONSTRAINT UC1 FOREIGN KEY (КодСпец, КодГруп, КодСтуд) REFERENCES Группа (КодСпец, КодГруп, КодСтуд) ON UPDATE CASCADE . В результате этого все изменения компонентов PK в таблице Студент автоматически передаются в FK UC1 таблицы Сдача .

Каскадное обновление ключей от МП-предка к МП-потомку по параллельным ЛВР может быть затруднено из-за технических ограничений СУБД. Так, модель на основе общего идентификатора МП-предка у МП-потомка, представленная на рисунке 6б, успешно работает в среде PostgreSQL 10. В среде MySQL 8 / MariaDB 10 таким способом не удаётся выполнить каскадное обновление PK КодСпец МП-предка (в таблице Спец ) из-за несинхронного обновления по разным ЛВР. В среде MS SQL Server 2022 запрещено каскадное обновление при наличии параллельных ЛВР – возникает ошибка на этапе компиляции. В среде Oracle Database автоматическое каскадное обновление не предусмотрено, и его необходимо поддерживать с помощью триггеров. В этих условиях можно перейти к схеме с раздельными идентификаторами МП-предка в МП-потомке, что позволяет выполнить каскадное обновление идентификатора МП-предка. Для контроля МП-целостности в этом случае потребуется использование триггеров (см. рисунок 5б).

Применительно к СУБД MySQL 8 / MariaDB 10 (см. рисунок 7) МП-потомок Сдача содержит два идентификатора МП-предка Спец ( КодСпецС и КодСпецП ), унаследованные по разным ЛВР (см. рисунок 5б). Это обеспечивает их корректное каскадное обновление ON UPDATE CASCADE через FK UC1–UC6 .

Триггеры Т1 Т6 обеспечивают контроль МП-целостности. Триггеры Т1 и Т2 контролируют равенство значений Код-СпецС и КодСпецП в таблице Сдача при вставке и обновлении строк (см. листинг 3). Триггеры Т3 Т6 контролируют то же самое при обновлении строк в промежуточных таблицах ЛВР (их необходимость вызвана тем, что в СУБД MySQL / MariaDB каскадное обновление таблиц не запускает триггеры, привязанные к этим таблицам).

В качестве примера рассмотрен триггер Т3 (см. листинг 4), который проверяет, не приведёт ли изменение в таблице Студент в результате последующего каскадного обновления к нарушению равенства значений КодСпецС и КодСпецП в таблице Сдача (строки 3–7), и в этом слу

Спец

КодСпец Цк

UC3

КодСпец КодГруп

КодСпец

КодЦикл

Пр Предмет

Ст

Студент

КодГруп КодСтуд

......    КодГруп

КодСтуд        КодПред

Рисунок 7 – Различные идентификаторы МР-предка в МР-потомке в случае натуральных ключей и идентифицирующих связей

UC4

КодСпец kn Л I I ми л —'

КодЦикл

КодПред

КодЦикл

UC2

чае отменяет операцию обновления с выдачей соответствующего сообщения (строки 8–10). Наличие в таблице Сдача ключевых атрибутов КодГруп и КодСтуд упрощает эту проверку с помощью оператора SELECT , который выполняет выборку из таблицы Сдача строк, являющихся дочерними для обновляемой строки таблицы и содержащими при этом различающиеся значения КодСпецС и КодСпецП . Триггеры Т4 Т6 построены аналогичным образом.

Листинг 4 – Программный код триггера Т3 (см. рисунок 7) в среде MySQL/MariaDB

  • 1    CREATE TRIGGER Т3 BEFORE UPDATE ON Студент

  • 2   FOR EACH ROW BEGIN

  • 3      IF ( NEW.КодСпец != OLD.КодСпец OR NEW.КодГруп != OLD.КодГруп

  • 4          OR NEW.КодСтуд != OLD.КодСтуд ) AND EXISTS (

  • 5           SELECT * FROM Сдача WHERE Сдача.КодСпецС = OLD.КодСпец

  • 6             AND Сдача.КодГруп = OLD.КодГруп AND Сдача.КодСтуд = OLD.КодСтуд

  • 7             AND NEW.КодСпец != Сдача.КодСпецП )

  • 8      THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT =

  • 9        "Триггер Т3: ОТМЕНА обновления — нарушение МР-целостности «Сдача—•Спец»";

  • 10       END IF;

  • 11    END;

Заключение

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

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

Приведённые РМ и программный код созданы в виде тестовых примеров и проверены в средах СУБД (полностью в MySQL и MariaDB , частично, где это позволяла функциональность, в PostgreSQL , MS SQL Server , Oracle Database ).