V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jacky007wang
V2EX  ›  程序员

如何设计才能保证论坛楼层不重复?

  •  
  •   jacky007wang · 2013-01-25 09:28:47 +08:00 · 4905 次点击
    这是一个创建于 4102 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在有个需求,论坛贴子的回复都会显示xx楼,比如:

    20楼 Jacky
    楼主好人,1024
    [回复此楼]

    如果用户John点了[回复此楼],那么这个回复需要显示成:

    21楼 John
    @Jacky 回复20楼
    1024
    [回复此楼]

    和v2ex相同的是都有@username, 不同的就是加了 回复xx楼

    像v2ex这样,楼层数是不需要记录的,显示的时候计算一下就好,但按我说的这种需求,需要把楼层记在数据库
    Table Reply:
    reply_id
    user_id
    content
    floor : 本条回复的楼层
    reply_to_user_id : 对应@User
    reply_to_floor : 对应回复xx楼

    现在的问题就是有什么简便的方式记录楼层,能保证并发情况下多个用户同时回复,楼层floor这个字段能正确设置而不会出现楼层重复?
    PS:用的Django
    23 条回复    1970-01-01 08:00:00 +08:00
    qiayue
        1
    qiayue  
       2013-01-25 10:26:07 +08:00
    我能想到的是,楼层数依然通过计算得出,但是计算时要建立reply_id与楼层数之间的关系。
    而你数据库表的reply_to_floor字段改为reply_to_reply_id,即存储被回复的楼层的id。
    显示的时候显示reply_to_reply_id对应的楼层数。
    tioover
        2
    tioover  
       2013-01-25 10:31:35 +08:00
    如果是回复某条信息的
    数据库里就记录对应的那条信息的ID,然后显示的时候再重新计算
    jacky007wang
        3
    jacky007wang  
    OP
       2013-01-25 10:43:24 +08:00
    @qiayue
    @tioover
    多谢回复,你们说的实现方式应该是一样的,这有个问题:
    考虑分页的情况,假设一页100楼
    Jacky的回复是90楼,John回复了Jacky90楼的这条回复,但是John的回复最终在110楼,那么重新计算的时候就非常麻烦
    OATOS
        4
    OATOS  
       2013-01-25 11:05:49 +08:00
    @jacky007wang 这个不太懂,楼主是建设论坛的吗?很想问一下:目前用哪种开源软件建论坛比较好啊?
    Paranoid
        5
    Paranoid  
       2013-01-25 11:13:08 +08:00
    其实可以这样,数据表保存 at 的那条记录的id, 然后页面输出之后先有顺序楼层. 然后用 javascript 根据保存的 at 的那条记录的id 去取得相应的楼层替换之.
    binux
        6
    binux  
       2013-01-25 11:15:39 +08:00
    1、用count(1)设置floor
    2、别去记什么reply_to_floor,回复xx楼就是一个文案,既然显示的时候能计算出来,就让提交回复的时候加到内容里面就可以了
    jacky007wang
        7
    jacky007wang  
    OP
       2013-01-25 11:26:11 +08:00
    @OATOS
    看来你没建过论坛,那就Discux或PHPWind里挑一个吧
    jacky007wang
        8
    jacky007wang  
    OP
       2013-01-25 11:29:00 +08:00
    @Paranoid
    还是我在3楼说的问题,如果是在同一页面js可以替换,如果分页了,就不行
    jacky007wang
        9
    jacky007wang  
    OP
       2013-01-25 11:32:43 +08:00
    @binux
    count(1)? 没明白
    "让提交回复的时候加到内容里面" --这样是够简单,但就太不灵活了,将来可能会更改显示方式,就做不到了。
    Paranoid
        10
    Paranoid  
       2013-01-25 11:39:02 +08:00
    @jacky007wang 分页, 找不到给楼层,直接给链接.
    OATOS
        11
    OATOS  
       2013-01-25 11:40:12 +08:00
    @jacky007wang 是的,所以来学习学习,谢谢楼主啦!
    jacky007wang
        12
    jacky007wang  
    OP
       2013-01-25 14:27:25 +08:00
    @Paranoid 那就不一致了,不太好
    Paranoid
        13
    Paranoid  
       2013-01-25 15:35:48 +08:00
    @jacky007wang 如果看不到楼层里面的信息量,楼层存在的意义是什么. 链接你可以自动ajax.
    rqrq
        14
    rqrq  
       2013-01-25 15:45:18 +08:00
    ls+1,lz要的东西又费马达又费电。
    换个思路,不需要显示楼层,但是有个提示文字点击了之后ajax显示引用内容。
    Rabbit52
        15
    Rabbit52  
       2013-01-25 15:51:46 +08:00
    我觉得有点想树的感觉,我觉得可以加个level如果这个回复是直接回复楼主的,level就是0,如果是回复回复的,level就是1,这样你只需要对level进行limit,但是我感觉取数据的sql可能稍微麻烦些
    jacky007wang
        16
    jacky007wang  
    OP
       2013-01-25 16:08:05 +08:00
    @rqrq
    嗯,确实,看来没有好的办法显示楼层。
    jacky007wang
        17
    jacky007wang  
    OP
       2013-01-25 16:08:42 +08:00
    @Rabbit52 多谢,不过你说的不是我要问的问题:)
    sobigfish
        18
    sobigfish  
       2013-01-25 16:14:47 +08:00
    既然是回复,交流双方知道(有@通知)就行了,其他人看不看的爽很重要么?
    jacky007wang
        19
    jacky007wang  
    OP
       2013-01-25 16:27:13 +08:00
    @sobigfish 可能不同的论坛需要的交流方式不一样,如果像本帖,看这些回复来回的AT我就看得头晕,所以想到加上楼层,可能会清晰一些。但现在看不好实现,只好计划采用下面的方式

    21楼 John
    @Jacky "楼主好人,1024"
    ----------------------------------
    1024
    [回复此楼]
    mercurylanded
        20
    mercurylanded  
       2013-01-25 21:32:03 +08:00   ❤️ 1
    不使用恢复xx楼,改少量的内容引用怎样。。。
    vigoss
        21
    vigoss  
       2013-01-26 00:36:48 +08:00 via Android
    没懂,要是我来弄的话应该会做成回复楼层就好。剩下的都能查到吧。
    xgdyhaiyang
        22
    xgdyhaiyang  
       2013-01-26 01:01:49 +08:00
    jacky007wang
        23
    jacky007wang  
    OP
       2013-01-26 07:46:52 +08:00
    @mercurylanded 嗯,是的改成少量引用,实现起来容易点,也是很多论坛采用的方式
    @vigoss @xgdyhaiyang 是下边这个意思

    20楼 Jacky
    楼主好人,1024 <-------------回复内容
    [回复此楼]

    如果用户John点了[回复此楼],那么这个回复需要显示成:

    21楼 John
    @Jacky 楼主好人,1024 <-------------引用20楼Jacky的回复内容
    ---------------------
    1024 <-------------John的回复内容
    [回复此楼]
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1218 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:07 · PVG 02:07 · LAX 11:07 · JFK 14:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.