V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐工具
RoboMongo
推荐书目
50 Tips and Tricks for MongoDB Developers
Related Blogs
Snail in a Turtleneck
kongruxi
V2EX  ›  MongoDB

Tag的数据库设计?

  •  
  •   kongruxi · 2011-05-06 13:54:50 +08:00 · 8638 次点击
    这是一个创建于 4736 天前的主题,其中的信息可能已经有所发展或是发生改变。
    做博客之类的东西经常会用到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   ·   我们的愿景   ·   实用小工具   ·   999 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:33 · PVG 04:33 · LAX 13:33 · JFK 16:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.