«Избыточность в SQL» означает наличие дублированных или повторяющихся данных в базе данных. Избыточность может отрицательно повлиять на производительность базы данных, требования к хранению и целостность данных. Вот несколько методов, обычно используемых для устранения избыточности в SQL, а также примеры кода:
- Нормализация.
Нормализация — это процесс организации данных в базе данных для устранения избыточности и минимизации аномалий данных. Он предполагает разделение базы данных на несколько таблиц и установление связей между ними с использованием первичных и внешних ключей.
Пример:
Предположим, у нас есть таблица «Клиенты» с избыточной адресной информацией:
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 |
----------------------------
- Первичные и внешние ключи.
Первичные ключи уникально идентифицируют каждую запись в таблице, а внешние ключи устанавливают связи между таблицами. Используя первичные и внешние ключи, можно избежать избыточных данных.
Пример:
Предположим, у нас есть две таблицы: «Заказы» и «Клиенты», и мы хотим избежать дублирования информации о клиентах в таблице «Заказы»:
Customers Table:
---------------------
| CustomerID | Name |
---------------------
| 1 | John |
---------------------
| 2 | Jane |
---------------------
Orders Table:
-------------------------------
| OrderID | CustomerID |
-------------------------------
| 101 | 1 |
-------------------------------
| 102 | 2 |
-------------------------------
Здесь столбец «CustomerID» в таблице «Заказы» служит внешним ключом, ссылающимся на столбец «CustomerID» в таблице «Клиенты».
- Представления.
Представления — это виртуальные таблицы, полученные на основе результата запроса. Их можно использовать для устранения избыточности за счет упрощенного и абстрактного представления данных.
Пример:
Предположим, у нас есть таблица «Сотрудники» с избыточной информацией о зарплатах сотрудников:
Employees Table:
----------------------------
| EmployeeID | Salary |
----------------------------
| 1 | 50000 |
----------------------------
| 2 | 60000 |
----------------------------
| 3 | 50000 |
----------------------------
Мы можем создать представление, вычисляющее среднюю зарплату:
CREATE VIEW AverageSalary AS
SELECT AVG(Salary) AS AvgSalary
FROM Employees;
Теперь вместо прямого доступа к таблице «Сотрудники» мы можем запросить представление, чтобы получить среднюю зарплату:
SELECT * FROM AverageSalary;
Этот подход позволяет избежать избыточности за счет расчета средней зарплаты на лету.