4

我正在创建一个数据库,其中包含我拥有并阅读过的书籍。我想跟踪我拥有和阅读的书(或“书名”),以及我拥有和阅读的那本书的版本(或“实体装订纸”)。

书籍和版本是多对多的。我拥有《美国的民主》一书的多个版本。我还拥有一个名为“海明威”的版本,其中包含几本书(或“书名”),其中包括一本名为“为谁敲钟”。

因此,我需要在书籍和版本之间架起一座桥梁。我的桌子是:

Book (book_pk*,title)
Edition (edition_pk*,ISBN,year)
Book_Edition (book_fk,edition_fk)

我相信说 Book_Edition 表包含复合主键是正确的。

现在,我正在处理我的阅读表,其中将包含我已阅读的书籍以及阅读它们的日期。到目前为止,我的阅读表包含:

阅读 (read_pk,date,note)

但是,我现在需要将我的阅读表与我的书籍和版本联系起来。在我看来, book_fk 和 edition_fk 在这种情况下是传递依赖的。那么如何遵守第三范式呢?

选项 1:
将 Read 表修改为:Read (read_pk,date,note,book_fk,edition_fk)

选项 2:
将 Book_Edition 表修改为:Book_Edition (book_edition_pk,book_fk,edition_fk)
将 Read 表修改为:Read (read_pk,date,note,book_edition_fk)

选项3:???

任何见解将不胜感激。抱歉,如果这已在其他地方处理过;我看到了一些看起来很有希望的帖子,但作为一个相对的 n00b,我无法破译它们并将它们应用于我的情况。


每个 sqlvogel 编辑:
让我尝试识别依赖关系——也就是说,我试图识别如果字段 A 发生更改,那么字段 B 必须或可能更改的位置。我认为我觉得这很困难,因为书籍(“书名”和“装订纸集”)本质上是永久性的。我唯一希望编辑标题、ISBN 或年份字段的情况是出现数据输入错误。如果特定 edition_pk 的 ISBN 输入不正确,则同一个 edition_pk 的年份也可能输入不正确,但这是依赖关系吗?

关于读表,我相信情况也差不多。每次阅读一本书时都会创建记录,理论上永远不会编辑。我想确定在特定日期阅读的书籍和版本。如果存在数据输入错误,它可能会影响一个或多个字段。特别是,如果输入了错误的 book_fk,很可能也输入了错误的 edition_fk。同样,这是我应该担心的依赖吗?

在考虑依赖关系时,我还需要考虑其他什么吗?

4

2 回答 2

4

选项 1:阅读 (read_pk,date,note,book_fk,edition_fk)

假设:

{read_pk}->{date,note,book_fk,edition_fk}
{read_pk} is the primary key of Read.

为了举例,假设{book_fk,edition_fk}->{date},意味着每本书只被阅读一次(每本书/版本只有一个日期)。如果您没有{book_fk,edition_fk}在 Read 中创建候选键,那么{book_fk,edition_fk}->{date}将是违反 3NF 的非键依赖的示例,因为行列式不是键。即使您替换{book_edition_fk}. 也是如此{book_fk,edition_fk}。即,就 3NF 而言,您的选项 2 显然与选项 1 相同。

由于您没有指定任何依赖项,因此我只是举了一个例子。我不能说这些依赖项是否是对您情况的正确描述。您自己需要确定哪些依赖项实际上应该在此处生效。

于 2013-09-25T19:42:14.397 回答
-1

传递依赖要求依赖属性是非关键属性。由于您关心的两个属性是外键,因此您的结构中不存在传递依赖问题。

您无需更改原始设计。

于 2013-09-25T02:41:53.683 回答