1

好的,我有 2 张桌子。具有主键 book_id 和另一个名为 title 的字段的书表。还有一个作者表,主键 author_id 和字段 first_name、last_name 和外键 book_id。

我的设计符合 2NF 吗?

4

2 回答 2

3

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

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

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

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

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

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

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

于 2012-05-15T08:16:01.947 回答
1

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

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

您的非主要属性是titlefirst_namelast_name。这些属性都不依赖于候选键的任何适当子集(这很容易实现,因为它们没有任何子集)。这种设计的唯一问题是外键book_id使 book-author 成为 1:1 的关系(即 One book -> one author. One author -> one book)。这可以很容易地通过一个包含book_idauthor_id的新表来解决

1NF(也是维基百科):

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

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

于 2012-05-15T08:21:29.057 回答