Sql 设计-第六范式

Sql 设计-第六范式,sql,relational-database,normalization,database-normalization,6nf,Sql,Relational Database,Normalization,Database Normalization,6nf,我有以下表格: Blogs { BlogName } BlogPosts { BlogName, PostTitle } 博客文章同时对实体和关系进行建模,根据6nf(根据第三份宣言),这是无效的 在6nf中,它将是: Blogs { BlogName } Posts { PostTitle } BlogPosts { BlogName, PostTitle} 如果我想按序列nbr(仅举一个例子)排序博客文章,那将是另一个表 BlogPostsSorting { BlogName, Post

我有以下表格:

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

在6nf中,它将是:

Blogs { BlogName }
Posts { PostTitle }
BlogPosts { BlogName, PostTitle}
如果我想按序列nbr(仅举一个例子)排序博客文章,那将是另一个表

BlogPostsSorting { BlogName, PostTitle , SortOrder }

我的表是否正确?

您的表的键是什么?根据列名,我猜BlogPosts的键只能是{BlogName,postitle}。在这种情况下,BlogPosts已经在6NF中了——它没有非主要属性,因此不能进行非损失分解。博客relvar和帖子relvar是多余的——你不需要它们

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

你能告诉我你认为第三份宣言说那是无效的吗。我肯定没有,但我想知道你是如何得出这样一个结论的。

sqlvogel是正确的

除了这个小细节:博客是否冗余取决于您是否想要/需要强制一个约束,即所有博客元组必须至少有一个对应的BlogPost元组。你没有说清楚什么

你的第三篇relvar文章也是如此,只是在这种情况下,如果一篇文章的标题不是至少一篇BlogPost的标题,那么它就不太可能存在


是否需要SortingOrder relvar作为额外的relvar取决于是否可以存在不需要排序顺序的blogpost。如果没有,那么您的SortingOrder relvar将简单地替换blogpost。如果可以,那么您可以拥有两个relvars;或者,您也可以使用SortingOrder relvar,通过使用伪值(例如,始终为-1)在没有排序的情况下对帖子进行排序。

您提出的6NF模式假设没有博客会重用帖子标题。首先,虽然Date和Darwen对6NF有很多话要说,但我不相信TTM会这么做。第二,请注意,尽管6NF总是可以实现的,但并不总是可取的。参见Darwen的《关系数据库理论导论》(免费下载),7.3 6NF分解评估,pp180-2.TTM没有任何关于6NF的明确说明(为什么会这样?),Chris Date现在故意避免使用术语“实体”。尽管与规范化无关,如果我们取消了博客的relvar,那么在设计上会有一个实际问题:在确定第一个标题之前,我们将无法注册博客。我想这就是@Erwin Smout的观点,假设他们考虑了隐含的约束。如果这是一个键{BlogName,PostTitle}加上一个非键属性{SortOrder},那么它就是6NF。(哦,等等,你指的是可能的第二个键{BlogName,SortOrder}的效果吗?我认为这不会影响任何东西。relvar仍然不是不可丢失分解的。)此注释作为响应的注释似乎已经消失。