Устранение избыточности в базах данных SQL: нормализация, ключи и представления

«Избыточность в SQL» означает наличие дублированных или повторяющихся данных в базе данных. Избыточность может отрицательно повлиять на производительность базы данных, требования к хранению и целостность данных. Вот несколько методов, обычно используемых для устранения избыточности в SQL, а также примеры кода:

  1. Нормализация.
    Нормализация — это процесс организации данных в базе данных для устранения избыточности и минимизации аномалий данных. Он предполагает разделение базы данных на несколько таблиц и установление связей между ними с использованием первичных и внешних ключей.

Пример:
Предположим, у нас есть таблица «Клиенты» с избыточной адресной информацией:

Customers Table:
---------------------------------
|  CustomerID  |  Name  |  Address  |
---------------------------------
|      1       |  John  |  Addr1    |
---------------------------------
|      2       |  Jane  |  Addr2    |
---------------------------------
|      3       |  Lisa  |  Addr1    |
---------------------------------

Чтобы убрать избыточность, мы можем создать отдельную таблицу «Адреса»:

Customers Table:
---------------------
|  CustomerID  |  Name  |
---------------------
|      1       |  John  |
---------------------
|      2       |  Jane  |
---------------------
|      3       |  Lisa  |
---------------------
Addresses Table:
----------------
|  AddressID  |
----------------
|      1      |
----------------
|      2      |
----------------
CustomerAddresses Table:
----------------------------
|  CustomerID  |  AddressID  |
----------------------------
|      1       |      1      |
----------------------------
|      2       |      2      |
----------------------------
|      3       |      1      |
----------------------------
  1. Первичные и внешние ключи.
    Первичные ключи уникально идентифицируют каждую запись в таблице, а внешние ключи устанавливают связи между таблицами. Используя первичные и внешние ключи, можно избежать избыточных данных.

Пример:
Предположим, у нас есть две таблицы: «Заказы» и «Клиенты», и мы хотим избежать дублирования информации о клиентах в таблице «Заказы»:

Customers Table:
---------------------
|  CustomerID  |  Name  |
---------------------
|      1       |  John  |
---------------------
|      2       |  Jane  |
---------------------
Orders Table:
-------------------------------
|  OrderID  |  CustomerID  |
-------------------------------
|     101   |      1      |
-------------------------------
|     102   |      2      |
-------------------------------

Здесь столбец «CustomerID» в таблице «Заказы» служит внешним ключом, ссылающимся на столбец «CustomerID» в таблице «Клиенты».

  1. Представления.
    Представления — это виртуальные таблицы, полученные на основе результата запроса. Их можно использовать для устранения избыточности за счет упрощенного и абстрактного представления данных.

Пример:
Предположим, у нас есть таблица «Сотрудники» с избыточной информацией о зарплатах сотрудников:

Employees Table:
----------------------------
|  EmployeeID  |  Salary   |
----------------------------
|      1       |  50000    |
----------------------------
|      2       |  60000    |
----------------------------
|      3       |  50000    |
----------------------------

Мы можем создать представление, вычисляющее среднюю зарплату:

CREATE VIEW AverageSalary AS
SELECT AVG(Salary) AS AvgSalary
FROM Employees;

Теперь вместо прямого доступа к таблице «Сотрудники» мы можем запросить представление, чтобы получить среднюю зарплату:

SELECT * FROM AverageSalary;

Этот подход позволяет избежать избыточности за счет расчета средней зарплаты на лету.