Sobes.tech
Middle
146
questionbank

Как можно оптимизировать базу данных с помощью нормализации?

Answer from AI

sobes.tech AI

Нормализация — это процесс структурирования реляционной базы данных для снижения избыточности и улучшения целостности данных. Основные формы нормализации (1NF, 2NF, 3NF) направлены на устранение аномалий вставки, обновления и удаления.

1NF (Первая нормальная форма):

  • Каждый столбец должен содержать только атомарные (неделимые) значения.
  • Каждая строка должна быть уникальной.

2NF (Вторая нормальная форма):

  • Соответствует 1NF.
  • Все неключевые атрибуты должны полностью зависеть от полного первичного ключа (для составных ключей).

3NF (Третья нормальная форма):

  • Соответствует 2NF.
  • Все неключевые атрибуты не должны иметь транзитивной функциональной зависимости от первичного ключа (поле не должно зависеть от другого неключевого поля).

Пример: Таблица заказов без нормализации.

ИдЗаказа ДатаЗаказа ИдКлиента ИмяКлиента АдресКлиента НазваниеТовара ЦенаТовара Количество
1 2023-10-27 101 Иванов Москва Ноутбук 50000 1
2 2023-10-27 102 Петров Санкт-Петербург Мышь 1000 2
1 2023-10-27 101 Иванов Москва Клавиатура 3000 1

Здесь есть избыточность данных клиента и аномалии обновления (при изменении адреса клиента нужно обновить несколько строк).

После 3NF нормализации:

Таблица "Заказы":

ИдЗаказа ДатаЗаказа ИдКлиента
1 2023-10-27 101
2 2023-10-27 102

Таблица "Клиенты":

ИдКлиента ИмяКлиента АдресКлиента
101 Иванов Москва
102 Петров Санкт-Петербург

Таблица "ДеталиЗаказа":

ИдДеталиЗаказа ИдЗаказа ИдТовара Количество
1 1 201 1
2 2 202 2
3 1 203 1

Таблица "Товары":

ИдТовара НазваниеТовара ЦенаТовара
201 Ноутбук 50000
202 Мышь 1000
203 Клавиатура 3000

Это уменьшает избыточность, упрощает обновления и вставки, а также улучшает целостность данных.

Недостатки нормализации:

  • Увеличение сложности запросов (требуется больше JOIN'ов).
  • Возможно снижение производительности для определенных запросов (требующих JOIN'ов).

Оптимизация с помощью C# при работе с нормализованной БД включает использование ORM (Entity Framework, Dapper) для эффективного маппинга данных между объектами C# и таблицами БД, оптимизацию запросов LINQ, использование eager/lazy loading в ORM, а также кеширование данных на стороне приложения для уменьшения обращений к БД.