这个设计是否与2NF相混淆?

时间:2012-05-15 08:08:55

标签: database oracle database-design normalization database-normalization

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

我的设计是否符合2NF?

2 个答案:

答案 0 :(得分:3)

一般而言(以外行人的名义),第一级的标准化意味着:

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

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

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

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

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

这样,你就会在书籍和作者之间建立多对多(包括零)的关系。

答案 1 :(得分:1)

  

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

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

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

的新表轻松修复

1NF(也wikipedia):

  • 这些行没有自上而下的排序。
  • 列中没有从左到右的排序。
  • 没有重复的行
  • 每个行 - 列交集都只包含适用域中的一个值(而不是其他任何内容)。
  • 所有列都是常规的[即行没有隐藏的组件,如行ID,对象ID或隐藏的时间戳]。

我们如何使用它来构建关系数据库。