评论系统设计

Tom*_*len 5 asp.net database-design foreign-keys normalization relational-database

这是我目前的评论系统设计:

在此处输入图片说明

我正在为一个有很多区域、博客、教程、手册等的网站开发它。由于应该为每个 ( tblBlogComments, tblTutorialComments) 等开发一个单独的评论表,我正在尝试寻找一个适合所有人的结构方法。

通过这种方式,我可以将评论系统变成一个 Web 控件,然后将其放在我想要评论的任何页面上。这意味着我只有一套规则,一套代码文件需要维护。

唯一的问题是,想出一种“不错”的方法来确定哪个部分(博客/教程/手册)属于。

例如,一种解决方案是:

tblComment
-------------
Section (int)
SectionIdentifier (int)
Run Code Online (Sandbox Code Playgroud)

其中“ Section”映射到站点每个部分的唯一值,EG:

Blog = 1
Articles = 2
Tutorials = 3
...
Run Code Online (Sandbox Code Playgroud)

ASectionIdentifier是该页面的某种唯一 ID,例如:

ViewBlog.aspx?ID=5
Run Code Online (Sandbox Code Playgroud)

这将是第1节,标识5.所以,现在有一个评论Section = 1SectionIdentifier = 5表明它是博客条目数5的注释。

这很好用,但代价是可维护性和稳固的结构,因为它SectionIdentifier是匿名的,无法建立任何关系。

这种设计可以吗,还是有更好的解决方案(IE 某种用于评论的父表?)

Jef*_*dge 3

在 Codd 最初设计的关系模型中,外键可以引用不同表中的多个主键,并且如果任何一个表包含该值,则引用完整性有效。

\n\n

不幸的是,正如您所指出的,SQL 是最初愿景的苍白反映,因为它不提供这种能力。

\n\n

一个标准的解决方法是创建一种新的关系,该关系掌握着所有其他关系的关键。但在这种情况下,这不是一个很好的解决方案,因为如果同时发生大量插入,就会产生争论点。

\n\n

我处理这个问题的方法是创建一个值\xe2\x80\x94let\xe2\x80\x99s,将其称为注释锚\xe2\x80\x94,您可以将其放入每个有注释的表中。该值(与精心设计的数据库中的所有其他键不同)应该是 GUID。然后每个评论都可以有一个 Comment-Anchor 来指示它所引用的值。

\n\n

通过使其成为 GUID,您始终可以在博客或教程等中插入唯一值,而不会发生争用。您不必在任何地方维护评论锚点的主列表,并且没有任何部分与任何其他部分竞争或被任何其他部分阻止。

\n\n

例如,这对于查找单个博客条目的所有评论的正常用例非常有效。换句话说,从评论到正在评论的事物,您可以在评论表中放置一个标志来标识正在引用哪个表,但我不会这样做。我会搜索所有的表,也许有一个视图或其他东西。反向查询非常罕见,我认为维护它的基础设施没有太多意义,而且标志将是冗余数据,这是 RDBMS 的祸根。

\n\n

该系统的另一个好处是它易于扩展。如果您创建新类型的数据,或决定向现有数据类型添加注释,则只需将 Comment-Anchor 列添加到表中。数据库端不需要做任何额外的工作。甚至处理注释的中间件部分也不需要以任何方式修改,因为它不知道什么样的事物需要注释。

\n