- •Глава 1 Внешние модели данных
- •1.1. Общие положения
- •1.2. Иерархическая модель
- •1.3. Целостность иерархической модели
- •Уникальность
- •Обязательность и множественность
- •Кортежи
- •Виртуальные атрибуты
- •Правила активности
- •1.4. Построение иерархических моделей
- •Ориентация модели
- •Выбор ключевых атрибутов
- •3 Посвященному пользователю этот набор цифр — номер зачетной книжки — тоже может сказать кое-что; например, первые две цифры — о годе поступления студента.
- •1.5. Модель «гиперкуб данных»
1.3. Целостность иерархической модели
Обсудим теперь весьма важный вопрос о том, как в модели «сложная таблица» отражаются ограничения целостности базы данных2.
Неявные ограничения целостности (Implicit Integrity Constraint)3, естественным образом присущие иерархической модели данных и не требующие от разработчика каких-либо дополнительных спецификаций, фактически уже обсуждались выше. Это ограничение единственной сущности, а также ограничение иерархической организации множества атрибутов: атрибут или агрегат может непосредственно входить только в один агрегат (что, конечно же, не препятствует древовидной вложенности агрегатов).
Явные ограничения целостности (Explicit Integrity Constraint), которые должен задать разработчик базы данных в дополнение к неявным ограничениям, можно разделить на два вида:
стандартные, которые можно отразить средствами языка модели (в данном случае — графическими);
нестандартные, для отражения которых отсутствуют возможности в языке модели и которые приходится задавать с помощью дополнительных словесных (вербальных) формулировок.
Далее рассматриваются основные классы стандартных и нестандартных ограничений.
2 Целостность базы данных (Database Integrity) — свойство состояния базы данных, характеризующееся отсутствием таких значений данных или их сочетаний, которые невозможны в соответствующей предметной области. Например, в предметной области — учебном процессе — невозможен студент, обучающийся, скажем, на седьмом курсе, в то время как в базе данных атрибуту «курс» вполне можно приписать значение «7». Поэтому модель данных должна задавать ограничения целостности (Integrity Constraint) базы данных.
3 Синоним — генетические (Native) ограничения целостности.
Уникальность
Ограничения уникальности связаны с запретом дубликатов, т. е. одинаковых значений атрибутов или совокупностей атрибутов в для множества или определенного подмножества экземпляров сущности. В первую очередь требуется, чтобы дубликаты отсутствовали во всей совокупности экземпляров сущности, т. е. чтобы совокупность экземпляров сущности являлась множеством в математическом смысле1. Более тонкие нюансы уникальности связаны с понятиями идентификатора и ключа.
Идентификатор сущности (Entity Identifier) — совокупность атрибутов сущности (или отдельный атрибут), которые уникально идентифицируют отдельные экземпляры сущности на множестве всех возможных экземпляров. Иными словами, среди всех возможных экземпляров сущности не должно быть двух с одинаковыми значениями идентификатора. Например, если в реальной недопустимы два студента с одинаковым кодом (очевидно, так оно и есть), то атрибут «код» является идентификатором сущности «Студент». Идентификатор в данном примере содержит единственный атрибут; такой идентификатор называется простым.
Составной идентификатор (Compaund Identifier) содержит более одного атрибута. Говоря о составных идентификаторах, необходимо учитывать то обстоятельство, что из имеющегося идентификатора можно сделать другой простым добавлением к нему еще одного атрибута сущности. Если атрибут «код» является идентификатором, то пара атрибутов — «код» и, скажем, «фио» — тоже является идентификатором согласно определению, приведенному выше. Такая ситуация создает неудобства, поэтому обычно пользуются более строгим определением составного идентификатора, как минимальной совокупности атрибутов, уникально идентифицирующей сущность. Минимальная совокупность означает, что при удалении любого атрибута из списка идентификатора остаток уже не является идентификатором. Далее мы будем основываться на таком понимании идентификатора.
Пример составного идентификатора. Если дополнить сущность «Студент» атрибутами «спец» — код специальности, на которой обучается студент, «группа» — порядковый номер группы студента на специальности, «нпп» — номер по порядку студента в группе, то, очевидно, такая совокупность атрибутов образует идентификатор.
Несколько идентификаторов одной сущности — вполне допустимая и часто встречающаяся на практике ситуация. Для сущности «Студент» помимо рассмотренных идентификаторами могли бы быть атрибуты: «зачетка» — номер зачетной книжки, «паспорт» — серия и номер паспорта; «иин» — индивидуальный идентификационный номер и т. п. В связи с этим на практике возникает необходимость выбора того или иного идентификатора в качестве стандартного средства идентификации экземпляров сущности.
Первичный ключ (Primary Key) сущности (или просто ключ сущности) — идентификатор сущности, выбранный среди остальных идентификаторов для идентификации экземпляров в некоторых стандартных ситуациях. Для сущности можно задать, таким образом, только один первичный ключ и именно он используется по умолчанию для доступа к экземплярам сущности. Остальные идентификаторы в этом плане называются возможными (Candidate) ключами2.
Первичный ключ на диаграмме модели будем отображать с помощью квадратов на конце выносных линий, ведущих к атрибутам, которые являются компонентами ключа (рис. 1.5). Таким образом, первичный ключ является стандартным ограничением целост ности. Что касается возможных ключей, то, чтобы не загромождать диаграмму, отнесем их к разряду нестандартных и будем задавать с помощью дополнительных формулировок.
Уникальность в многозначных агрегатах подразумевает отсутствие дублирования значений атрибутов в множестве экземпляров многозначных агрегатов, соответствующих одному экземпляру сущности или одному экземпляру родительского агрегата. В качестве примера рассмотрим совокупность экземпляров агрегата «Предмет» в модели на рис. 1.2. Если рассматривать эту совокупность для всего множества студентов, то среди них вполне могут оказаться дубликаты — несколько студентов сдали один и тот же предмет в один день с одной оценкой. Однако, если рассмотреть совокупность экземпляров «Предмет», соответствующих одному экземпляру сущности «Студент», то дубликатов быть не должно, поскольку в этой модели конкретный студент сдает конкретный предмет только один раз, т.е. не может быть двух экземпляров «Предмет» с одинаковым значением атрибута «код». Атрибут «Предмет.код» в этом случае выступает в качестве идентификатора агрегата.
Изображение ключей агрегатов на диаграмме модели такое же как при изображении первичного ключа сущности — с помощью квадратиков на выносных линиях. На рис. 1.6 атрибут «Студент.код» помечен символом ключа; это ключ сущности, запрещающий возможность любых двух студентов с одинаковым кодом. Атрибут «Студент.Предмет.код» также помечен символом ключа; это ключ агрегата «Предмет», запрещающий в любом экземпляре сущности «Студент» возможность двух экземпляров «Предмета» с одним и тем же кодом. Наконец, атрибут «Студент.Предмет.Сдача.нпп» — номер по порядку попытки сдачи данным студентом данного предмета2 — тоже является ключом; это ключ агрегата «Сдача», запрещающий в любом экземпляре агрегата «Предмет» возможность двух экземпляров «Сдачи» с одинаковым «нпп».
Иерархический идентификатор/ключ агрегата — это последовательность идентификаторов/ключей, однозначно идентифицирующая экземпляр агрегата, первым в которой стоит идентификатор/ключ сущности, а далее в порядке старшинства следуют идентификаторы/ключи вложенных многозначных агрегатов. Например, последовательность «Студент.код, Предмет.код, Сдача.нпп» есть иерархический ключ агрегата «Сдача» в модели на рис. 1.6. Первая компонента иерархического ключа селектирует одного из студентов, вторая — один из предметов, сдававшихся этим студентом, третья — одну из попыток сдачи предмета студентом.
1Множество (set) – неупорядоченная совокупность отличных друг от друга элементов
2Применение термина «первичный» предполагает, что должны существовать и «вторичные» (а может быть «третичные» и т.д.) ключи. Вторичным ключом (Secondary Key) называют атрибут или совокупность атрибутов, используемых для неуникального доступа к экземплярам сущности. Например, в запросе на извлечение экземпляров сущности «Студент», получивших отличные оценки по физике, атрибуты «Предмет.оцен» и «Предмет.назв» выступают в роли вторичного ключа, а в результате может быть извлечено множество экземпляров. Термин «третичный ключ», как нам известно, еще никем не использовался.
2 Нам пришлось ввести этот атрибут (ср. рис. 1.4) для того, чтобы можно было однозначно идентифицировать экземпляры «Сдачи», поскольку, вообще говоря, некоторый студент может сделать несколько попыток сдать некоторый предмет в один и тот же день с одним и тем же результатом.