3NF一对一关系争议

3NF one-to-one relationship controversy

我 运行 在尝试使用 3NF 设计数据库时遇到了问题。 3NF 中的数据库具有以下特征: - 它是第二范式。 -它的table只包含非传递依赖于主键的列

我在网上看到很多人声称,如果你有一对一的关系,你应该强烈考虑分析为什么它不是一对一table,但我对 3NF 的理解就是这样做。到目前为止,这是我的数据库: 我曾尝试在 3NF 中创建此数据库,但到目前为止我不确定是否正确拆分了 BOOK_STATS 和 BOOK_DETAILS tables。我对其进行了分析,并确定诸如文件类型和质量之类的东西根本不依赖于这本书,所以我不得不将它们分开。这是正确的还是我需要更深入地了解为什么要拆分它们?

将一个 table 拆分为多个具有相同主键的 table 既不违反任何范式,也不会修复潜在的违规行为。通过考虑规范化尚未规范化的 table 所需的步骤,这可以很容易地变得合理:所有这些方法都引入了 tables,其主键不同于原始 table 的主键。因此引入具有相同主键的 table 不能成为规范化步骤。

我属于声称应该将 1-1 关系合并为一个 table 的部分,除非有强烈的语义或物理原因将它们分开。但是,关于您的 book_details table 可能会问到以下问题:

  • "book" 的概念可以表示两件事:逻辑实体,即作者、标题、内容或物理实例。正如您的模型所示,同样的区别适用于文件中包含的书籍。 Orwell's 1984 可能出现在多个文件中,一个质量好的 PDF 和一个质量一般的 epub,文件大小不同。或者一本大书可能被分成多个文件。我不知道你的模型和应用程序的目的,但我会尝试涵盖 real-world 像这样的现象,因为稍后添加它们会影响应用程序的大部分并且成本很高。所以我可以想象将您的 book_detail table 转换为 media table 与本书有 1:n 甚至 m:n 关系。

  • file_qualityfile_type 是否有 pre-defined 值范围,如 "excellent, good, mediocre, bad"、"pdf, epub, txt, ..."?在这种情况下,这些值应该是另一个 table 的一部分,而您的 bookbook_detail 将只包含该 table 中的 ID 作为外键。