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

[请教] 比如知乎中的那些具有树结构的 topic,每个 topic 下有很多 questions。那么如何设计表结构,能够在需要获取某个父 topic 下所有子 topic 的 questions 时,查询速度很快?

  •  
  •   hustlzp ·
    hustlzp · 2014-11-28 17:55:12 +08:00 · 4071 次点击
    这是一个创建于 3428 天前的主题,其中的信息可能已经有所发展或是发生改变。
    举个例子:

    http://www.zhihu.com/topic/19606083/organize/entire#anchor-children-topic

    不知道表达清楚了没有...请教一下大家。
    第 1 条附言  ·  2014-11-28 20:19:04 +08:00
    《SQL反模式》

    http://book.douban.com/subject/6800774/

    一本貌似不错的书,已入Kindle版。
    13 条回复    2014-11-28 23:10:25 +08:00
    WildCat
        1
    WildCat  
       2014-11-28 18:07:37 +08:00 via iPhone   ❤️ 1
    类似Rails的俄罗斯套娃缓存?

    给 Topic 模型加一个 updated_at 时间戳,缓存键为
    topic/[topic_id]/[updated_at]

    或者给 Topic 加 questions_count 字段

    以上面的 key 缓存该 topic 下的所有 questions

    参考: http://segmentfault.com/blog/tower/1190000000673412

    不知道是不是你需要的
    crazyxin1988
        2
    crazyxin1988  
       2014-11-28 18:10:37 +08:00   ❤️ 3
    树形结构,可以参考一下SQL反模式中介绍的这两个
    Nested Sets
    Closure Table
    wong2
        3
    wong2  
       2014-11-28 18:12:55 +08:00   ❤️ 1
    哈,最近刚做了。用的是 Closure Table
    WildCat
        4
    WildCat  
       2014-11-28 18:13:28 +08:00 via iPhone
    …没注意,原来是表结构,匿了
    YORYOR
        5
    YORYOR  
       2014-11-28 18:18:41 +08:00   ❤️ 1
    类似于微博的话题与微博以及微博与评论的关系,可以用nosql加索引实现
    hustlzp
        6
    hustlzp  
    OP
       2014-11-28 18:29:28 +08:00
    @WildCat 没关系,只要解决就行...
    hustlzp
        7
    hustlzp  
    OP
       2014-11-28 18:30:31 +08:00
    @crazyxin1988
    @wong2 谢谢2位指点。

    孤陋寡闻,第一次听说Closure Table...
    hustlzp
        8
    hustlzp  
    OP
       2014-11-28 18:31:23 +08:00
    @WildCat 额...你说得好像不是一个东西...
    virusdefender
        9
    virusdefender  
       2014-11-28 19:10:29 +08:00   ❤️ 1
    sql反模式 网上搜搜这本书看 里面就有~
    hustlzp
        10
    hustlzp  
    OP
       2014-11-28 19:11:29 +08:00
    @virusdefender thanks!
    est
        11
    est  
       2014-11-28 20:09:05 +08:00   ❤️ 1
    1-1000用来存汽车话题类别id
    1001-2000用来存电脑话题类别id。

    得到电脑类别questions列表:select * from questions where category_id between 10001 and 2000

    只是一个hack。
    lincanbin
        12
    lincanbin  
       2014-11-28 23:05:56 +08:00   ❤️ 1
    在保存结构关系的时候,把一个topic对应的所有parent全部单独存一条记录,做索引,简单粗暴,空间换时间。
    每个question也同样处理,保存所有的topic对应的所有parent,一般也就多保存二三十条记录。
    到时候WHERE IN就出来了,这样单纯的结构和简单的语句才是最快的。
    hustlzp
        13
    hustlzp  
    OP
       2014-11-28 23:10:25 +08:00
    @lincanbin 确实粗暴!不过解决问题了 :)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5987 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 06:12 · PVG 14:12 · LAX 23:12 · JFK 02:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.