V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
markme
V2EX  ›  数据库

V2EX 主题和评论按更新时间实时排序是怎么做到的

  •  
  •   markme · 2016-07-23 13:34:24 +08:00 · 2229 次点击
    这是一个创建于 3064 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在学习数据库,然后模仿做了写了两张表,一章主题表 Topic , 一章主题评论表 Comment , Comment 有一个外键 topic_id 指向主题。

    然后我看 V2EX 主题的排序是同时按主题和评论交替排序的,我试了很多遍都没有成功。

    大家知道怎么实现吗,强迫症,做不出来揪心 TAT

    17 条回复    2016-07-24 01:06:35 +08:00
    mathgl
        1
    mathgl  
       2016-07-23 13:38:29 +08:00
    记得 livid 提过,用 redis 做的。
    markme
        2
    markme  
    OP
       2016-07-23 13:42:19 +08:00
    @mathgl 就是 SQL 的 JOIN 加排序做不出这样的效果? Redis 加权重应该可以的
    jason19659
        3
    jason19659  
       2016-07-23 13:59:44 +08:00
    加个字段..latestDate..
    markme
        4
    markme  
    OP
       2016-07-23 14:12:26 +08:00
    @jason19659 都有,按时间排序做不到这个效果。
    mornlight
        5
    mornlight  
       2016-07-23 14:14:01 +08:00
    每个主题有一个最后更新时间,这不是最直接的思路吗
    9hills
        6
    9hills  
       2016-07-23 14:19:10 +08:00
    SQL 为啥不能实现。。。最简单方法主题加个字段 LatestUpdate ,任何对主题的修改以及新的回复都修改这个字段不就好了...
    markme
        7
    markme  
    OP
       2016-07-23 14:23:39 +08:00
    @9hills @mornlight @jason19659 嗯,谢谢各位,我懂了,这样是可以的。(我想多了,我奔着 Join 查询去想的。)
    binota
        8
    binota  
       2016-07-23 17:45:42 +08:00
    两张表, Threads_Basic 、 Threads_Posts ,
    Threads_Basic 只存主题的标题、发帖人、发帖时间
    Threads_Posts 存包含主帖在内的帖子内容、发帖人、发帖时间、对应的主帖 ID
    这样只要按发帖时间选择 Threads_Posts 再 Join Threads_Basic 就可以了
    cloverstd
        9
    cloverstd  
       2016-07-23 19:14:55 +08:00
    markme
        10
    markme  
    OP
       2016-07-23 19:26:48 +08:00
    @cloverstd 厉害,原来有这个
    ilikekindle
        11
    ilikekindle  
       2016-07-23 22:00:50 +08:00
    v2 的主题不单是靠时间排序吧?
    markme
        12
    markme  
    OP
       2016-07-23 23:12:16 +08:00
    @ilikekindle 嗯,上面讨论的这些完全可以实现这个效果。但是要考虑性能的话,就有些吃紧了。
    实际的话应该是类似 Redis 缓存加按权重排序来实现的。也可能是其他更好的方式。
    julyclyde
        13
    julyclyde  
       2016-07-23 23:54:51 +08:00
    实际上其实并不是按这个排的,没实时
    markme
        14
    markme  
    OP
       2016-07-24 00:39:57 +08:00
    @julyclyde 那就说明是有缓存或者队列存在的,有一个同步的时钟存在。
    dangyuluo
        15
    dangyuluo  
       2016-07-24 00:49:22 +08:00
    redis 排序
    lianghudou
        16
    lianghudou  
       2016-07-24 00:58:05 +08:00
    楼上一群菜鸟,把简单的功能说的神乎其神,其实就是一个 topic 表有两个最后回复时间的字段,一个是真的最后回复时间,一个是假的最后回复时间,假设这个假的最后回复时间名叫 lasttime_fake 。

    其实就是在这个假的 lasttime_fake 上做文章,逼格越高的帖子,这个 lasttime_fake 越接近真实时间,逼格很低的帖子,可能发完以后 lasttime_fake 就是 1 天前。这样就导致了一个很和谐的后果:在 V2EX 上很难见到逼格低的帖子。

    至于这逼格怎么判断的呢?可以 100%的肯定,这不全是靠算法,里面有人工的成分。
    markme
        17
    markme  
    OP
       2016-07-24 01:06:35 +08:00
    @lianghudou 嗯呐,谢谢,这也是一种。 V2EX 的管理员确实挺多的呢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5036 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 08:51 · PVG 16:51 · LAX 00:51 · JFK 03:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.