首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

评论区功能的具体实现思路

user_id:发表评论的用户 ID,外键关联到 users 表。 post_id:评论所属帖子的 ID,如果你的项目中有帖子的概念。 creation_time:评论创建时间。...一种方法是,在检索帖子的评论时,首先获取所有一级评论(parent_id 为 NULL 或 0),然后对每个一级评论,检索其子评论。...另一种方式是使用数据库的递归查询功能(如果支持,如 MySQL8.0 版本),一次性检索所有相关评论,并在应用层组织它们的层级结构。...通知机制 当用户对某个帖子或评论进行评论时,应该通知原帖子的发布者和被回复的评论者。...这可以通过在后端逻辑中检查 post_id 和 parent_id,并查询这些 ID 对应的用户,然后向他们发送通知(例如,通过邮件、应用内通知等)实现。

26910

简易评论系统设计

评论审核:为了防止恶意评论或者垃圾信息,系统需要有审核机制,对用户的评论进行审核。评论排序:用户可以根据时间、评分等因素对评论进行排序。...当Cache Miss时,处理用户的读请求,从MySQL中读取数据,更新缓存,并返回给用户。 Comment-Admin: 评论的管理服务,(置顶、删除、检索等)。...所评论的帖子ID,外键,引用Post表的post_idparent_comment_idBIGINT父评论ID,如果是一级评论,此字段为NULLreply_to_comment_idBIGINT被回复的评论...缓存预热:在系统启动或者在低峰期,可以预先将可能被访问的数据加载到缓存中,这样在高峰期可以直接从缓存中获取数据。分库分表当单表存储的数据量级过大时,会影响查询性能,可以进行一定的分表。...评论通常不会脱离帖子本身存在,因此评论表可以根据post_id哈希值将数据分布到多个表中。读写分离:将读操作和写操作分发到不同的数据库服务器上。

34110
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    简易评论系统设计

    评论审核:为了防止恶意评论或者垃圾信息,系统需要有审核机制,对用户的评论进行审核。 评论排序:用户可以根据时间、评分等因素对评论进行排序。...当Cache Miss时,处理用户的读请求,从MySQL中读取数据,更新缓存,并返回给用户。 Comment-Admin: 评论的管理服务,(置顶、删除、检索等)。...删除时间 帖子表t_post 字段名 数据类型 描述 post_id BIGINT 帖子ID,主键 user_id BIGINT 发帖用户ID,外键,引用User表的user_id title VARCHAR...缓存预热:在系统启动或者在低峰期,可以预先将可能被访问的数据加载到缓存中,这样在高峰期可以直接从缓存中获取数据。 分库分表 当单表存储的数据量级过大时,会影响查询性能,可以进行一定的分表。...评论通常不会脱离帖子本身存在,因此评论表可以根据post_id哈希值将数据分布到多个表中。 读写分离: 将读操作和写操作分发到不同的数据库服务器上。

    22310

    【Java 进阶篇】MySQL多表关系详解

    MySQL是一种常用的关系型数据库管理系统,它允许我们创建多个表格,并通过各种方式将这些表格联系在一起。...多表关系的基本概念 在MySQL中,多表关系可以通过不同的方式来实现,主要包括以下几种类型: 2.1....TABLE Posts ( post_id INT PRIMARY KEY, post_content TEXT ); -- 创建用户-帖子关联表(发布帖子) CREATE TABLE...每个记录表示一本书和一个作者之间的关系。 这些示例代码演示了在MySQL中如何创建多表关系以支持不同应用场景的需求。这些关联表用于建立多对多关系,确保数据的一致性和完整性。...在实际应用中,您可以根据需求进行修改和扩展。 5. 总结 多表关系是数据库设计中的重要概念,它可以帮助我们更好地组织和管理数据,实现复杂的数据查询和分析。

    31120

    开源社区系统 Echo 超全文档助力春招

    Quartz 每隔一段时间就刷新计算帖子的热度/分数 — 见下文,而 Caffeine 里的数据更新不用我们操心,它天生就会自动的更新它拥有的数据,给它一个初始化方法就完事儿) ?...显示评论及相关信息 ❝评论部分前端的名称显示有些缺陷,有兴趣的小伙伴欢迎提 PR 解决~ ❞ 关于评论模块需要注意的就是评论表的设计,把握其中字段的含义,才能透彻了解这个功能的逻辑。...) ,以关注的时间进行排序。...zset(userId, now),以关注的时间进行排序 ?...帖子热度计算 每次发生点赞(给帖子点赞)、评论(给帖子评论)、加精的时候,就将这些帖子信息存入缓存 Redis 中,然后通过分布式的定时任务 Spring Quartz,每隔一段时间就从缓存中取出这些帖子进行计算分数

    2.4K20

    塔秘 | 网站访问速度不够快?快收藏SQL 查询优化技巧

    WooCommerce是一个稍微复杂的数据模型,即使订单以自定义的类型存储,用户的ID(商店为每一个用户创建的WordPress)也没有存储在post_author,而是作为后期数据的一部分。...例如,pm2表((wp_postmeta),告诉我们是Using filesort,因为我们使用了 ORDER BY语句对结果进行了排序。如果我们要对查询结果进行分组,这将会给执行增加开销。...索引 order_id在表中是一个相当重要的标志性数据,如果想像这种方式查询,我们需要在列上建立一个索引,除此之外,MySQL将逐字扫描表的每一行,直到找到我们想要的行为止。...它们做了它们不该做的事了吗?这里能做什么优化吗? 这个例子中,我们把licenses 表和posts 表通过order_id 连接起来同时限制post type 为shop_order。...我们知道这是一个关于安全的赌注,在posts 表中software license 行是通过order_id 来跟 WooCommerce order 相关联的,这在PHP 插件代码中是强制的。

    4.9K50

    提升网站访问速度的 SQL 查询优化技巧

    WooCommerce是一个稍微复杂的数据模型,即使订单以自定义的类型存储,用户的ID(商店为每一个用户创建的WordPress)也没有存储在post_author,而是作为后期数据的一部分。...例如,pm2表((wp_postmeta),告诉我们是Using filesort,因为我们使用了 ORDER BY语句对结果进行了排序。如果我们要对查询结果进行分组,这将会给执行增加开销。...索引 order_id在表中是一个相当重要的标志性数据,如果想像这种方式查询,我们需要在列上建立一个索引,除此之外,MySQL将逐字扫描表的每一行,直到找到我们想要的行为止。...这个例子中,我们把licenses 表和posts 表通过order_id 连接起来同时限制post type 为shop_order。...缓存不会过时,因为MySQL 会在表数据更新后刷新缓存。 查询监视器发现在加载一个页面时我们的查询语句执行了四次,尽管有MySQL查询缓存很好,但是在一个请求中重复读取数据库的数据是应该完全避免的。

    6K100

    划重点!必备 SQL 查询优化技巧,提升网站访问速度

    WooCommerce是一个稍微复杂的数据模型,即使订单以自定义的类型存储,用户的ID(商店为每一个用户创建的WordPress)也没有存储在post_author,而是作为后期数据的一部分。...例如,pm2表((wp_postmeta),告诉我们是Using filesort,因为我们使用了 ORDER BY语句对结果进行了排序。如果我们要对查询结果进行分组,这将会给执行增加开销。...索引 order_id在表中是一个相当重要的标志性数据,如果想像这种方式查询,我们需要在列上建立一个索引,除此之外,MySQL将逐字扫描表的每一行,直到找到我们想要的行为止。...它们做了它们不该做的事了吗?这里能做什么优化吗? 这个例子中,我们把licenses 表和posts 表通过order_id 连接起来同时限制post type 为shop_order。...我们知道这是一个关于安全的赌注,在posts 表中software license 行是通过order_id 来跟 WooCommerce order 相关联的,这在PHP 插件代码中是强制的。

    4.8K80

    一种简单易懂的 MyBatis 分库分表方案

    从配置文件中构建 MySQLGroupStore 数据库组对象,这个对象是我们执行 MySQL 操作的入口,通过它可以找到具体的物理的 MySQL 主从数据源。...我们需要根据记录的内容计算出 partition number,再根据 partition number 决定出这条记录所在的物理表属于那个物理数据库,然后对这个物理数据库进行相应的读写操作。...在本例中,帖子表按照 userId 字段 hash 出 64 张表,平均分配到 2 对物理库中,每个物理库包含一个主库和2个从库。...(userId, partitions.post()); } } 从上面的代码中可以看出所有的读写、创建、删除表操作的第一步都是计算出 partition number,然后根据它来选出目标主从库再进一步对目标的数据表进行操作...否则你得使用默认的变量占位符名称 param0、param1 来表示,这就很不直观。 我们将分表的 hash 算法写在实体类 Post 中,这里使用 CRC32 算法进行 hash。

    2K30

    数据库基础

    我们一般使用主键和其他表进行关联 SQL常用数据类型 类型 含义 VARCHAR 可变的长字符串,可以类比于Java中的String类型 INT 整型,和Java中的int类型一致 DOUBLE 浮点型...InnoDB 是 MySQL 的默认储存引擎,utf-8 是一种编码方式*/ 定义字段的语句,语句间有 , ,最后一句后面没有 SQL 语句以 ; 结尾。...; //value 表示字段数据,其与上方field一一对应 varchar类型插入时要用 ‘ ’ 包裹 对于数字 int 类型可以直接写 1 对于 datetime 类型可以通过...LIMIT 5, 6; //表示从表的第5+1行开始(数据库中的行从第0行开始计数),查询6条记录。...LIMIT 5; 即查询年龄大于10的前五条数据(ps where与limit位置的前后决定语句发生的先后) 排序(Order by)语句 我们会需要对查询的数据进行排序,可以使用排序语句,具体如下 SELECT

    61430

    SQL的基本使用和MySQL在项目中的操作

    列名称 = 某值 用 update指定要更新那个表中的数据 用 set指定列对应的新值 用 where指定更新的条件 UPDATE示例 更新某一行中的一个列 把users表中id为7的用户密码,更新为888888...where条件,删除对应的数据行 delete from 表名称 where 列名称 = 值 DELETE示例 从users表中,删除id为4的用户: delete from users where id...,按照status字段进行升序排序: select * from users order by status 降序排序:对users表中的数据,按照id字段进行降序排序: select * from users...order by id desc 多重排序:对users表中的数据,先按照status字段进行降序排序,再按照username的字母顺序,进行升序排序: select * from users oreder...') } }) 更新数据的便捷方式: 更新数据表时,如果数据对象每个属性和数据表的字段一一对应,则可以通过如下方式快速更新数据表: //1.要更新的数据对象 const user={id:7,username

    1.3K20

    MySQL优化的奇技淫巧之STRAIGHT_JOIN

    这一切还得从MySQL对多表连接的处理方式说起,首先MySQL优化器要确定以谁为驱动表,也就是说以哪个表为基准,在处理此类问题时,MySQL优化器采用了简单粗暴的解决方法:哪个表的结果集小,就以哪个表为驱动表...继续post连接post_tag的例子,MySQL优化器有如下两个选择,分别是: 以post为驱动表,通过status_created索引过滤,结果集119340行 以post_tag为驱动表,通过tag_id...索引过滤,结果集71220行 显而易见,post_tag过滤的结果集更小,所以MySQL优化器选择它作为驱动表,可悲催的是我们还需要以post表中的created字段来排序,也就是说排序字段不在驱动表里...知道了来龙去脉,优化起来就容易了,要尽可能的保证排序字段在驱动表中,所以必须以post为驱动表,于是乎必须借助「STRAIGHT_JOIN」强制连接顺序。...实际上在某些特殊情况里,排序字段可以不在驱动表里,比如驱动表结果集只有一行记录,并且在连接其它表时,索引除了连接字段,还包含了排序字段,此时连接表后,索引中的数据本身自然就是排好序的。

    54710

    MySQL优化的奇技淫巧之STRAIGHT_JOIN

    这一切还得从MySQL对多表连接的处理方式说起,首先MySQL优化器要确定以谁为驱动表,也就是说以哪个表为基准,在处理此类问题时,MySQL优化器采用了简单粗暴的解决方法:哪个表的结果集小,就以哪个表为驱动表...继续post连接post_tag的例子,MySQL优化器有如下两个选择,分别是: 以post为驱动表,通过status_created索引过滤,结果集119340行 以post_tag为驱动表,通过tag_id...索引过滤,结果集71220行 显而易见,post_tag过滤的结果集更小,所以MySQL优化器选择它作为驱动表,可悲催的是我们还需要以post表中的created字段来排序,也就是说排序字段不在驱动表里...知道了来龙去脉,优化起来就容易了,要尽可能的保证排序字段在驱动表中,所以必须以post为驱动表,于是乎必须借助「STRAIGHT_JOIN」强制连接顺序。...实际上在某些特殊情况里,排序字段可以不在驱动表里,比如驱动表结果集只有一行记录,并且在连接其它表时,索引除了连接字段,还包含了排序字段,此时连接表后,索引中的数据本身自然就是排好序的。

    40020

    MySQL中SQL执行计划详解

    这个时候,就需要对sql语句执行进行调试。 MySQL我们在调试sql语句的时候,不会像我们写Java或者其他语言代码那样通过打断点的方式进行代码调试。...可能出现的结果如下: const row not found 该表为空 Deleting all rows  表格内数据被标记删除,正在删除中(某些存储引擎支持一种方法,以简单快捷的方式删除所有行,这时查询就会出现这个提示...unique row not found  对于查询,没有行满足 索引或表的条件。 Using filesort  使用文件排序。MySQL必须执行额外的传递以找出如何按排序顺序检索行。...排序是通过根据连接类型遍历所有行并将排序键和指针存储到与该WHERE子句匹配的所有行的行来完成的。...然后对键进行排序,并按排序顺序检索行 Using index 仅使用索引树中的信息从表中检索列信息,而不必另外寻找读取实际行。当查询仅使用属于单个索引的列时,可以使用此策略。

    3.2K20

    MySQL总结

    关于主键的强调内容: 1.一张表中必须有,并且只能由一个主键字段:innodb引擎下存储表数据的时候,会通过你的主键字段的数据来组织管理所有的数据,将数据做成一种树形结构的数据结构,帮你较少...,所以通过主键你能够快速的查询到你所需要的数据,所以,如果你的主键是mysql帮你加的隐藏的字段,你查询数据的时候,就不能将这个隐藏字段作为条件来查询数据了,就不能享受到优化后的查询速度了,对么...,表和表之间如果有关系的话就三种:一对一,多对一,多对多) on delete cascade 级联删除 on update cascade 级联更新 7.分析步骤: 先站在左表的角度去找 是否左表的多条记录可以对应右表的一条记录...3.MySQL的行的详细操作 1.删除或修改被关联字段 场景:book表和publish表为多对一关系,book表的pid字段外键关联到了publish表的id字段 1 查看外键关系名称: show...post,id from employee;这句话,意思就是post和id两个组合在一起同时重复的才算是重复数据 6.查询排序 order by 按单列排序 salary排序的 SELECT

    1.9K30

    Diesel框架对于数据库的使用和实战,在PostgreSQL的基础上的使用【Diesel】

    现在,我们将编写一个小型CLI来管理博客(忽略了我们只能从该CLI访问数据库的事实……我们首先需要一个表来存储我们的帖子。让我们为此创建一个迁移。...,并让diesel生成用于引用查询中的表和列的名称。...("{}", post.body); } } 确切的输出可能因数据库而异,但应该是等效的。 表宏基于数据库模式创建代码堆栈,以表示所有表和列。我们将在下一个示例中详细了解如何使用它。...现场订单说明 使用结构上字段的假定顺序来匹配表中的列,因此确保按照文件#[derival(Queryable)]Postpostsschema.rs中的顺序定义它们 让我们编写代码来实际展示我们的帖子...整洁获取_结果返回*可查询 Diesel可以在单个查询中插入多个记录。只需将或切片传递给,然后调用而不是。如果您实际上不想对刚刚插入的行执行任何操作,请调用。编译器不会像这样抱怨你。

    1.1K20

    Mysql中间件360 Atlas踩坑

    ,查询最多的是分页查询某个帖子的回复,所以根据帖子id进行分表,分成4张表(线上比这个大)。...最近有同事反馈一些用户在查看个人回复时,部分页取不到数据,原因是一些SQL直连Mysql有返回结果,而通过Atlas返回空,SQL如下: SELECT * FROM post_reply WHERE `...因为要从总表取第21-40的记录,不能保证每个子表都有40条记录,即可能表0只有10条记录,表1、表2、表3都只有10条记录,所以需要从每个子表上取前40条记录,然后将每个子表返回的记录合并再排序;但Atlas...原来重写对每个子表的查询之后,Atlas没有做排序,而直接将每个子表返回的结果集放到结果中,如果达到要求的记录数就直接返回了,也就是说如果是LIMIT 20,20,而第一个子表返回的记录数超过20,就直接返回了...记录所有用户发过的回复,然后先按用户id做分页查询回复,然后拿帖子id和回复id查询子表。 当然根本的方案还得从中间件上解决,这样对业务的侵入是最少的,后面再专门介绍数据库中间件相关。

    56030

    MySQL快速入门(二)

    目录 MySQL快速入门(二) 约束条件 自增 自增的特性 主键 外键 级联更新/删除 表与表之间的关系 外键约束 操作表方法 查询关键字 练习数据 select··from where 筛选 group...级联更新/删除 用外键做了表与表的对应关系后,那么操作(增删改)一个表数据,是不允许的; 那么可以通过添加级联更新和删除来同步数据,添加在设置外键下边··· on update cascade:级联更新...,外键字段只能填写被关联表中已经存在的数据 在修改和删除被关联表中的数据的时候,无法直接操作,需要添加级联更新/删除 操作表方法 方法如下 方法名 说明 格式 rename 修改表名 ALTER TABLE...,并且保留平均工资大于1000的部门,然后对平均工资进行排序 select post,avg(salary) from emp where age>10 group by post having avg...BY 按照月薪从高到低进行排序;OFFSET 表示跳过 0 行,LIMIT 返回前 5 条数据,也就是月薪 Top-5 的员工。

    2.6K20
    领券