Tag的数据库设计?

2011-05-06 13:54:50 +08:00
 kongruxi
做博客之类的东西经常会用到Tag

如果用mongoDB之类的NoSQL还好办,但如果用关系数据库,应该怎样设计数据库?
8797 次点击
所在节点    MongoDB
17 条回复
iwinux
2011-05-06 14:08:39 +08:00
关系数据库的tag设计可以参考 Rails 的 act_as_taggable

大致思路是两个数据表:
tags: id, name
taggings: id, tag_id, post_id (假如你只是给 Post 加 tag 的话)

这样实现的就是 Post has many and belongs to many Tags 的关系。
iiduce
2011-05-06 14:23:50 +08:00
想知道mongodb你是如何设计的
kongruxi
2011-05-06 14:27:38 +08:00
@iwinux 这个思路是taggings作为tag和post的中间表,实现tag与post的多对多关系?
kongruxi
2011-05-06 14:29:16 +08:00
@iiduce mongodb的话,我是打算每个post下都有tag数组
iwinux
2011-05-06 14:30:05 +08:00
@kongruxi 是的。
ashchan
2011-05-06 14:51:45 +08:00
@iiduce 直接一个字符串数组,map reduce算tag clouds.
jerry22yu
2011-05-16 23:41:26 +08:00
@ashchan 如果有很多posts,例如上百万posts的话, 实时用map reduce计算tag clouds可行吗?
chloerei
2011-05-16 23:43:42 +08:00
@jerry22yu 真的有必要实时?
real_newbie
2011-05-17 00:25:56 +08:00
@jerry22yu, MapReduce本來就是處理大數據量時有優勢, 結果肯定要保存下來的. 實時和MapReduce似乎有些搭不上關系...
jerry22yu
2011-05-17 01:48:13 +08:00
@real_newbie @chloerei 谢谢回答。请问如果不实时计算的话,tag clouds如何能保持始终是最新的呢?有什么好的算法?
iwinux
2011-05-17 01:50:54 +08:00
@jerry22yu 小网站的话撑死也不会超过1000个tag吧,每次都遍历生成就行了,大不了加个缓存……
real_newbie
2011-05-17 02:02:01 +08:00
@jerry22yu,

我只了解CouchDB的做法. 在CouchDB裡, 如果一個文檔變更了, 那麼下次請求視圖(MapReduce)裡, 只會重新計算新改變的這一文檔, 其他的不必重新計算.
jerry22yu
2011-05-17 02:23:27 +08:00
@real_newbie 谢谢。我现在用的是MongoDB,我会仔细看一下它的MapReduce,应该也有只计算新文档的功能。
chloerei
2011-05-17 07:55:33 +08:00
@jerry22yu 做一个tags_clouds的计数器缓存
ashchan
2011-05-18 12:36:02 +08:00
@jerry22yu 实时基本不行。一是mongodb的mr不能多线程,比较慢,二是会阻塞其他访问。所以加缓存是比较直接方便的做法。另,1.8开始mapreduce的结果不再是输出到临时collection,而是指定的collection,所以如果触发计算不是实时的,那么不缓存直接从该collection取结果也可以。

tag clouds这样的功能一般不要求很高的实时性和一致性,所以我觉得如果为了性能,加缓存定期更新或被动更新(即大家说的有其他数据修改时触发缓存失效)都是可行的。
pi314159
2011-05-18 14:40:52 +08:00
如果不讲实时性,怎么设计都行
chuck911
2011-05-18 14:51:51 +08:00
实时计算肯定是不行的,关系数据库你可以给tags表加一个count字段,tag被添加时count+1,这是个简单有效的办法
mongoDB也一样,另建个tags的collection,专门计数用,
当然这个场景或许另用一个redis或者其他key-value缓存类的存这样的数据更好

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

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

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

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

© 2021 V2EX