【问题标题】:Does this design confrorm 2NF?这种设计是否符合 2NF?
【发布时间】: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


    【解决方案1】:

    通常(用外行的话来说),一级标准化意味着:

    • 不可能有重复的行。
    • 行或列中没有固有的顺序。
    • 每个“单元格”只包含一条信息。

    对于 2NF,您有一个额外的约束,即每一列都依赖于整个键(直接或间接通过另一个非键列)。

    所以我会说它在这种情况下符合 2NF,因为它符合 1NF 的标准,而且这本书确实取决于作者。

    但是,它仍然不一定是一个好的设计,特别是因为作为一般规则,您应该始终从 3NF 开始。一个更好的解决方案将是全面的:

    books:
        book_id
        title
    authors:
        author_id
        name
    books_and_authors:
        book_id
        author_id
    

    这样,书籍和作者之间就存在多对多(包括零)关系。

    【讨论】:

    • 是的,考虑到它不适应多对多关系,我知道它不是一个好的设计。我上面的问题只是为了澄清我心中的一个问题。谢谢你的帮助。
    【解决方案2】:

    一个表在 2NF 中当且仅当它在 1NF 中并且没有非素数属性依赖于表的任何候选键的任何适当子集(来自 wikipedia)。

    我必须假设你的桌子是 1NF。
    您的候选(和主)键是 book_id 和 author_id。

    您的非主要属性是 titlefirst_namelast_name。这些属性都不依赖于候选键的任何适当子集(这很容易实现,因为它们没有任何子集)。这种设计的唯一问题是外键 book_id 使书籍作者成为 1:1 的关系(即一本书 -> 一位作者。一位作者 -> 一本书)。这可以通过包含 book_idauthor_id

    的新表轻松解决

    1NF(也叫wikipedia):

    • 行没有从上到下的顺序。
    • 列没有从左到右的顺序。
    • 没有重复的行
    • 每个行列交集只包含一个来自适用域的值(仅此而已)。
    • 所有列都是常规的 [即行没有隐藏的组件,例如行 ID、对象 ID 或隐藏的时间戳]。

    这就是我们用来构建关系数据库的方式。

    【讨论】: