Хорошо, у меня есть 2 таблицы. Таблица книг с первичным ключом book_id и другим полем с названием title. И таблица авторов с первичным ключом author_id и полями first_name, last_name и внешним ключом book_id.
Соответствует ли мой дизайн 2NF?
Хорошо, у меня есть 2 таблицы. Таблица книг с первичным ключом book_id и другим полем с названием title. И таблица авторов с первичным ключом author_id и полями first_name, last_name и внешним ключом book_id.
Соответствует ли мой дизайн 2NF?
Как правило (и с точки зрения непрофессионала), нормализация на первом уровне означает:
Для 2NF у вас есть дополнительное ограничение, заключающееся в том, что каждый столбец зависит от всего ключа (напрямую или косвенно через другой неключевой столбец).
Так что я бы сказал, что в данном случае она соответствует 2NF, поскольку она соответствует критериям 1NF, и книга действительно зависит от автора.
Тем не менее, это все еще не обязательно хороший дизайн, тем более что вы всегда должны начинать с 3NF, как правило. Лучшим решением было бы полномасштабное:
books:
book_id
title
authors:
author_id
name
books_and_authors:
book_id
author_id
Таким образом, между книгами и авторами возникает связь «многие ко многим» (включая нулевую).
Таблица находится во 2НФ тогда и только тогда, когда она находится в 1НФ и ни один непервичный атрибут не зависит ни от какого правильного подмножества любого возможного ключа таблицы (из википедия).
Я должен предположить, что ваша таблица находится в 1NF.
Ваши потенциальные (и первичные) ключи — это book_id и author_id.
Ваши непростые атрибуты: title, first_name и last_name. Ни один из этих атрибутов не зависит от какого-либо надлежащего подмножества ключей-кандидатов (что легко реализовать, поскольку у них нет никаких подмножеств). Единственная проблема с этим дизайном заключается в том, что внешний ключ book_id устанавливает отношение книга-автор 1:1 (т. е. одна книга -> один автор. один автор -> одна книга). Это можно легко исправить с помощью новой таблицы, содержащей book_id и author_id.
1NF (также википедия):
Именно так мы привыкли создавать реляционные базы данных.