Найти в Дзене
programmer's notes (python and more)

Реляционные базы данных. Целостность. Приложение к видео-уроку

Оглавление

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

Понятие реляционной целостности

Данная статья даёт дополнительные разъяснения к видео-лекции

И так, что такое целостность в отношении баз данных.

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

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

Не много о пользовательской целостности

Несколько слов о пользовательской целостности, к которой мы будем время от времени обращаться, по мере рассмотрения тех или иных механизмов, реализованных в PostgreSQL.

Пример пользовательской целостности:
Пусть в столбце таблицы хранится номер телефона. Тогда это накладывает на данное, которое будет хранится в этом столбце, ряд условий. Например такие: а) Всё содержимое состоит из цифр; б) Первая цифра 8; в) количество цифр 11.

Можно привести ещё множество примеров: ИНН, банковский счёт, номер и серия паспорта и т.д. Суть в том, что нарушения требований приводит к тому, что данное, которое мы извлекаем из столбца, перестаёт нести нужную для нас информацию. Если же говорить в целом об информационной системе, которая работает с такой базой данных, то нарушение целостности может привести к тому, что система перестанет корректно функционировать.

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

Пользовательскую целостность также иногда называют корпоративной.

Реляционная целостность

Переходим теперь к реляционной целостности. Это целостность, которая вытекает из реляционных положений. Можно выделить: сущностная целостность, доменная целостность, ссылочная целостность. Начнём рассматривать по порядку.

Сущностная целостность

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

Доменная целостность

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

Отметим, что домен может быть задан четырьмя способами:

  1. Указанием типа данных. Есть набор типов данных, которые мы можем использовать при определении столбцов таблицы. В сущности тип данных также является доменом.
  2. Перечислением его элементов.
  3. Указанием алгоритма, при помощи которого может быть сгенерирован новый член домена.
  4. Указанием правила, при помощи которого можно определить, принадлежит элемент домену или нет.

Создать домен можно командой

CREATE DOMAIN

Рисунок 1. Значение для столбца таблицы берём из домена
Рисунок 1. Значение для столбца таблицы берём из домена

К этой команде мы вернёмся в одной из следующих статей.

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

Ссылочная целостность

Ссылочная целостность имеет прямое отношение к такой важной стороне реляционных баз данных, как связи между таблицами (1, 2).

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

Выделим три вида операции над связанными таблицами: удаление из главной таблицы, обновление значений в главной таблице, вставка в подчинённую таблицу.

Удаление строк из главной таблицы

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

1. Строки из подчинённой таблицы должны быть удалены вместе со связанными строками из подчиненной таблицы. Такой механизм называется каскадированием.

2. Если удаляемая строка из главной таблицы связана со строками из подчинённой таблицы, то такая операция удаления должна быть отвергнута. Данный механизм наиболее безопасен и предпочтителен при построении приложений.

3. Если строка в подчиненной таблице связана с удаляемой строкой в главной таблице, то внешнему ключу следует присвоить значение NULL или некоторое другое значение, принятое для этой цели. Тогда мы будем знать, что эти строки в подчинённой таблице были когда-то связаны со строками из главной таблицы и как-то учитывать это.

Обновление строк из главной таблицы

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

1. Первичные ключи из главной таблицы обновляются вместе с внешними ключами подчинённой таблицы. Как и в случае с подобной операцией удаления этот механизм называется каскадированием.

2. Если обновляемая строка связана с какой-либо строкой подчиненной таблицы, то операция обновления должна быть отвергнута.

3. Если строка в подчиненной таблице связана с обновляемой строкой в главной таблице, то внешнему ключу следует присвоить значение NULL или другое оговорённое заранее значение.

Вставка строк в полчинённую таблицу

Здесь возможны следующие механизмы:

1. Строка в подчинённой таблице вставляется вместе со строкой в главной таблице. Последовательность добавления такая: в начале добавляется строка в главную таблицу и определяется значение первичного ключа. Затем добавляется строка в подчинённую таблицу, в которой значению внешнего ключа присваивается значение первичного ключа в главной таблице. Такой механизм обычно не поддерживается СУБД, так что нужно организовывать его программно.

2. Строка в подчинённой таблице добавляется только при условии, что соответствующая ей строка в главной таблице уже существует.

3. При добавлении строки в подчинённую таблице внешнему ключу присваивается значение NULL или некоторое оговорённое значение.

Пока всё!

Хорошего программирования. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.

- Вы нарушили все правила. - А кто их устанавливал?
- Вы нарушили все правила. - А кто их устанавливал?