请教一个 mongo 的数据库设计问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
no13bus
V2EX    程序员

请教一个 mongo 的数据库设计问题

  •  
  •   no13bus
    no13bus 2015-04-08 09:28:08 +08:00 3612 次点击
    这是一个创建于 3838 天前的主题,其中的信息可能已经有所发展或是发生改变。
    项目来源于我自己的开源项目 https://github.com/no13bus/ohmyrepo

    它利用了github的webhook功能,自动获取用户的repo的star信息,关注人的分布以及关注者的被follow的数量排名, 这样你可以选择直接follow他们。
    现在仔细想了想数据库构造,觉得还是有点问题。想请教下大家。



    上面是mongo的数据库基本构造
    有2个collection 一个是user 一个是event。

    user存储的是用户名以及其github的token。

    event存储的是star用户自己的项目时候的事件信息,username和user里面的username是一个东西,其中主要的是sender,他又包括了star项目人的用户名(sender_name) 该人的follower数量(followers),以及其所在地点(location).

    项目需要查询的是用户(username)自己的项目(reponame)的所有的star的人的地点分布,以及该项目的star人的followers的数量排名。

    我自己这么设计数据库的时候发现,如果一个人star了多个项目的时候,那么event里面应该会出现多次一样的sender。应该单独设置一个sender表,想来去想去就又跑到关系数据库的思维方式里面去了。

    想问下大家,应该如何设计这样的数据库呢?
    6 条回复    2015-04-08 21:32:39 +08:00
    no13bus
        1
    no13bus  
    OP
       2015-04-08 11:20:58 +08:00
    没人知道吗?还是说我问题没有描述清楚?
    luw2007
        2
    luw2007  
       2015-04-08 16:50:03 +08:00
    不需要增加一个表。

    User应该包含了 sender的信息 location, followers。
    Event 中直接存储 User._id, 即可。
    wangshuai
        3
    wangshuai  
       2015-04-08 17:04:45 +08:00
    这个问题吧,我认为, 其实 Event 表 可以理解成一个 log 的表,记录Star事件的,所以你说的那些统计内容,也就是吧event 表当个样本池子,是需要对Event表做类似 map-reduce的处理来获取分布啊之类的信息。
    具体表的设计方面,我觉得也就是加一个类似 RepoPopular之类的名字的表,里面存放Repo的信息和username之外,应该有一个 senders 的 array , array 里面存放所有star过这个repo的人信息,比如名字,followers, 和location,是一个 document的array。 当你在为这个repo统计的时候,直接find这个reop,那所有和你统计相关的所有star的人的信息就都有了。

    只不过是在update 这个 document的时候,程序那里通过代码来控制一些约束,比如什么重复人啊,之类的。

    如果是持续运营阶段性的数据,就不用map-reduce,直接find document 搞就可以。 如果是一次批量取得很多数据,然后store 进 mongo, 那就搞的map-reduce, 稍微复杂一点的统计,就用这种方式基本很多问题都可以解决。
    wangshuai
        4
    wangshuai  
       2015-04-08 17:06:30 +08:00
    @wangshuai 当人需要考虑单个document 16m 的那个 limit,不过应该没啥问题吧, 一个repo,到不了那么多人去star。
    no13bus
        5
    no13bus  
    OP
       2015-04-08 21:20:05 +08:00
    @wangshuai 是的。没有那么大。你这样的设计是符合mongo的设计思路的,之前也这么想过,但是觉得一个repo的信息都塞到一个docement里面有点大,可能是一个repo有1w个star的话,数据量有点大,不知道这样查询会不会慢,本身map-reduce查询就慢,消耗性能。我用的是aggregate来做的分组和归类。

    能加你qq聊聊吗?我的是364416072
    no13bus
        6
    no13bus  
    OP
       2015-04-08 21:32:39 +08:00
    @wangshuai 其实如果使用mongo的那种设计方式的话,会存在这种情况。如果一个人star了多个项目的话,会发现在RepoPopular这个表里面会发现,有2个repo的senders这个array里面会有相同的star repo的相同的一个人的信息。如果是关系数据库的话,应该就不是这样了。
    还有一个问题是,一个人的followers的数量信息其实是会变化的,一般是会增大的,目前我的项目里面默认这个数就是最开始的爬取时的followers的数量信息,不会后续更新的。如果是要更新的话,其实很麻烦,需要找到各个repo里面该用户,然后全部更新。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3609 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 00:47 PVG 08:47 LAX 17:47 JFK 20:47
    Do have faith in what you're doing.
    ubao 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