这是我目前的评论系统设计:
我正在为一个有很多区域、博客、教程、手册等的网站开发它。正如应该为每个(tblBlogComments
, tblTutorialComments
)等等,我试图寻求一种适合所有方法的结构。
这样,我可以将评论系统变成一个 Web 控件,然后将其放在我想要评论的任何页面上。这意味着我只有一套规则、一套代码文件需要维护。
唯一的问题是,想出一种“好”的方法来确定属于哪个部分(博客/教程/手册)。
例如,一种解决方案是:
tblComment
-------------
Section (int)
SectionIdentifier (int)
Where 'Section
' 映射到网站每个部分的唯一值,EG:
Blog = 1
Articles = 2
Tutorials = 3
...
A SectionIdentifier
是该页面的某种唯一 ID,例如:
ViewBlog.aspx?ID=5
这将是第 1 节,标识符 5。所以现在,一条评论Section = 1
, SectionIdentifier = 5
表示这是对第 5 号博客条目的评论。
这很有效,但以可维护性和坚固的结构为代价,因为SectionIdentifier
是匿名的,无法建立任何关系。
这个设计可以吗,或者有更好的解决方案(即某种用于评论的父表?)
在 Codd 最初设计的关系模型中,外键可以引用不同表中的多个主键,并且如果任何一个表包含该值,则引用完整性有效。
不幸的是,正如您所指出的,SQL 是最初愿景的苍白反映,因为它不提供这种能力。
一个标准的解决方法是创建一种新的关系,该关系掌握着所有其他关系的关键。但在这种情况下,这不是一个很好的解决方案,因为如果同时发生大量插入,就会产生争论点。
我处理这个问题的方法是创建一个值(我们称之为注释锚),您可以将其放入每个有注释的表中。该值(与精心设计的数据库中的所有其他键不同)应该是 GUID。然后每个评论都可以有一个 Comment-Anchor 来指示它所引用的值。
通过使其成为 GUID,您始终可以在博客或教程等中插入唯一值,而不会发生争用。您不必在任何地方维护评论锚点的主列表,并且没有任何部分与任何其他部分竞争或被任何其他部分阻止。
例如,这对于查找单个博客条目的所有评论的正常用例非常有效。换句话说,从评论到正在评论的事物,您可以在评论表中放置一个标志来标识正在引用哪个表,但我不会这样做。我会搜索所有的表,也许有一个视图或其他东西。反向查询非常罕见,我认为维护它的基础设施没有太多意义,而且标志将是冗余数据,这是 RDBMS 的祸根。
该系统的另一个好处是它易于扩展。如果您创建新类型的数据,或决定向现有数据类型添加注释,则只需将 Comment-Anchor 列添加到表中。数据库端不需要做任何额外的工作。甚至处理注释的中间件部分也不需要以任何方式修改,因为它不知道什么样的事物需要注释。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)