количество кортежей в отношении
Нормализация отношений. Первая и вторая нормальные формы
Предисловие
Нормализация отношений (таблиц) — одна из основополагающих частей теории реляционных баз данных. Нормализация имеет своей целью избавиться от избыточности в отношениях и модифицировать их структуру таким образом, чтобы процесс работы с ними не был обременён различными посторонними сложностями. При игнорировании такого подхода эффективность проектирования стремительно снижается, что вкупе с прочими подобными вольностями может привести к критическим последствиям.
Любому специалисту, по роду своей деятельности так или иначе связанному с проектированием реляционных баз данных, полезно понимать и уметь осуществить нормализацию отношений. И этим постом хотелось бы начать небольшую серию публикаций, посвящённых нормальным формам, имеющую целью дать тем читателям Хабрахабра, которые по различным обстоятельствам ещё не освоили эту тему, возможность легко заполнить этот пробел в знаниях.
Статья не имеет своей целью подробное и точное изложение принципов нормализациии, поскольку это, очевидно, невозможно в рамках блога в силу больших объёмов информации, необходимых для публикации при таком подходе. Кроме этого, для такой цели существует большое количество литературы, написанной прекрасными специалистами. Моя же задача, как я считаю, заключается в том, чтобы популярно продемонстрировать и объяснить основные принципы.
Используемые термины
Атрибут — свойство некоторой сущности. Часто называется полем таблицы.
Домен атрибута — множество допустимых значений, которые может принимать атрибут.
Кортеж — конечное множество взаимосвязанных допустимых значений атрибутов, которые вместе описывают некоторую сущность (строка таблицы).
Отношение — конечное множество кортежей (таблица).
Схема отношения — конечное множество атрибутов, определяющих некоторую сущность. Иными словами, это структура таблицы, состоящей из конкретного набора полей.
Проекция — отношение, полученное из заданного путём удаления и (или) перестановки некоторых атрибутов.
Функциональная зависимость между атрибутами (множествами атрибутов) X и Y означает, что для любого допустимого набора кортежей в данном отношении: если два кортежа совпадают по значению X, то они совпадают по значению Y. Например, если значение атрибута «Название компании» — Canonical Ltd, то значением атрибута «Штаб-квартира» в таком кортеже всегда будет Millbank Tower, London, United Kingdom. Обозначение:
Первая нормальная форма
Отношение находится в первой нормальной форме (сокращённо 1НФ), если все его атрибуты атомарны, то есть если ни один из его атрибутов нельзя разделить на более простые атрибуты, которые соответствуют каким-то другим свойствам описываемой сущности.
Будем называть исходное отношение основным, а значение неатомарного атрибута — подчинённым.
Для того, чтобы нормализовать исходное отношение, атрибуты которого неатомарны, необходимо объединить схемы основного и подчинённого отношений. Кроме того, если, например, таблица, соответствующая ненормализованному отношению уже содержится в БД и заполнена информацией, задача усложняется тем, что значение неатомарного атрибута может в свою очередь содержать несколько кортежей.
Следует пояснить сказанное на примере. Рассмотрим отношение, имеющее атрибуты «Код сотрудника», «ФИО», «Должность», «Проекты». Очевидно, что один сотрудник может работать над несколькими проектами. Предположим, что проект описывается идентификатором, названием и датой сдачи.
Код сотрудника | ФИО | Должность | Проекты |
1 | Иванов Иван Иванович | Программист | ID: 123; Название: Система управления паровым котлом; Дата сдачи: 30.09.2011 ID: 231; Название: ПС для контроля и оповещения о превышениях ПДК различных газов в помещении; Дата сдачи: 30.11.2011 ID: 321; Название: Модуль распознавания лиц для защитной системы; Дата сдачи: 01.12.2011 |
Легко заметить, что не все атрибуты этого отношения атомарны (неделимы). В частности, атрибут «Проекты» можно разделить на три более простых атрибута: «Код проекта», «Название», «Дата сдачи», а значение этого атрибута для сотрудника Иван Иванович Иванов содержит несколько кортежей — информацию о трёх проектах.
Примечание: с некоторой точки зрения атрибут «ФИО» можно также считать неатомарным и в таком случае его также следует разделить на более простые, как «Фамилия», «Имя», «Отчество».
Результат будет выглядеть так:
Код сотрудника | ФИО | Должность | Код проекта | Название | Дата сдачи |
1 | Иванов Иван Иванович | Программист | 123 | Система управления паровым котлом | 30.09.2011 |
1 | Иванов Иван Иванович | Программист | 231 | ПС для контроля и оповещения о превышениях ПДК различных газов в помещении | 30.11.2011 |
1 | Иванов Иван Иванович | Программист | 321 | Модуль распознавания лиц для защитной системы | 01.12.2011 |
Вторая нормальная форма
Ясно, что отношение, находящееся в 1НФ, также может обладать избыточностью. Для её устранения предназначена вторая нормальная форма. Но прежде чем приступить к её описанию, сначала следует выявить недостатки первой.
Пусть исходное отношение содержит информацию о поставке некоторых товаров и их поставщиках.
Код поставщика | Город | Статус города | Код товара | Количество |
1 | Москва | 20 | 1 | 300 |
1 | Москва | 20 | 2 | 400 |
1 | Москва | 20 | 3 | 100 |
2 | Ярославль | 10 | 4 | 200 |
3 | Ставрополь | 30 | 5 | 300 |
3 | Ставрополь | 30 | 6 | 400 |
4 | Псков | 15 | 7 | 100 |
Заранее известно, что в этом отношении содержатся следующие функциональные зависимости:
< <Код поставщика, Код товара>-> < Количество>,
<Код поставщика>-> <Город>,
<Код поставщика>-> <Статус>,
<Город>-> <Статус>>
Такое разбиение устранило аномалии, описанные выше: можно добавить информацию о поставщике, который ещё не поставлял товар, удалить информацию о поставке без удаления информации о поставщике, а также легко обновить информацию в случае если поставщик переехал в другой город.
Теперь можно сформулировать определение второй нормальной формы, до которого, скорее всего, читатель уже смог догадаться самостоятельно: отношение находится во второй нормальной форме (сокращённо 2НФ) тогда и только тогда, когда оно находится в первой нормальной форме и каждый его неключевой атрибут неприводимо зависим от первичного ключа.
BestProg
Базовые понятия реляционной модели данных
Содержание
Поиск на других ресурсах:
1. Какие есть базовые понятия реляционной модели данных?
Как известно, реляционная модель данных основывается на сохранении данных в виде взаимосвязанных таблиц. Связь между таблицами может быть реализована по некоторому полю и называется отношением (relation).
Реляционная модель данных использует следующие основные понятия:
2. Что такое тип данных в реляционной модели данных?
Тип данных есть характеристикой объекта в языке программирования. Таким объектом может выступать переменная, константа и т.п. Тип данных определяет допустимое множество значений, которые может принимать переменная величина или объект.
В системах управления базами данных тип данных имеет такое самое значение как и языках программирования.
Пример. Пусть задана таблица Worker, описывающая данные о работнике предприятия.
В вышеприведенной таблице целесообразно установить следующий тип данных для каждого поля:
3. Какие типы данных поддерживаются системами управления базами данных?
Современные СУБД поддерживают следующие основные типы данных:
4. Домены в реляционной модели данных
Домен – это множество отдельных допустимых значений данных, которые:
Пример. Пусть дана таблица Worker, описывающая данные о работнике.
В домене «Идентификационный код» допустимыми являются строки из цифр, которые имеют строго 10 разрядов. В домене «Пол» возможны только 2 значения. В домене «Разряд» могут быть целочисленные значения от 1 до 6.
5. Атрибуты в реляционной модели данных
Атрибуты – это столбцы таблицы (поля таблицы). Атрибуты имеют имена. По имени атрибута осуществляется обращение к таблице.
Пример. В таблице Worker (см. п. 4) названия атрибутов следующие:
6. Что такое схема отношения? Что такое схема базы данных?
Схема отношения – это список имен атрибутов отношения с указанием имен типов.
Пример. Для таблицы Worker схема отношения будет приблизительно следующей:
Множество именованных схем отношения, называется схемой базы данных.
7. Что такое степень отношения?
Количество атрибутов в таблице называется степенью отношения. Для примера (см. п. 4) таблицы Worker степень отношения равна 6 (таблица имеет 6 полей).
Унарное отношение – это отношение степени один. Бинарное отношение – это отношение степени два. Тернарное отношение – это отношение степени три. n-арное отношение – это отношение степени n.
8. Что такое кортеж в базах данных?
Кортеж рассматривается для конкретной (данной) схемы отношения. В такой схеме кортеж есть множество пар, которые представлены следующим образом:
где имя_атрибута – имя конкретного атрибута.
Например. Пусть задана таблица Worker с такими данными
Схема отношения для данной таблицы будет следующая:
Тогда кортеж, который отвечает первой строке таблицы Worker будет иметь вид:
Таким самым образом можно определить кортеж, который соответствует второй строке таблицы Worker а также и следующим строкам таблицы.
9. Что называется кардинальным числом или мощностью отношения?
Кардинальное число – это количество кортежей. В таблице Worker (см. п. 8) кардинальное число равно 7. Кардинальное число еще называют мощностью отношения.
10. Что собою представляет пустое значение (NULL) в базе данных?
Существуют случаи, когда в таблице базы данных некоторые значения еще неизвестны на данный момент времени. Такие значения называются пустыми значениями и могут быть заполнены со временем (позже). Для задавания пустых значений, в базе данных используется слово NULL. Системы управления базами данных допускают использования значения NULL для задавания данных, которые могут быть заполнены позже.
Следует заметить, что значение NULL не является нулем и не является пустой строкой.
Например. В таблице Worker (п. 8) возможна ситуация, когда работник еще не имеет разряда. В этом случае в соответствующей ячейке нужно ввести значение NULL. Как только работнику будет присвоен некоторый разряд, значение NULL будет заменено этим новым значением.
11. Что такое ключи отношения? Что такое первичный ключ?
Важным условием любой базы данных есть то, что в ней не должно быть двух одинаковых записей. Или другими словами, в таблице базы данных не должно быть двух кортежей, которые содержат одинаковые значения. Во избежание этой проблемы, используются первичные ключи.
Первичный ключ – это специальное дополнительное поле (атрибут) таблицы, которое создается для обеспечения уникальности идентификации записей таблицы. Основная цель создания первичного ключа – предотвратить дублирование (повторение) записей таблицы.
Например. Пусть дана таблица Worker (см. п.8). Чтобы не повторялись записи, в этой таблице может быть создано дополнительное поле (атрибут) с именем, например, ID_Worker. Тип этого поля может быть выбран как счетчик (counter), который автоматически увеличивается при добавлении новой записи в таблицу.
12. Что такое простой и составной (сложный) ключи?
Простой ключ – это ключ, который содержит только один атрибут (поле). Сложный или составной ключ– это ключ, который содержит несколько атрибутов, то есть состоит из нескольких полей, значения в которых не могут повторяться.
Пример. Пусть дана таблица Student, содержащая данные о студенте. Таблица содержит следующие поля:
Название поля | Тип | Описание |
ID_Student | Целое число, int | Уникальный идентификатор поля, счетчик, первичный ключ, простой ключ |
Num_book | Целое число, int | Номер зачетной книжки |
Name | Строка с 100 символов, char(100) | Фамилия и имя студента |
Course | Целое число, int | Курс, на котором учится студент |
В этой таблице поле ID_Student есть первичным ключом, которое обеспечивает уникальность. Это поле есть счетчиком. При добавлении нового студента в таблицу, значение счетчика увеличивается на некоторое число, как правило на 1. Если удалить студента из таблицы, максимальное значение счетчика уже не уменьшается. Таким образом обеспечивается уникальное число, которое соответствует данному студенту.
В таблице Student составным ключом может быть комбинация полей (атрибутов) ID_Student и Num_book (номер зачетной книжки). Однако, в данной таблице такая комбинация не имеет смысла, поскольку поле ID_Student и без того обеспечивает уникальность.
13. Что такое искусственный (суррогатный) ключ?
Искусственный ключ создается самой СУБД или пользователем. Этот ключ не содержит никакой информации. Искусственный ключ используется для создания уникальных идентификаторов строк. Создание идентификатора строки осуществляется таким образом, что сущность строки описывается полностью. Такой метод позволяет однозначно идентифицировать конкретный элемент (значение).
Система управления базами данных поддерживает искусственный ключ так, что он невидим для пользователя.
14. Что такое естественной ключ?
Естественной ключ базируется на атрибутах (полях), которые имеют смысл. Значение в таких атрибутах (полях) не могут повторяться по своей сущности.
Использование естественных ключей позволяет получить более компактную форму таблиц для представления данных.
Пример 1. В таблице Worker (см. п.8) поле «Идентификационный код» есть уникальным, так как не может быть двух людей с одинаковым идентификационным кодом. Это поле и есть естественном ключом.
Пример 2. В таблице Student поле Num_book (№ зачетной книжки) есть уникальным по своей природе. Не может быть двух студентов с одинаковым номером зачетной книжки.
15. Какие преимущества и недостатки использования естественных ключей?
Преимуществом использования естественных ключей есть то, что они несут информацию, и потому не нужно добавлять в таблицу дополнительных полей. Естественные ключи позволяют избегнуть избыточной (неинформативной) информации, которая используется только для связи между таблицами базы данных.
Основные недостатки естественных ключей:
Основы реляционной алгебры
Реляционная алгебра базируется на теории множеств и является основой логики работы баз данных.
Когда я только изучал устройство баз данных и SQL, предварительное ознакомление с реляционной алгеброй очень помогло дальнейшим знаниям правильно уложиться в голове, и я постараюсь что бы эта статья произвела подобный эффект.
Так что если вы собираетесь начать свое обучение в этой области или вам просто стало интересно, прошу под кат.
Реляционная база данных
Для начала введем понятие реляцинной базы данных, в которой будем выполнять все действия.
Реляционной базой данных называется совокупность отношений, содержащих всю информацию, которая должна хранится в базе. В данном определении нам интересен термин отношение, но пока оставим его без строго определения.
Лучше представим себе таблицу продуктов.
таблица PRODUCTS
ID | NAME | COMPANY | PRICE |
123 | Печеньки | ООО ”Темная сторона” | 190 |
156 | Чай | ООО ”Темная сторона” | 60 |
235 | Ананасы | ОАО ”Фрукты” | 100 |
623 | Томаты | ООО ”Овощи” | 130 |
Таблица состоит из 4х строк, строка в таблице является кортежем в реляционной теории. Множество упорядоченных кортежей называется отношением.
Перед тем как дать определение отношения, введем еще один термин — домен. Домены применительно к таблице это столбцы.
Для ясности, теперь введем строгое определение отношения.
Ключи в отношениях
В отношении требованием является то, что все кортежи должны различаться. Для однозначной идентификации кортежа существует первичный ключ. Первичный ключ это атрибут или набор из минимального числа атрибутов, который однозначно идентифицирует конкретный кортеж и не содержит дополнительных атрибутов.
Подразумевается, что все атрибуты в первичном ключе должны быть необходимыми и достаточными для идентификации конкретного кортежа, и исключение любого из атрибутов в ключе сделает его недостаточным для идентификации.
Например, в такой таблице ключом будет сочетание атрибутов из первого и второго столбца.
COMPANY | DRIVER |
ООО ”Темная сторона” | Владимир |
ООО ”Темная сторона” | Михаил |
ОАО ”Фрукты” | Руслан |
ООО ”Овощи” | Владимир |
Видно, что в организации может быть несколько водителей, и чтобы однозначно идентифицировать водителя необходимо и значение из столбца “Название организации” и из “Имя водителя”. Такой ключ называется составным.
В реляционной БД таблицы взаимосвязаны и соотносятся друг с другом как главные и подчиненные. Связь главной и подчиненнной таблицы осуществляется через первичный ключ (primary key) главной таблицы и внешний ключ ( foreign key ) подчиненной таблицы.
Внешний ключ это атрибут или набор атрибутов, который в главной таблице является первичным ключем.
Этой подготовительной теории будет достаточно для знакомства с основными операциями реляционной алгебры.
Операции реляционной алгебры
Для понимания важно запомнить, что результатом любой операции алгебры над отношениями является еще одно отношение, которое можно потом так же использовать в других операциях.
Создадим еще одну таблицу, которая нам пригодится в примерах.
ID | SELLER |
123 | OOO “Дарт” |
156 | ОАО ”Ведро” |
235 | ЗАО “Овоще База” |
623 | ОАО ”Фирма” |
Условимся, что в этой таблице ID это внешний ключ, связанный с первичным ключом таблицы PRODUCTS.
Для начала рассмотрим самую простую операцию — имя отношения. Её результатом будет такое же отношение, то есть выполнив операцию PRODUCTS, мы получим копию отношения PRODUCTS.
Проекция
Проекция является операцией, при которой из отношения выделяются атрибуты только из указанных доменов, то есть из таблицы выбираются только нужные столбцы, при этом, если получится несколько одинаковых кортежей, то в результирующем отношении остается только по одному экземпляру подобного кортежа.
Для примера сделаем проекцию на таблице PRODUCTS выбрав из нее ID и PRICE.
Синтаксис операции:
π (ID, PRICE) PRODUCTS
В результате этой операции получим отношение:
ID | PRICE |
123 | 190 |
156 | 60 |
235 | 100 |
623 | 130 |
Выборка
Выборка — это операция, которая выделяет множество строк в таблице, удовлетворяющих заданным условиям. Условием может быть любое логическое выражение.
Для примера сделаем выборку из таблицы с ценой больше 90.
Синтаксис операции:
σ (PRICE>90) PRODUCTS
ID | NAME | COMPANY | PRICE |
123 | Печеньки | ООО ”Темная сторона” | 190 |
235 | Ананасы | ОАО ”Фрукты” | 100 |
623 | Томаты | ООО ”Овощи” | 130 |
В условии выборки мы можем использовать любое логическое выражение. Сделаем еще одну выборку с ценой больше 90 и ID товара меньше 300:
σ (PRICE>90 ^ ID π COMPANY σ (PRICE 123 Для примера использования этой операции представим себе необходимость выбрать продавцов с ценами меньше 90. Без произведения необходимо было бы сначала получить ID продуктов из первой таблицы, потом по этим ID из второй таблицы получить нужные имена SELLER, а с использованием произведения будет такой запрос:Печеньки ООО ”Темная сторона” 190 123 OOO “Дарт” 156 Чай ООО ”Темная сторона” 60 156 ОАО ”Ведро” 123 Печеньки ООО ”Темная сторона” 190 156 ОАО ”Ведро” 156 Чай ООО ”Темная сторона” 60 123 OOO “Дарт”