Шаг 9.
Работа с локальными БД в Delphi.
Нормализация. Первичный ключ (Уникальный идентификатор)

    На этом шаге мы рассмотрим понятие первичного ключа.

    Прежде чем обсудить создание связи между сущностями, мы должны рассмотреть еще одну их особенность. У каждой сущности должен быть первичный ключ или по-другому уникальный идентификатор, который мы будем называть ID. ID есть атрибут сущности, к которому применимы следующие правила:

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

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

Таблица 1. База данных по количеству задолженностей у студентов
№ зачетки Ф.И.О. Группа Кол-во задолженностей
024108 Емельянов А. В. 333 5
025485 Варфаламеев К. Л. 333 2
026739 Попов И. Е. 332 2
028925 Варфаламеев Б. Г. 331 0

    В данном примере возникает соблазн выбрать в качестве идентификатора ФИО, поскольку это есть у каждого студента. Но что если человек вступает в брак или законным образом хочет изменить фамилию? Тогда нарушается третье правило для идентификаторов. Еще хуже то, что ФИО окажутся не уникальными, что если два студента полные тезки, вы нарушите первое правило для идентификаторов. Абсолютно бессмысленно использовать в качестве первичного ключа атрибут кол-во задолженностей и группа. В данном случае в качестве первичного ключа может выступать номер зачетки.

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

Таблица 2. Таблица с добавленным идентифицирующим атрибутом
Название ансамбля Название CD Год записи Песня
1 Петлюра Север 1999 Север, В городском саду, Родители, весна, Солдат…
2 Петлюра Судьба 1998 Мчится карета, Судьба, Солдатка, Цвела акация...
3 5`NIZZA 5`NIZZA 2003 Пятница, Тянуться, Ямайка, Солдат…
4 Nautilus Наугад 1998 Тихие игры, Падал теплый снег, Черные птицы…
5 Фактор 2 Девочка Мальвина 2003 Одинокая звезда, Окна, Привидение, Hey, Baby, Hey...

    Уникальность подобного поля обычно отслеживается или программно, или автоматически. В первом случае при добавлении нового CD приложение, работающее с базой данных, отыскивает максимальный номер сотрудника, увеличивает его на 1 и назначает вновь добавляемой записи. Во втором случае первичный ключ реализуется через автоинкрементное поле. Для него сказанные действия выполняются автоматически системой управления базой данных.

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


Рис.1. Сущности CD и Песня со своими уникальными идентификаторами

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

    На следующем шаге мы рассмотрим реляционные отношения.




Предыдущий шаг Содержание Следующий шаг