设计 - 第六范式

fir*_*ird 6 sql normalization relational-database database-normalization 6nf

我有以下表格:

Blogs { BlogName }
BlogPosts { BlogName, PostTitle }
Run Code Online (Sandbox Code Playgroud)

根据6nf(根据第三个宣言),博客帖子同时对实体和关系建模是无效的.

在6nf中,它将是:

Blogs { BlogName }
Posts { PostTitle }
BlogPosts { BlogName, PostTitle}
Run Code Online (Sandbox Code Playgroud)

如果我想通过序列nbr(仅作为示例)订购博客帖子,那将是另一个表

BlogPostsSorting { BlogName, PostTitle , SortOrder }
Run Code Online (Sandbox Code Playgroud)

我说得对吗?

nvo*_*gel 6

你桌子的钥匙是什么?基于列名,我猜BlogPosts的关键只能是{BlogName,PostTitle}.在这种情况下,BlogPosts已经在6NF中 - 它没有非主要属性,因此不能进行非损失分解.博客relvar和Posts relvar将是多余的 - 你不需要它们.

博客文章根据6nf同时对实体和关系进行建模,这是无效的(根据第三个宣言)

你能否告诉我你认为"第三宣言"说这是无效的.我敢肯定它不会,但我想知道你是如何得出这样的结论的.


Erw*_*out 4

sqlvogel在这个答案中是正确的。

除了这个小细节之外:Blogs 是否冗余取决于您是否想要/需要强制执行一个约束,即所有 Blogs 元组必须至少有一个对应的 BlogPost 元组。你没有说任何话来澄清这一点。

这同样适用于您的第三个相关帖子,只不过在这种情况下,如果不作为至少一篇 BlogPost 的标题出现,则 PostTitle 的存在极不可能是有效的。

是否需要 SortingOrder 相关变量作为额外变量取决于是否存在不需要排序顺序的 BlogPost。如果不能,那么您的 SortingOrder 相关变量将简单地替换 BlogPosts。如果可以的话,那么你可以拥有两个relvars;或者,您仍然可以只拥有 SortingOrder 相关变量,并通过使用虚拟值(例如,始终为 -1)来破解帖子的情况,而无需排序。