Безопасность систем баз данных
7 Лекция: Нормализация. Связывание таблиц (связь один ко многим). Внешние ключи. Ограничение доступа к таблицам.
- Реляционные базы данных (http://ru.wikipedia.org/wiki/Реляционная_база_данных).
- Язык SQL (http://ru.wikipedia.org/wiki/SQL).
- Нормальная форма (http://ru.wikipedia.org/wiki/Нормальная_форма).
Нормальная форма
свойство отношения (связи) в реляционной модели данных, характеризующее его с точки зрения избыточности (повторяются одни и те-же данные ), потенциально приводящей к логически ошибочным результатам выборки или изменения данных.
Процесс преобразования отношений базы данных к виду, отвечающему нормальным формам, называется нормализацией.
Преимущества которые дает нормализация:
- Уменьшение записей в таблицах (экономия места на диске)
- Построение логической структуры, вместо большой таблицы, создаются небольшие таблицы связанные между собой.
- Более удобное управление доступом (например: оператору можно дать доступ только к его таблице).
Первые три нормальные формы (кратко):
- 1 НФ - оставляют только одно значение в строке для каждого столбца.
- 2 НФ - оставляют только столбцы функционально зависимые от потенциального составного ключа целиком, а не от части ключа.
- 3 НФ - оставляют только столбцы напрямую функционально зависимые от потенциального ключа.
Приведение к 1 НФ:
Не приведенная таблица (исходная)
Организация Город Адрес email WWW Вид Конт. лица Поршневой з-д Казань Ул. 2-я Кольцевая, 17 info@plunger.ru www.plunger.ru Поставщик Иванов, зам. дир., тел (3254)76-15-95Петров, нач. отд. сбыта, тел (3254)76-15-35 ООО Вымпел Курск Ул. Гоголя, 25 pennon@mail.ru Клиент Сидоров, директор, тел. (7634)66-65-38 ИЧП Альфа Казань Ул. Пушкинская, 37, оф. 565 alpha323@list.ru Клиент Васильев, директор, тел (3254)74-57-45
Устраняем проблему множества значений в первой строке "Иванов И.И., зам. дир., тел (3254)76-15-95" и "Петров П.П., нач. отд. сбыта, тел (3254)76-15-35".
Проблема в том, что, например, при удалении одного контактного лица из двух, нужно писать специальный код для этого.
Разбиваем на отдельные строки.
Организация Город Адрес email WWW Вид Конт. лица Поршневой з-д Казань Ул. 2-я Кольцевая, 17 info@plunger.ru www.plunger.ru Поставщик Иванов, зам. дир., тел (3254)76-15-95 Поршневой з-д Казань Ул. 2-я Кольцевая, 17 info@plunger.ru www.plunger.ru Поставщик Петров, нач. отд. сбыта, тел (3254)76-15-35 ООО Вымпел Курск Ул. Гоголя, 25 pennon@mail.ru Клиент Сидоров, директор, тел. (7634)66-65-38 ИЧП Альфа Казань Ул. Пушкинская, 37, оф. 565 alpha323@list.ru Клиент Васильев, директор, тел (3254)74-57-45
Теперь удаляется просто строка.
Устраняем проблему множества значений в ячейках последнего столбца (ФИО должность и телефон) "Иванов И.И.", "зам. дир." "тел (3254)76-15-95".
Проблема в том, что, например, при изменении одного из трех, нужно писать специальный код для этого.
Разбиваем на отдельные столбцы.
Организация Город Адрес email WWW Вид Должность Фамилия Код города Тел. Поршневой з-д Казань Ул. 2-я Кольцевая, 17 info@plunger.ru www.plunger.ru Поставщик зам. дир. Иванов 8432 76-15-95 Поршневой з-д Казань Ул. 2-я Кольцевая, 17 info@plunger.ru www.plunger.ru Поставщик нач. отд. сбыта Петров 8432 76-15-35 ООО Вымпел Курск Ул. Гоголя, 25 pennon@mail.ru Клиент директор Сидоров 7634 66-65-38 ИЧП Альфа Казань Ул. Пушкинская, 37, оф. 565 alpha323@list.ru Клиент директор Васильев 8432 74-57-45
Таблица приведена к 1НФ.
Но повторяющиеся значения в таблице, являются потенциальным источником проблем.
1) при вводе их значений легко ошибиться. Например, ошибиться всего одну букву в поле "Город", "Казань" и "казань" это разные города, а некоторые могут и "Kazan" и "kazan" написать. В ранних версиях сайта "Одноклассники" так и было.
2) название города или улицы может измениться, Тогда придется изменять все записи.
3) не эффективное использование диска. Много раз повторяются одни и те же: Города, улицы и т.д.
Приведение к 2 НФ:
Находится в 1НФ, и при этом все неключевые атрибуты зависят только от потенциального составного ключа целиком, а не от его части.
Предположим, что наименование предприятия является уникальным в каждом городе, но в разных городах названия могут совпадать. Предприятие определяется потенциальным ключом "Организация+Город".
Приведем таблицу к 2НФ.
"Код города" зависит от самого города, но не от названия предприятия.
"Код города" повторяется много раз, это избыточность.
Устранить эту избыточность можно выведя "Код города" в отдельную таблицу:
Организация Город Адрес Эл. почта WWW Вид Должность Ф.И.О. Тел. Поршневой з-д Казань Ул. 2-я Кольцевая, 17 info@plunger.ru www.plunger.ru Поставщик зам. дир. Иванов И.И. 76-15-95 Поршневой з-д Казань Ул. 2-я Кольцевая, 17 info@plunger.ru www.plunger.ru Поставщик нач. отд. сбыта Петров П.П., 76-15-35 ООО Вымпел Курск Ул. Гоголя, 25 pennon@mail.ru Клиент директор Сидоров С.С. 66-65-38 ИЧП Альфа Казаньр Ул. Пушкинская, 37, оф. 565 alpha323@list.ru Клиент директор Васильев В.В. 74-57-45
Город Код города Казань 8432 Курск 7634
Кроме этого такое разделение позволяет повысить безопасность данных. Т.к. доступ оператору для внесения кодов городов можно дать только к таблице с кодами, а клиентам не надо вводить код города, что исключает ошибки при вводе.
Приведение к 3 НФ:
Находится в 2НФ, и оставляют только столбцы напрямую функционально зависимые от потенциального ключа, и необходимо устранить функциональные зависимости между неключевыми атрибутами отношения.
Присутствует функциональная зависимость между неключевыми атрибутами "Ф.И.О.", "Тел.", от ключа они зависят через "Должность".
"Должность" и связанные с ней атрибуты вынесем в отдельную таблицу.
Первая из них хранит информацию о самом предприятии:
Организация Город Адрес Эл. почта WWW Вид Поршневой з-д Казань Ул. 2-я Кольцевая, 17 info@plunger.ru www.plunger.ru Поставщик ООО Вымпел Курск Ул. Гоголя, 25 pennon@mail.ru Клиент ИЧП Альфа Казань Ул. Пушкинская, 37, оф. 565 alpha323@list.ru Клиент
Вторая таблица хранит "Должность" на предприятии и связанные с ней атрибуты:
Организация Город Ф.И.О. Должность Тел. Поршневой з-д Казань Иванов И.И. зам. дир. 76-15-95 Поршневой з-д Казань Петров П.П., нач. отд. сбыта 76-15-35 ООО Вымпел Курск Сидоров С.С. директор 66-65-38 ИЧП Альфа Казань Васильев В.В. директор 74-57-45
Связывание двух таблиц (связь один ко многим).
Т.к. таблицу при нормализации разбивают на несколько таблиц, необходимо связать данные этих таблиц.