Какими свойствами должен обладать первичный ключ

Какими свойствами должен обладать первичный ключ thumbnail

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

4. ТАБЛИЦЫ И ПЕРВИЧНЫЕ КЛЮЧИ

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

В таблице имеются 6 уроков. Все 6 – разные, но для каждого урока значения одинаковых полей хранятся в таблице, а именно: tutorial_id (идентификатор урока), title (заголовок)и category (категория). Tutorial_idпервичный ключ таблицы уроков. Первичный ключ – это значение, которое уникально для каждой записи в таблице.
В таблице клиентов ниже customer_id – первичный ключ. В данном случае первичный ключ – также уникальное значение (число) для каждой записи.

Первичные ключи в повседневной жизни

В базе данных первичные ключи используются для идентификации. В жизни первичные ключи вокруг нас везде. Каждый раз, когда вы сталкиваетесь с уникальным числом это число может служить первичным ключом в базе данных (может, но не обязательно должно использоваться как таковое. Все базы данных способны автоматически генерировать уникальное значение для каждой записи в виде числа, которое автоматически увеличивается и вставляется вместе с каждой новой записью [Т.н. синтетический или суррогатный первичный ключ – прим.перев.]).

Несколько примеров

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

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

Что характеризует первичный ключ? Характеристики первичного ключа.

Первичный ключ служит для идентификации записей.

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

Первичный ключ уникален.

Первичный ключ всегда имеет уникальное значение. Представьте, что его значение не уникально. Тогда его бы нельзя было использовать для того, чтобы идентифицировать данные в таблице. Это значит, что какое-либо значение первичного ключа может встретиться в столбце, который выбран в качестве первичного ключа, только один раз. РСУБД устроены так, что не позволят вам вставить дубликаты в поле первичного ключа, получите ошибку.
Еще один пример. Представьте, что у вас есть таблица с полями first_name и last_name и есть две записи:

| first_name | last_name |
| vasya |pupkin |
| vasya |pupkin |

Т.е. есть два Васи. Вы хотите выбрать из таблицы какого-то конкретного Васю. Как это сделать? Записи ничем друг от друга не отличаются. Вот здесь и помогает первичный ключ. Добавляем столбец id (классический вариант синтетического первичного ключа) и…

Id | first_name | last_name |
1 | vasya |pupkin |
2 | vasya |pupkin |

Теперь каждый Вася уникален.

Типы первичных ключей.

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

Автонумерация.

Поле первичного ключа часто, но не всегда, обрабатывается самой базой данных. Вы можете, условно говоря, сказать базе данных, чтобы она сама автоматически присваивала уникальное числовое значение каждой записи при ее создании. База данных, обычно, начинает нумерацию с 1 и увеличивает это число для каждой записи на одну единицу. Такой первичный ключ называется автоинкрементным или автонумерованным. Использование автоинкрементных ключей – хороший способ для задания уникальных первичных ключей. Классическое название такого ключа – суррогатный первичный ключ [Как и упоминалось выше. – прим. перев.]. Такой ключ не содержит полезной информации, относящейся к сущности (объекту), информация о которой хранится в таблице, поэтому он и называется суррогатным.

5. СВЯЗЫВАНИЕ ТАБЛИЦ С ПОМОЩЬЮ ВНЕШНИХ КЛЮЧЕЙ

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

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

Один-ко-многим.

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

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

Какую информацию мы будем хранить? Решаем первый вопрос.

Для начала мы определимся какую информацию о заказах и о клиентах мы будем хранить. Чтобы это сделать мы должны задать себе вопрос: “Какие единичные блоки информации относятся к клиентам, а какие единичные блоки информации относятся к заказам?”

Проектируем таблицу клиентов.

Заказы действительно принадлежат клиентам, но заказ – это это не минимальный блок информации, который относится к клиентам (т.е. этот блок можно разбить на более мелкие: дата заказа, адрес доставки заказа и пр., к примеру).
Поля ниже – это минимальные блоки информации, которые относятся к клиентам:

  • customer_id (primary key) – идентификатор клиента
  • first_name — имя
  • last_name — отчество
  • address — адрес
  • zip_code – почтовый индекс
  • country — страна
  • birth_date – дата рождения
  • username – регистрационное имя пользователя (логин)
  • password – пароль
Читайте также:  Какое моторное масло имеет наилучшие свойства

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

Создание таблицы в SQLyog. Обратите внимание, что выбран флажок первичного ключа (PK) для поля customer_id. Поле customer_id является первичным ключом. Также выбран флажок Auto Incr, что означает, что база данных будет автоматически подставлять уникальное числовое значение, которое, начиная с нуля, будет каждый раз увеличиваться на одну единицу.

Проектируем таблицу заказов.
Какие минимальные блоки информации, необходимые нам, относятся к заказу?

  • order_id (primary key) – идентификатор заказа
  • order_date – дата и время заказа
  • customer – клиент, который сделал заказ

Ниже – пример таблицы в SQLyog.

Проект таблицы. Поле customer является ссылкой (внешним ключом) для поля customer_id в таблице клиентов.

Эти две таблицы (клиентов и заказов) связаны потому, что поле customer в таблице заказов ссылается на первичный ключ (customer_id) таблицы клиентов. Такая связь называется связью по внешнему ключу. Вы должны представлять себе внешний ключ как простую копию (копию значения) первичного ключа другой таблицы. В нашем случае значение поля customer_id из таблицы клиентов копируется в таблицу заказов при вставке каждой записи. Таким образом, у нас каждый заказ привязан к клиенту. И заказов у каждого клиента может быть много, как и говорилось выше.

Создание связи по внешнему ключу.

Вы можете задаться вопросом: “Каким образом я могу убедиться или как я могу увидеть, что поле customer в таблице заказов ссылается на поле customer_id в таблице клиентов”. Ответ прост – вы не можете сделать этого потому, что я еще не показал вам как создать связь.
Ниже – окно SQLyog с окном, которое я использовал для создания связи между таблицами.

Создание связи по внешнему ключу между таблицами заказов и клиентов.

В окне выше вы можете видеть, как поле customer таблицы заказов слева связывается с первичным ключом (customer_id) таблицы клиентов справа.

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

Заказы связаны с клиентами через поле customer, которое ссылается на таблицу клиентов.

На изображении вы видите, что клиент mary поместила три заказа, клиент pablo поместил один, а клиент john – ни одного.
Вы можете спросить: “А что же именно заказали все эти люди?” Это хороший вопрос. Вы возможно ожидали увидеть заказанные товары в таблице заказов. Но это плохой пример проектирования. Как бы вы поместили множественные продукты в единственную запись? Товары – это отдельные сущности, которые должны храниться в отдельной таблице. И связь между таблицами заказов и товаров будет являться связью один-ко-многим. Я расскажу об этом далее.

6. СОЗДАНИЕ ДИАГРАММЫ СУЩНОСТЬ-СВЯЗЬ

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

Сущности.

Вы можете задаться вопросом, что же такое сущность. Нуу… это “вещь” в системе. Там. Моя Мама всегда хотела, чтобы я стал учителем потому, что я очень хорошо объясняю различные вещи.

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

Давайте возьмем интернет-магазин для примера. Интернет-магазин продает товары. Товар мог бы стать очевидной сущностью в системе интернет-магазина. Товары заказываются клиентами. Вот мы с вами и увидели еще две очевидных сущности: заказы и клиенты.

Заказ оплачивается клиентом… это интересно. Мы собираемся создавать отдельную таблицу для платежей в базе данных нашего интернет-магазина? Возможно. Но разве платежи – это минимальный блок информации, который относится к заказам? Это тоже возможно.

Если вы не уверены, то просто подумайте о том, какую информацию о платежах вы хотите хранить. Возможно, вы захотите хранить метод платежа или дату платежа. Но это все еще минимальные блоки информации, которые могли бы относиться к заказу. Можно изменить формулировки. Метод платежа — метод платежа заказа. Дата платежа – дата платежа заказа. Таким образом, я не вижу необходимости выносить платежи в отдельную таблицу, хотя концептуально вы бы могли выделить платежи как сущность, т.к. вы могли бы рассматривать платежи как контейнер информации (метод платежа, дата платежа).

Давайте не будет слишком академичными.

Как вы видите, есть разница между сущностью и непосредственно таблицей в базе данных, т.е. это не одно и то же. Специалисты отрасли информационных технологий могут быть ОЧЕНЬ академичными и педантичными в этом вопросе. Я не такой специалист. Эта разница зависит от вашей точки зрения на ваши данные, вашу информацию. Если вы смотрите на моделирование данных с точки зрения программного обеспечения, то вы можете прийти к множеству сущностей, которые нельзя будет перенести напрямую в базу данных. В данном руководстве мы смотрим на данные строго с точки зрения баз данных и в нашем маленьком мире сущность – это таблица.

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

Как вы видите определение того, какие сущности имеет ваша система – это немного интеллектуальный процесс, который требует некоторого опыта и часто – это предмет для внесения изменений, пересмотров, раздумий, но, конечно, это не ракетостроение.

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

Связи.

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

Читайте также:  Определите какие свойства внимания проявляются в следующих ситуациях ответы

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

Источник

КЛЮЧИ и ЦЕЛОСТНОСТЬ БАЗЫ ДАННЫХ

Оглавление

КЛЮЧИ

Ключи играют огромную роль в реляционных базах данных. Они связывают
множество разрозненных таблиц в единую систему, другими словами, с помощью
ключей задаётся структура базы данных. Ключи делятся на независимые
потенциальные и зависимые от потенциальных внешние. И те
и другие ключи могут состоять из одной колонки (простые ключи) и нескольких
колонок (составные ключи).

Определение потенциального ключа. Множество атрибутов K, принадлежащих
отношению R и обладающее следующими двумя свойствами:

  1. уникальностью, означающей что никакие два кортежа из R не содержат
    одинакового набора значений из K;
  2. неизбыточностью, означающей что никакое подмножесво множества K
    не обладает свойством уникалности,

называется потенциальным ключом.

Потенциальный ключ играет роль адреса кортежа (строки) в отношении (таблице).
В одной таблице может быть несколько потенциальных ключей.

Пример таблицы с несколькими потенциальными ключами

Таблица Работники

Табельный
номер
ФИОСерия
паспорта
Номер
паспорта
Место
рождения
Дата
рождения
Должность . . .
2516Андреев В.Н.08 19451267Псков12.05.1974Мастер . . .
3974Белова Т.И.09 56814532Новгород24.09.1991сборщица . . .
. . . . . . . . . . . . . . . . . . . . . . . .

В таблице Работники три потенциальных ключа:

  1. Табельный номер — простой ключ;
  2. Серия паспорта и Номер паспорта — составной ключ из двух столбцов;
  3. ФИО, Место рождения и Дата рождения
    составной ключ из трёх столбцов.

Есть очень маленькая вероятность того, что на одном заводе будут работать два
человека с однинаковыми ФИО, родившиеся в одном месте одновременно. Пренебрежём
этим событием.

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

Остальные потенциальные ключи называются альтернативными.

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

Сделки

Номер сделкиКлиентоперацияЭмитент . . .
. . . . . . . . . . . . . . .

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

Сделки

Номер сделкиКлиентоперацияЭмитент . . .
. . . . . . . . . . . .
45382917Иванов С.п.ПокупкаAO Альфа . . .
45382917Петров Ю.М.ПродажаAO Альфа . . .
. . . . . . . . . . . . . . .

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

Сделки

IdНомер сделкиКлиентоперацияЭмитент . . .
. . . . . . . . . . . . . . .
34145382917Иванов С.п.ПокупкаAO Альфа . . .
34245382917Петров Ю.М.ПродажаAO Альфа . . .
. . . . . . . . . . . . . . .

Такая дополнительная колонка называется суррогатным
ключом
. Она нужна только для идентификации строк таблицы.

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

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

Пример. Сущности Факультет и Кафедра имеют связь типа
один ко многим. Им соответствуют таблицы Fak и
Kaf. Для отображения связи один ко многим служат первичный ключ ID
в таблице Fak и внешний ключ IdFak в в таблице Kaf.

Таблица Fak

IDНазваниеДекан . . .
1ФизикиПетров . . .
2ХимииХаритонов . . .
. . . . . . . . . . . .

Таблица Kaf

IdНазваниеIdFak . . .

1Теоретической физики1 . . .
2Органической химии2 . . .
3Физики твёрдого тела1 . . .
4Квантовой физики1 . . .
5Общей химии2 . . .
. . . . . . . . . . . .

Все строки таблицы Kaf, в которых IdFak равен ID из таблицы
IdFak, относятся к соответствующему факультету. Например, кафедры
Органической химии и Общей химии описаны в строках с IdFak=2.
В таблице Fak в строке с ID=2 описан факультет химии, к которому
нужно отнести кафедры Органической химии и Общей химии.

Формальное определение внешнего ключа выглядит очень абстрактно.

Определение внешнего ключа.
Рассмотрим два отношения R1 и R2.
Пусть

  • PK — состоящий из n атрибутов потенциальный ключ отношения R1;
  • FK — множество, состоящее из n атрибутов отношения R2;
  • каждому атрибуту из PK ставится в соответствие атрибут
    того же типа из FK.

Множество атрибутов FK, принимающее значения только из значений множества PK,
называется внешним ключом.

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

Таблица Цех

Номер
цеха
Название . . .
1Механический . . .
2Сборочный . . .
. . . . . . . . .

Таблица Участок

Номер
участка
Номер
цеха
Начальник . . .
11Петров . . .
21Харитонов . . .
12Новиков . . .
22Григорьев . . .
. . . . . . . . . . . .

Таблица План

Номер
участка
Номер
цеха
Дата запуска . . .
2110.05.2012 . . .
2111.05.2012 . . .
2210.05.2012 . . .
1110.05.2012 . . .
. . . . . . . . . . . .

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

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

ЦЕЛОСТНОСТЬ БАЗЫ ДАННЫХ

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

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

Примеры нарушения целостности данных

  1. Из базы данных получена дата 43.25.2016.
  2. Цена записана в графу Вес.
  3. Двум потокам назначены лекции в одно и тоже время в одной аудитории.
  4. Студент числится в несуществующей группе.

Эти примеры относятся к четырём группам возможных нарушений целостности
данных:

  1. атрибута (столбца, поля);
  2. кортежа (строки, записи);
  3. отношения (таблицы);
  4. базы данных в целом.
Читайте также:  Какое еще свойство сложения

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

Нарушение целостности атрибута

К этой группе нарушений целостности
относится пример 1, в котором дата 43.25.2016 имеет недопустимые значения дня и месяца.
Эта проблема легко устраняется правильным выбором типа данных. Но проблема контроля даты
сложнее, чем может показаться на первый взгляд. Например дата 03-25-12 в формате,
принятом в США, читается так: 25-е марта 2012 года. Существует большое количество
форматов дат. В разных СУБД форматы дат различны. Для текстовой информации очень
важен выбор кодировки. При неправильном выборе кодировки на экране монитора
вместо русских букв (кириллицы) появятся странные значки (крякозябры).

Эффективным средством предотвращения ошибок при вводе данных является
предложение пользователю выбрать, если это возможно, значение из списка, т.е.
домена атрибута. Примеры практически возможных доменов: все научные степени и
звания преподавателя, все регионы России, все факультеты одного вуза
(см. Лабораторная работа № 1. ).

В СУБД ACCESS предлагаются следующие средства для поддержания целостности
атрибута:

  • значение по умолчанию;
  • условие (ограничение) на значение;
  • обязательное поле, т.е. запрет NULL;
  • запрет пустых строк для текстовых данных;
  • индексированное поле (не допускается повторений);
  • список значений (домен).

Нарушение целостности кортежа

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

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

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

Самостоятельно постройте реляционную модель, соответствующую инфологической модели расписания, приведённой в лекции Модель сущность-связь

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

Практические приёмы поддержания целостности данных

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

Рассмотрим три приема поддержания целостности данных.

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

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

Таблица Численность населения

Год МестоСтранаНаселение_чел 
20151Китай1 339 450 000
20152Индия1 187 550 000
20153США310 241 000
20154Индонезия237 556 000
20155Бразилия193 467 000
. . . . . . . . . . . . . . . . . . . .
2015192Тувалу10 000
2015193Ватикан800
. . . . . . . . . . . . . . . . . . . .
20201Китай1 431 000 000
20202Индия1 366 000 000
20203США342 000 000
20204Индонезия266 000 000
20205Бразилия218 000 000
. . . . . . . . . . . . . . . . . . . .
2020191Науру17 000
2020192Тувалу12 000
. . . . . . . . . . . . . . . . . . . .

Создадим таблицу Страна состоящую из двух столбцов:
КодСтраны и Название, а в таблице Численность населения
заменим название страны на её код из таблицы Страна. Теперь, если изменится
название страны, его придётся менять только один раз в таблице Страна.

Таблица Численность населения

Год МестоКодСтраныНаселение_чел 
20151121 339 450 000
2015281 187 550 000
2015393310 241 000
201549237 556 000
201553193 467 000
. . . . . . . . . . . . . . . . . . . .
201519212110 000
20151932800
. . . . . . . . . . . . . . . . . . . .
20201121 431 000 000
2020281 366 000 000
2020393342 000 000
202049266 000 000
202053218 000 000
. . . . . . . . . . . . . . . . . . . .
20201915417 000
202019212112 000
. . . . . . . . . . . . . . .

Таблица Страны

КодСтраныНазвание

. . . . . .
3Бразилия
12Китай
93США
8Индия
9Индонезия
. . .

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

2. Неудаляемые записи. Для устранения возникших по злому умыслу или
случайно нарушений целостности даннных можно использовать такую организацию данных,
при которой записи не удаляются, а лишь помечаются как удалённые и становятся невидимыми
пользователю. Для этого в таблицу добавляются столбцы Ngr и priznak.
Когда в таблице появляется новая запись, ей присваивается уникальный номер группы и
признак d (действующая). При редактировании в этой записи меняется лишь признак
на s (старая), а результаты редактирования помещаются в новую запись с тем же номером
группы и признаком d (действующая). Запись которую пытается удалить пользователь,
помечается признаком u (удалённая). При выборке все записи с признаками s и
u игнорируются. При обнаружении искажения данных администратор базы данных
читает все записи, в том числе и исправленные и удалённые. Чтобы установить
виновного в ошибке, к таблице добавляются ещё два столбца: Кто и Когда,
в которых фиксируется пользователь, внёсший запись, и дата внесения. В приведённом примере
сделка с акциями эмитента Алмаз была создана, затем дважды отредактирована.
Сделка с акциями змитента Сапфир удалена.

Пример таблицы с неудаляемыми записями

Таблица Сделки

IdNgrpriznakЭмитентВид сделкиЦена . . .КтоКогда
1568d sАлмазПокупка24 . . .Петрова20.02.2014
15726dРубинПродажа150 . . .Борисов20.02.2014
. . . . . . . . . . . . . . . . . . . . . . . . . . .
7268d sАлмазПродажа24 . . .Борисов22.03.2014
. . . . . . . . . . . . . . . . . . . . . . . . . . .
8438dАлмазПокупка27 . . .Андреева24.03.2014
. . . . . . . . . . . . . . . . . . . . . . . . . . .
91735d uСапфирПокупка80 . . .Петрова24.03.2014
. . . . . . . . . . . . . . . . . . . . . . . . . . .

3. Триггеры — встроенные в базу данных процедуры, служащие для проверки
данных при выполнении одной из трёх операций:

  • вставки -INSERT;
  • обновления — UPDATE;
  • удаления — DELETE.

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

Источник