假如虎绿林为帖子加上历史记录功能,数据库应该怎么设计?

@Ta 04-10 18:00 8330点击

类比下知乎的问题日志,如果历史记录功能可以查看:

  • 内容编辑历史(附带审核记录)
  • 版块移动历史
  • 关闭评论
  • 下沉帖子
  • ……

还兼容未来可能新增的功能,如:

  • 标签增删历史

例:

@无名啊 删除帖子 •2022-04-10 19:00:00

@老虎会游泳 关闭评论 •2022-04-10 18:30:00

@老虎会游泳 移动至 虎绿林 > 开发 版块 •2022-04-10 18:20:00

@无名啊 修改帖子内容 •2022-04-10 18:10:00 (假如不搞差异显示)
等待审核

修改内容

@无名啊编程 > 数据库 版块发布帖子《假如虎绿林为帖子加上历史记录功能,数据库应该怎么设计?》 •2022-04-10 18:00:00
@老虎会游泳 审核通过 •2022-04-10 18:05:00

原始内容

数据库该如何设计呢?

回复列表(20)
  • @Ta / 04-10 18:15 / /

    方案1:添加一个字段version,从0开始,每次+1。把update操作修改为insert,并且version+1。

    显示帖子时,对于每个楼层仅显示version最大的(⚠️性能问题警告)。

  • @Ta / 04-10 18:16 / /

    方案2:添加一个专门的历史记录表,在用户进行操作时,把你想要显示的操作及旧内容写进去。性能更好,而且对现有的模块没有明显影响。

  • @Ta / 04-10 18:15 / /

    我太不想要这个特性,不要提交给hu60.cn。

    我以极高的频率修改帖子并保存,中间状态都不应该存在。

    版主修改前的内容不应该被其他用户看到。

    用户有被遗忘权,如果不能靠修改发言被遗忘,他们会选择删除发言,直至注销账号。

  • @Ta / 04-10 18:18 / /

    @老虎会游泳,我不开发虎绿林

    只是看到 @神的孩子全跳舞 那个修改了七八次的帖子后,对于“帖子历史”功能好奇,想请教下数据库设计方面的问题

    又不好拿如知乎之类的举例子,就直接拿虎绿林咯

  • @Ta / 04-10 18:19 / /

    @老虎会游泳,你的方案1,每个可追溯历史的属性单独成表?帖子里再引用它们?

    • 帖子表
      • ID
      • 最新标题ID
      • 最新内容ID
      • ……
    • 帖子标题表
      • ID
      • 帖子ID
      • 修改者ID
      • 标题
      • 时间
    • 帖子内容表
      • ID
      • 帖子ID
      • 修改者ID
      • 审核者ID
      • 审核结果
      • 内容
      • 时间

    回表次数是不是有点多

  • @Ta / 04-10 18:21 / /

    @老虎会游泳,所以我选方案2

  • @Ta / 04-10 18:27 / /

    @老虎会游泳方案1有必要增加最新标题ID之类的字段么?

    SELECT TOP 1 ID FROM 帖子标题表 WHERE 帖子ID = ? ORDER BY 时间 DESC 应该没啥性能问题?

    增加 帖子ID, 时间 索引后

  • @Ta / 04-10 18:30 / /

    @老虎会游泳方案2是要自己序列化一条记录后存入历史表?

    如果如帖子内容表增加了一个字段如引用帖子ID,咋办

  • @Ta / 04-11 00:09 / /

    @无名啊,那和历史记录无关啊,历史记录针对的是显示,又不是存储关系数据。我想怎么显示就怎么存储,其他表新增字段和它有什么关系。甚至我可以懒到提前把html渲染好,直接放进历史记录,想显示的时候直接拿出来,根本不需要进行关系解析。

    这样的话,历史记录只需要三个字段:楼层id,html,时间。

  • @Ta / 04-11 00:24 / /

    @老虎会游泳,可以做成类似看云的那种git方式的历史记录,如果楼主想用,可以开启,否则就是普通帖子
    http://www.1kmb.com

  • @Ta / 04-11 03:38 / /

    @老虎会游泳,换个例子

    1. 如果表结构的修改,会影响到历史记录

    帖子内容表增加字段内容类型(如 0:text 1:markdown 2:latex,查看历史时需要该字段内容,来决定格式解析器

    • 是增加字段后,立即塞{"内容类型": 0}(假设用json序列化)至所有历史记录
    • 还是代码层面判断内容类型 = 历史数据["内容类型"] || 0

    好像也无关紧要。。还是能提前渲染好。。

    1. 如果还需要依赖历史记录呢?

    虎绿林的帖子改成只显示最新通过审核版本的内容

    历史版本不存在审核通过则显示正在审核……(存在正在审核状态的内容)审核未通过(全是未通过

    甚至作者还能主动回退版本……

    方案二还好使吗?至少不太能只存储最终渲染了事

    甚至觉得方案一这种还是结构化数据方便读写(如给管理员显示diff 内容加快审核)

  • @Ta / 04-11 03:56 / /

    @MaxPHPgit比上述两种方案都更复杂吧……

  • @Ta / 04-11 08:31 / /
    其实不做帖子差异显示的情况下,加一张变更记录表。记录下什么人什么时间做了什么操作就好了,对于帖子内容的变更,同时记录下变更前的内容。做差异现实的话就麻烦点。
  • @Ta / 04-11 21:02 / /
    @老虎会游泳,还有个功能建议关闭,就是用户可以关闭评论进入自嗨模式,建议只有管理员有这个权限,或者这种帖子自动沉底,避免浪费公共资源
  • @Ta / 04-12 12:37 / /

    @strwei,这是我专门为进入自嗨模式设计的功能,所以应该是不会关闭的。如果你对此不满意,可以屏蔽使用该功能的用户。比如,我就使用该功能,我甚至在该功能不存在的时候就一直在使用SQL语句实现类似功能。所以该功能最初就是为我开发的。如果你讨厌我发表的内容,认为我使用该功能浪费了公共资源,你可以屏蔽我。

  • @Ta / 04-12 12:12 / /

    关闭评论和删除评论是两个重要的自我保护措施。

    如果我遭受攻击时会下意识使用这些措施,我就应该开放给所有其他用户,这样,他们才能和我一样保护自己免遭网络暴力。

    和我一样,其他人也可以自由选择事前保护(发帖时就关闭评论)、事中保护(最开始允许回复,见势不对就关闭评论)和事后保护(允许回复,删除造成伤害的评论)。

    因为删除的楼层会内信给作者,所以作者不会丢失自己的打字成果。如果作者真的想发表自己评论中的观点,也完全可以开一个新帖发布。所以上述两个功能对其他用户的发表权没有侵害。

  • @Ta / 04-12 12:16 / /

    随着互联网变得越来越暴力,我解决网络争端的指导方针已经发生了明显的变化。以前,我倾向于调解。现在,我倾向于第一时间脱离接触。

    如果看对方不顺眼,请第一时间屏蔽他,这样就能避免未来发生更大的争端。随着互联网越发暴力,很多时候争吵都根本不会有结果,没有任何人的想法会改变。所以,迟早是要脱离接触的,还不如一开始就脱离接触。

  • @Ta / 04-12 12:22 / /

    虎绿林做为电子公告牌,为注册用户提供同等条件的电子公告发表服务。电子公告可以接受评论,但不是必然接受评论。如果用户只想公告,不想征求意见,当然可以选择发表不接受评论的电子公告。这样的公告在展示时没有理由被降级。

    如果某些用户不喜欢某些公告,可以通过屏蔽发布者的方式来屏蔽这些公告。我认为这已经足以让这些用户远离自己不喜欢的内容。

  • @Ta / 04-12 12:42 / /

    如果一个管理员特权被我滥用,用于私人目的,导致我在使用虎绿林时和非管理员相比拥有特殊的优势,我就会考虑把该功能开放给所有人。

    比如,我经常SQL语句锁帖,实现关闭评论。所以现在所有帖子作者都能关闭评论。

    我经常因为不喜欢某人的言论就用管理员权限删除他在我帖子里的评论,所以现在所有帖子作者都能删除楼层评论。

    我经常用帖子编辑权限查看、复制用户发表的UBB代码,所以现在帖子添加了“显示源码”(简称“源”)功能。

添加新回复
回复需要登录