Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Раздел-2(СУБД).doc
Скачиваний:
18
Добавлен:
01.09.2019
Размер:
981.5 Кб
Скачать

2.8.2. Третья нормальная форма

В таблице, соответствующей третьей нормальной форме (2НФ, Third Normal Form, 2NF), помимо требований для 2НФ, ни одно из неключевых полей таблицы не должно зависеть функционально от любого другого неключевого поля. Что это означает?

На приведенном выше рис. 2.19 показан пример нарушения условий 2НФ, поскольку существует транзитивная функциональная связь непервичного атрибута "Код товара" от ключа "Номер товара в заказе" вида

Наименование товара Код товара Номер товара в заказе

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

На рис. 2.20 представлена таблица 2НФ, в которой проблема скорректирована путем удаления столбцов "Наименование товара" и "Оптовая цена".

Код товара в заказе

Номер заказа

Код товара

1

1

1220

2

1

1405

2

1

1602

4

1

1201

5

1

1000

6

2

2001

7

2

1001

8

2

2245

9

2

2021

10

2

4000

11

1

1220

Рис. 2.20. Фрагмент таблицы из базы данных, находящихся в 2НФ

Чтобы не потерять информацию о кодировке товаров и ценах, создадим дополнительно таблицу "Инвентаризация" (рис. 2.21), в которой можно хранить информацию о наименовании товаров и ценах, и свяжем ее с исходной таблицей по ключевому полю "Код товара". Виды взаимосвязей в моделях данных мы рассмотрим далее.

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

Код товара

Наименование товара

Оптовая цена

1000

Электропила

880

1001

Ключ гаечный

14

1201

Гайки

16

1220

Болты М4

12

1220

Болты М6

12

1405

Молоток

20

1602

Гвозди

10

2001

Напильник

19

2245

Отвертка

15

2021

Стамеска

24

4000

Рубанок

124

Рис. 2.21. Фрагмент таблицы "Инвентаризация"

Номер заказа

Код товара

Наименование товара

Розничная цена

1

1000

Электропила

1100

1

1001

Ключ гаечный

18

1

1201

Гайки

20

1

1220

Болты М4

16

1

1220

Болты М6

16

2

1405

Молоток

25

2

1602

Гвозди

12

2

2001

Напильник

24

2

2245

Отвертка

19

2

2021

Стамеска

20

2

4000

Рубанок

156

Рис. 2.22. Пример выполнения запроса на выборку данных

из двух связанных таблиц

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