1
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 的关系。 |
2
iiduce 2011-05-06 14:23:50 +08:00
想知道mongodb你是如何设计的
|
7
jerry22yu 2011-05-16 23:41:26 +08:00
@ashchan 如果有很多posts,例如上百万posts的话, 实时用map reduce计算tag clouds可行吗?
|
9
real_newbie 2011-05-17 00:25:56 +08:00
@jerry22yu, MapReduce本來就是處理大數據量時有優勢, 結果肯定要保存下來的. 實時和MapReduce似乎有些搭不上關系...
|
10
jerry22yu 2011-05-17 01:48:13 +08:00
@real_newbie @chloerei 谢谢回答。请问如果不实时计算的话,tag clouds如何能保持始终是最新的呢?有什么好的算法?
|
12
real_newbie 2011-05-17 02:02:01 +08:00
|
13
jerry22yu 2011-05-17 02:23:27 +08:00
@real_newbie 谢谢。我现在用的是MongoDB,我会仔细看一下它的MapReduce,应该也有只计算新文档的功能。
|
15
ashchan 2011-05-18 12:36:02 +08:00
@jerry22yu 实时基本不行。一是mongodb的mr不能多线程,比较慢,二是会阻塞其他访问。所以加缓存是比较直接方便的做法。另,1.8开始mapreduce的结果不再是输出到临时collection,而是指定的collection,所以如果触发计算不是实时的,那么不缓存直接从该collection取结果也可以。
tag clouds这样的功能一般不要求很高的实时性和一致性,所以我觉得如果为了性能,加缓存定期更新或被动更新(即大家说的有其他数据修改时触发缓存失效)都是可行的。 |
16
pi314159 2011-05-18 14:40:52 +08:00
如果不讲实时性,怎么设计都行
|
17
chuck911 2011-05-18 14:51:51 +08:00
实时计算肯定是不行的,关系数据库你可以给tags表加一个count字段,tag被添加时count+1,这是个简单有效的办法
mongoDB也一样,另建个tags的collection,专门计数用, 当然这个场景或许另用一个redis或者其他key-value缓存类的存这样的数据更好 |