Предъявим кому-нибудь эту таблицу и не сообщим смысл
наименований атрибутов. Очевидно, что невозможно судить, не понимая смысла
данных, может или не может в этом отношении появиться, например, кортеж (1, Петров, 3000). Если бы, кстати, такой кортеж появился (что, на первый взгляд, вполне возможно, т.к. не нарушается уникальность кортежей), то мы точно смогли
бы сказать, что не является альтернативным ключом - ни один из атрибутов по
отдельности. Но мы не сможем сказать, что же является первичным ключом[9]
.
Потенциальные ключи служат средством идентификации
объектов предметной области, данные о которых хранятся в отношении. Объекты
предметной области должны быть различимы.
Потенциальные ключи служат единственным средством
адресации на уровне кортежей в отношении. Точно указать какой-нибудь кортеж
можно только зная значение его потенциального ключа.
Т.к. потенциальные ключи фактически служат
идентификаторами объектов предметной области (т.е. предназначены для различения
объектов), то значения этих идентификаторов не могут содержать неизвестные
значения. Действительно, если бы идентификаторы могли содержать null-значения, то мы не могли бы дать ответ "да" или "нет" на вопрос, совпадают или нет два идентификатора.
Это определяет следующее правило целостности
сущностей:
Атрибуты, входящие в состав некоторого потенциального
ключа не могут принимать null-значений.
2.3 Внешние ключи и их
целостность
Различные объекты предметной области, информация о
которых хранится в базе данных, всегда взаимосвязаны друг с другом. Например, накладная на поставку товара содержит список товаров с количествами и ценами, сотрудник предприятия имеет детей, числится в подразделении и т.д. Термины
"содержит", "имеет", "числится" отражают взаимосвязи
между понятиями "накладная" и "список товаров", "сотрудник" и "дети", "сотрудник" и
"подразделение". Такие взаимосвязи отражаются в реляционных базах
данных при помощи внешних ключей, связывающих несколько отношений.
Рассмотрим пример с поставщиками и поставками деталей.
Предположим, что нам требуется хранить информацию о наименовании поставщиков, наименовании и количестве поставляемых ими деталей, причем каждый поставщик
может поставлять несколько деталей и каждая деталь может поставляться несколькими
поставщиками. Можно предложить хранить данные в следующем отношение (
Приложение 2).
Потенциальным ключом этого отношения может выступать
пара атрибутов {"Номер поставщика", "Номер детали"} - в
таблице они выделены курсивом.
Приведенный способ хранения данных обладает рядом
недостатков.
Что произойдет, если изменилось наименование
поставщика? Т.к. наименование поставщика повторяется во многих кортежах
отношения, то это наименование нужно одновременно изменить во всех кортежах, где оно встречается, иначе данные станут противоречивыми. То же самое с
наименованиями деталей. Значит, данные хранятся в нашем отношении с большой
избыточностью.
Далее, как отразить факт, что некоторый поставщик, например Петров, временно прекратил поставки деталей? Если мы удалим все
кортежи, в которых хранится информация о поставках этого поставщика, то мы
потеряем данные о самом Петрове как потенциальном поставщике. Выйти из этого
положения, оставив в отношении кортеж типа (2, Петров, NULL, NULL, NULL) мы не
можем, т.к. атрибут "Номер детали" входит в состав потенциального
ключа и не может содержать null-значений. То же самое произойдет, если
некоторая деталь временно не поставляется никаким поставщиком. Получается, что
мы не можем хранить информацию о том, что есть некий поставщик, если он не
поставляет хотя бы одну деталь, и не можем хранить информацию о том, что есть
некоторая деталь, если она никем не поставляется.
Подобные проблемы возникают потому, что мы смешали в
одном отношении различные объекты предметной области - и данные о поставщиках, и данные о деталях, и данные о поставках деталей. Говорят, что это отношение
плохо нормализовано (просто нормализованным оно является хотя бы потому, что
оно есть отношение и, следовательно, автоматически находится в 1НФ).
О том, как правильно нормализовать отношения, будет
сказано в следующих главах, сейчас же предложим разнести данные по трем
отношениям - "Поставщики", "Детали", "Поставки".
Для нас важно выяснить, каким образом данные, хранящиеся в этих отношениях
взаимосвязаны друг с другом. Эта связь определяется семантикой предметной
области и описывается фразами: "Поставщики выполняют Поставки", "Детали поставляются через Поставки". Эти две взаимосвязи косвенно
определяют новую взаимосвязь между "Поставщиками" и
"Деталями": "Детали поставляются Поставщиками".
Эти фразы отражают различные типы взаимосвязей. Чтобы
более точно отразить предметную область, можно иначе переформулировать фразы:
"Один Поставщик может выполнять несколько Поставок", "Одна
Деталь может поставляться несколькими Поставками". Это пример взаимосвязи
типа "один-ко-многим". Взаимосвязь между "Поставщиками" и
"Деталями" можно переформулировать так: "Несколько Деталей может
поставляться несколькими Поставщиками". Это пример взаимосвязи типа
"много-ко-многим".
В реляционных базах данных основными являются
взаимосвязи типа "один-ко-многим". Взаимосвязи типа
"много-ко-многим" реализуются использованием нескольких взаимосвязей
типа "один-ко-многим". Отношение, входящее в связь со стороны
"один" (например, "Поставщики"), называют родительским
отношением. Отношение, входящее в связь со стороны "много" (например, "Поставки"), называется дочернем отношением.
Рекомендуем скачать другие рефераты по теме: организация реферат, шпаргалки по математике.