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

2014-11-28 17:55:12 +08:00
 hustlzp
举个例子:

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

不知道表达清楚了没有...请教一下大家。
4078 次点击
所在节点    程序员
13 条回复
WildCat
2014-11-28 18:07:37 +08:00
类似Rails的俄罗斯套娃缓存?

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

或者给 Topic 加 questions_count 字段

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

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

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

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

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

只是一个hack。
lincanbin
2014-11-28 23:05:56 +08:00
在保存结构关系的时候,把一个topic对应的所有parent全部单独存一条记录,做索引,简单粗暴,空间换时间。
每个question也同样处理,保存所有的topic对应的所有parent,一般也就多保存二三十条记录。
到时候WHERE IN就出来了,这样单纯的结构和简单的语句才是最快的。
hustlzp
2014-11-28 23:10:25 +08:00
@lincanbin 确实粗暴!不过解决问题了 :)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/150034

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX