评论系统设计

如何解决评论系统设计

| 这是我当前的评论系统设计: 我正在为一个包含许多领域,博客,教程,手册等的网站进行开发。应该为每个(
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来正确构建各种注释类。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-