Хорошо, сделаю только Вариант 1 (Книги) полностью.
---
Вариант 1. Нормализация таблицы Книги до 3НФ
Исходная таблица
ID Книги Название Автор Страна Автора Издательство Город Издательства
1а Война и мир Толстой Россия Эксмо Москва
2а Анна Каренина Толстой Россия Азбука СПб
Заданные зависимости:
· Книга → Автор
· Автор → Страна Автора
· Издательство → Город Издательства
---
1. Анализ
Первичный ключ: ID Книги
Проблемы:
1. Транзитивная зависимость:
ID Книги → Автор → Страна Автора
(Страна Автора зависит не напрямую от ключа, а через Автора)
2. Транзитивная зависимость:
ID Книги → Издательство → Город Издательства
3. Избыточность:
Если у автора несколько книг, его страна повторяется многократно
---
2. Приведение к 3НФ (новая структура)
Схема после нормализации:
```
Авторы (AuthorID, Имя_Автора, Страна)
↑
│
Книги (ID_Книги, Название, AuthorID, PublisherID)
│
↓
Издательства (PublisherID, Название, Город)
```
Три таблицы:
· Authors — справочник авторов
· Publishers — справочник издательств
· Books — основная таблица книг (ссылается на оба справочника)
---
3. SQL-скрипты
```sql
-- =============================================
-- 1. Создание таблиц (3НФ)
-- =============================================
-- Справочник авторов
CREATE TABLE Authors (
AuthorID INT PRIMARY KEY AUTO_INCREMENT,
AuthorName VARCHAR(100) NOT NULL UNIQUE,
Country VARCHAR(100) NOT NULL
);
-- Справочник издательств
CREATE TABLE Publishers (
PublisherID INT PRIMARY KEY AUTO_INCREMENT,
PublisherName VARCHAR(100) NOT NULL UNIQUE,
City VARCHAR(100) NOT NULL
);
-- Основная таблица книг
CREATE TABLE Books (
BookID VARCHAR(10) PRIMARY KEY,
Title VARCHAR(200) NOT NULL,
AuthorID INT NOT NULL,
PublisherID INT NOT NULL,
FOREIGN KEY (AuthorID) REFERENCES Authors(AuthorID),
FOREIGN KEY (PublisherID) REFERENCES Publishers(PublisherID)
);
-- =============================================
-- 2. Перенос данных (исходная таблица называлась OldBooks)
-- =============================================
-- Заполнение Authors
INSERT INTO Authors (AuthorName, Country)
SELECT DISTINCT Автор, `Страна Автора`
FROM OldBooks;
-- Заполнение Publishers
INSERT INTO Publishers (PublisherName, City)
SELECT DISTINCT Издательство, `Город Издательства`
FROM OldBooks;
-- Заполнение Books (связываем через JOIN)
INSERT INTO Books (BookID, Title, AuthorID, PublisherID)
SELECT
o.`ID Книги`,
o.Название,
a.AuthorID,
p.PublisherID
FROM OldBooks o
JOIN Authors a ON o.Автор = a.AuthorName
JOIN Publishers p ON o.Издательство = p.PublisherName;
-- =============================================
-- 3. Очистка (удаление старой таблицы)
-- =============================================
DROP TABLE OldBooks;
```
---
4. Проверка зависимостей после нормализации
Зависимость Где устранена
Книга → Автор Осталась в Books через AuthorID (внешний ключ)
Автор → Страна Вынесена в отдельную таблицу Authors
Издательство → Город Вынесена в отдельную таблицу Publishers
✅ Транзитивные зависимости устранены. Достигнута 3НФ.
---
5. Пример данных после нормализации
Authors:
AuthorID AuthorName Country
1 Толстой Россия
Publishers:
PublisherID PublisherName City
1 Эксмо Москва
2 Азбука СПб
Books:
BookID Title AuthorID PublisherID
1а Война и мир 1 1
2а Анна Каренина 1 2
---
Это полное решение для Варианта 1 (Книги).