
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缓存类的存这样的数据更好 |