Загрузка данных


Хорошо, сделаю только Вариант 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 (Книги).