我正在创建一个数据库,其中包含我拥有并阅读过的书籍。我想跟踪我拥有和阅读的书(或“书名”),以及我拥有和阅读的那本书的版本(或“实体装订纸”)。
书籍和版本是多对多的。我拥有《美国的民主》一书的多个版本。我还拥有一个名为“海明威”的版本,其中包含几本书(或“书名”),其中包括一本名为“为谁敲钟”。
因此,我需要在书籍和版本之间架起一座桥梁。我的桌子是:
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。同样,这是我应该担心的依赖吗?
在考虑依赖关系时,我还需要考虑其他什么吗?