【发布时间】:2025-12-20 08:20:15
【问题描述】:
好的,我有 2 张桌子。具有主键 book_id 和另一个名为 title 的字段的书表。还有一个作者表,主键 author_id 和字段 first_name、last_name 和外键 book_id。
我的设计符合 2NF 吗?
【问题讨论】:
标签: database oracle database-design normalization database-normalization
好的,我有 2 张桌子。具有主键 book_id 和另一个名为 title 的字段的书表。还有一个作者表,主键 author_id 和字段 first_name、last_name 和外键 book_id。
我的设计符合 2NF 吗?
【问题讨论】:
标签: database oracle database-design normalization database-normalization
通常(用外行的话来说),一级标准化意味着:
对于 2NF,您有一个额外的约束,即每一列都依赖于整个键(直接或间接通过另一个非键列)。
所以我会说它在这种情况下符合 2NF,因为它符合 1NF 的标准,而且这本书确实取决于作者。
但是,它仍然不一定是一个好的设计,特别是因为作为一般规则,您应该始终从 3NF 开始。一个更好的解决方案将是全面的:
books:
book_id
title
authors:
author_id
name
books_and_authors:
book_id
author_id
这样,书籍和作者之间就存在多对多(包括零)关系。
【讨论】:
一个表在 2NF 中当且仅当它在 1NF 中并且没有非素数属性依赖于表的任何候选键的任何适当子集(来自 wikipedia)。
我必须假设你的桌子是 1NF。
您的候选(和主)键是 book_id 和 author_id。
您的非主要属性是 title、first_name 和 last_name。这些属性都不依赖于候选键的任何适当子集(这很容易实现,因为它们没有任何子集)。这种设计的唯一问题是外键 book_id 使书籍作者成为 1:1 的关系(即一本书 -> 一位作者。一位作者 -> 一本书)。这可以通过包含 book_id 和 author_id
的新表轻松解决1NF(也叫wikipedia):
这就是我们用来构建关系数据库的方式。
【讨论】: