V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
no13bus
V2EX  ›  程序员

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

  •  
  •   no13bus ·
    no13bus · 2015-04-08 09:28:08 +08:00 · 3292 次点击
    这是一个创建于 3517 天前的主题,其中的信息可能已经有所发展或是发生改变。
    项目来源于我自己的开源项目 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   ·   实用小工具   ·   2764 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:47 · PVG 22:47 · LAX 06:47 · JFK 09:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.