Tag的数据库设计? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kongruxi
V2EX    MongoDB

Tag的数据库设计?

  •  
  •   kongruxi 2011-05-06 13:54:50 +08:00 9252 次点击
    这是一个创建于 5345 天前的主题,其中的信息可能已经有所发展或是发生改变。
    做博客之类的东西经常会用到Tag

    如果用mongoDB之类的NoSQL还好办,但如果用关系数据库,应该怎样设计数据库?
    17 条回复    1970-01-01 08:00:00 +08:00
    iwinux
        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 的关系。
    iiduce
        2
    iiduce  
       2011-05-06 14:23:50 +08:00
    想知道mongodb你是如何设计的
    kongruxi
        3
    kongruxi  
    OP
       2011-05-06 14:27:38 +08:00
    @iwinux 这个思路是taggings作为tag和post的中间表,实现tag与post的多对多关系?
    kongruxi
        4
    kongruxi  
    OP
       2011-05-06 14:29:16 +08:00
    @iiduce mongodb的话,我是打算每个post下都有tag数组
    iwinux
        5
    iwinux  
       2011-05-06 14:30:05 +08:00
    @kongruxi 是的。
    ashchan
        6
    ashchan  
       2011-05-06 14:51:45 +08:00
    @iiduce 直接一个字符串数组,map reduce算tag clouds.
    jerry22yu
        7
    jerry22yu  
       2011-05-16 23:41:26 +08:00
    @ashchan 如果有很多posts,例如上百万posts的话, 实时用map reduce计算tag clouds可行吗?
    chloerei
        8
    chloerei  
       2011-05-16 23:43:42 +08:00
    @jerry22yu 真的有必要实时?
    real_newbie
        9
    real_newbie  
       2011-05-17 00:25:56 +08:00
    @jerry22yu, MapReduce本就是理大量有, 果肯定要保存下的. 和MapReduce似乎有些搭不上系...
    jerry22yu
        10
    jerry22yu  
       2011-05-17 01:48:13 +08:00
    @real_newbie @chloerei 谢谢回答。请问如果不实时计算的话,tag clouds如何能保持始终是最新的呢?有什么好的算法?
    iwinux
        11
    iwinux  
       2011-05-17 01:50:54 +08:00
    @jerry22yu 小网站的话撑死也不会超过1000个tag吧,每次都遍历生成就行了,大不了加个缓存……
    real_newbie
        12
    real_newbie  
       2011-05-17 02:02:01 +08:00
    @jerry22yu,

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

    tag clouds这样的功能一般不要求很高的实时性和一致性,所以我觉得如果为了性能,加缓存定期更新或被动更新(即大家说的有其他数据修改时触发缓存失效)都是可行的。
    pi314159
        16
    pi314159  
       2011-05-18 14:40:52 +08:00
    如果不讲实时性,怎么设计都行
    chuck911
        17
    chuck911  
       2011-05-18 14:51:51 +08:00
    实时计算肯定是不行的,关系数据库你可以给tags表加一个count字段,tag被添加时count+1,这是个简单有效的办法
    mongoDB也一样,另建个tags的collection,专门计数用,
    当然这个场景或许另用一个redis或者其他key-value缓存类的存这样的数据更好
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5227 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 05:53 PVG 13:53 LAX 21:53 JFK 00:53
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86