评论系统设计

| 这是我当前的评论系统设计: 我正在为一个包含许多领域,博客,教程,手册等的网站进行开发。应该为每个(
tblBlogComments
tblTutorialComments
)等创建一个单独的注释表,因此,我试图一种结构适合所有方法。 这样,我可以将评论系统变成一个Web控件,然后将其放在我要评论的任何页面上。这意味着我只有一组规则,需要维护一组代码文件。 唯一的问题是,想出一种“好”的方法来确定哪个部分(博客/教程/手册)属于。 例如,一种解决方案是:
tblComment
-------------
Section (int)
SectionIdentifier (int)
\'
Section
\'映射到网站每个部分的唯一位置,例如EG:
Blog = 1
Articles = 2
Tutorials = 3
...
“ѭ5”是该页面的某种唯一ID,例如:
ViewBlog.aspx?ID=5
这将是第1部分,标识符5。因此,现在带有
Section = 1
SectionIdentifier = 5
的注释表示它是对博客条目5的注释。 这很有效,但是以可维护性和结构为代价,因为ѭ5是匿名的,无法建立任何关系。 这种设计是否可行,还是有更好的解决方案(例如,某种形式的父表进行注释?)     
已邀请:
在Codd为关系模型设计的原始模型中,外键可以引用不同表中的多个主键,并且如果任何一个表包含该值,则引用完整性是有效的。 不幸的是,正如您所注意到的,SQL不能提供这种功能,这是对原始想法的苍白反映。 一种标准的解决方法是创建一个新的关系,该关系包含其他所有键。但是,在这种情况下,这并不是一个很好的解决方案,因为如果同时发生大量插入操作,则会引起争用。 我要处理的方法是创建一个值(我们称它为Comment-Anchor),您可以将其放入每个要添加注释的表中。该值(与设计良好的数据库中的所有其他键不同)应为GUID。然后,每个注释可以具有一个注释锚,该注释锚指示该注释所引用的值。 通过使其成为GUID,您始终可以在博客或教程等中插入唯一值,而不会发生争用。您不必在任何地方维护评论锚的主列表,也没有任何节与任何其他节竞争或被其阻止。 例如,这对于查找单个博客条目的所有评论的正常用例将非常有用。换句话说,从注释到要注释的事物,您可以在注释表中放置一个标志,以标识要刷新的表,但是我不会这样做。我只搜索所有表格,也许带有视图或其他内容。反向查询非常少见,以至于我看不到为其维护基础结构有什么要紧,并且标志将是冗余数据,这是RDBMS的祸根。 该系统的另一个好处是它易于扩展。如果您创建一种新的数据类型,或决定向现有数据类型添加注释,则只需在表中添加“注释锚点”列。在数据库端不必执行任何其他工作。甚至处理注释的中间件部分也无需进行任何修改,因为它不知道注释采用哪种类型的东西。     
对于表设计,在这种情况下,我将尽可能地模拟类结构。根据您所说的,(大致)如下所示:
Section <- Post <- Comment
因此,您将拥有: 节表(例如博客,文章,教程等) 一个Post表(用于每个部分中的各个帖子) 评论表(用于每个帖子的评论) 每个帖子都将引用该帖子的部分,每个评论都将引用其帖子。 DB可以将引用作为漂亮,干净的外键,并且类可以在应用需要时在关系的一侧或两侧具有列表。 对我来说,这似乎是一个不错的,简单的,灵活的结构,它不会使事情复杂化,但仍然允许您悬挂其他内容,例如对其进行编辑和投票。     
我会避免创建一个ID列,该ID列根据同一表中的另一列定义不同的关系。例如,在您的示例中,取决于“ 3”的值,“ 5”可以表示任意数量的外键引用。这使我不敢相信一般原则。由于不支持RDBMS平台,因此它还具有一些现代RDBMS平台的优点。 您如何为这些不同部分设计总体架构?我已经使用了一些CMS,这些CMS需要您的每个部分共享一个公共的基本实体,将其称为“模块”或“插件”。然后,给定模块的每个实例都有其自己的ID,该ID用于映射到该特定实例所需的任何内容。 如果这对您来说是可行的体系结构方向,您还可以使用ѭ13作为注释的外键。您只需要决定如何将给定类型的模块/插件注册为有效的注释目标即可。 无论如何,您能否稍微了解一下各个部分在引擎盖下的组合方式?     
看起来。您的评论系统包含多种评论(tblBlogComments,tblTutorialComments .....等)。我建议您采用策略设计模式。 比方说。您有一个IComment界面。并且所有类型的注释类都实现了IComment接口。
interface IComment
{
    int ID {get; set; }
    int Section  {get; set; }
    ....
}

class BlogComment : IComment
{
    ....
}

class TutorialComment : IComment
{
    ....
}
还有一个只知道如何处理IComment的WebControl
class WebControl
{
    IComment _comment = null;

    public WebControl(IComment comment)
    {
        _comment = comment;
    }
}
当然,您需要一个CommentCreater来从数据库中加载评论数据并构建评论对象。
public static void main()
{
    var creater = new CommentCreater();
    IComment comment1 = creater.CreateBlogComment()
    WebControl webcontrol = new WebControl(comment1);
    ......

    IComment comment2 = creater.CreateTutorialComment()
    webcontrol = new WebControl(comment2);
    ........
}
这样,您的Web控件就可以以相同的方式处理所有类型的注释。无论是什么样的评论。您也可以维护CommentCreater来正确构建各种注释类。     

要回复问题请先登录注册