Часть 11.2: Ограничения уровня таблицы в базах данных SQLite3

Привет, посетитель сайта ZametkiNaPolyah.ru! Продолжаем изучать базы данных и наше знакомство с библиотекой SQLite3. В этой записи мы поговорим про ограничения уровня таблицы, которые нужны для поддержания целостности данных в базах данных, а так же для того, чтобы организовать связи между таблицами. Ограничения уровня таблицы в SQLite могут быть объявлены, как ограничения уровня столбца, хотя такой синтаксис записи может быть не всегда понятен, поэтому мы не будем его рассматривать.

Ограничения уровня таблицы в базах данных SQLite

Ограничения уровня таблицы в базах данных SQLite

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


Виды ограничений уровня таблицы в базах данных SQLite

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

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

Синтаксис использования ограничений уровня таблицы в базах данных SQLite

Синтаксис использования ограничений уровня таблицы в базах данных SQLite

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

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

А теперь посмотрим, какие ограничения уровня таблицы есть в базах данных SQLite3:

  1. Первичный ключ или PRIMARY KEY является ограничение уровня таблицы в базе данных SQLite. Если вы помните, то вторая нормальная форма требует, чтобы у каждой таблицы был первичный ключ. Первичный ключ в SQLite может быть, как простым, так и составным.
  2. Внешний ключ является ограничением уровня таблицы, внешние ключи предназначены для реализации различных видов связи между таблицами. Если отношение находится в первой нормальной форме, то вы навряд ли будете использовать внешние ключи. А вот если ваша база данных нормализована до третьей нормальной формы, то таблицы справочники будут связаны с родительскими таблицами внешними ключами, это справедливо и для второй нормальной формы.
  3. Автор сам не совсем понимает, почему разработчики SQLite отнесли ограничение CHECK к ограничениям уровня таблицы (вы можете в этом убедиться, открыв документацию). Хотя в документации указано, что не имеет никакого значения, как объявить ограничение CHECK: для таблицы или для столбца. Результат будет одинаковым.
  4. SQLite позволяет выполнять операции каскадного удаления и каскадной модификации данных, чтобы избежать трудностей удаления, если ваша база данных находится во второй или третьей нормальной форме, а так же для поддержания целостности данных и устранения аномалий, связанных с этими операциями.

Первичный ключ, как ограничение уровня таблицы в SQLite3

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

Для SQLite первичный ключ или PRIMARY KEY – это всего лишь правило, которое не должен нарушать никто и если вы сказали SQLite, что этот столбец PRIMARY KEY, то она позаботится о том, чтобы значения в этом столбце были уникальными и вечными.

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

Внешний ключ, как ограничение уровня таблицы в SQLite

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

SQLite, опять же, не знает про виды связей и внешний ключ для нее – ограничение. Конструкция FOREIGEN KEY говорит SQLite о том, что данный столбец будет связан со столбцом другой таблицы. А конструкция REFERENCE указывает на столбец другой таблицы: то есть дает ссылку, по которой SQLite понимает, что эти таблицы связаны.

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

Каскадное удаление и модификация данных в базе данных

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

Каскадное удаление и модификация данных в таблицах имеют два назначения: первое заключается в том, чтобы облегчить процесс удаления данных из таблицы базы данных (так как не всегда удобно выполнять несколько раз команду DELETE) и облегчить процесс модификации данных в таблицах базы данных (так как команду UPDATE тоже не очень удобно выполнять несколько раз); второе назначение заключается в обеспечение целостности данных и связей между таблицами.

Мы в отдельности рассмотрим каскадное удаление данных при помощи конструкции ON DELETE и каскадную модификацию данных при помощи конструкции ON UPDATE.

Текст комментария: