MongoDB架构设计---与团队的友谊

时间:2011-04-21 16:02:57

标签: ruby-on-rails mongodb schema social-networking mongoid

好朋友〜 我想使用MongoDB来实现基于群组的友谊模型。就像Google Buzz一样。 例如,
我叫Tom,Steve和Gavin是我的朋友。史蒂夫是我的同学和同事,加文是我的同事。

Tom
  -Group Classmates
     Steve
  -Group Coworkers
     Steve
     Gavin

我的问题是如何设计这个架构? 在rails和Mongoid中,我写了以下代码:

这是user.rb

class User
  include Mongoid::Document

  field :username
  field :email

  field :block_list, :type => Array, :default => []


  key :username

  embeds_many :groups

  embeds_many :pending_requests

  has_and_belongs_to_many :friends, :class_name => "User"

end

group.rb

class Group
  include Mongoid::Document
  embedded_in :user

  field :name

  field :members, :type => Array, :default => []
end

pending_request.rb


class PendingRequest
  include Mongoid::Document
  embedded_in :user

  field :username
  field :body
end

有什么建议吗?谢谢。

1 个答案:

答案 0 :(得分:0)

有几种方法可以为此目的设计架构。其中一个重要的问题是:如果Tom说Gavin是同事,那是否意味着Gavin还会将Tom视为同事?

: 如果Tom或Gavin可以在他们两个之间创建一个链接,并且它是相同的链接(无论创建该链接的过程如何),那么您真正谈论的是一种关系。 Mongo是一个NoSql数据库,不进行连接,因此您必须使用多个选择和更新查询来管理此关系。汤姆可以保留一份同事名单,加文可以保留同事名单,任何时候他们中的任何一个都会增加另一个,两个文件都需要更新。老实说,这种关系是关系数据库擅长的。 Mongo可能不是最好的解决方案。

: 如果Tom可以确定Gavin是否完全独立于Gavin的想法,那么您应该在您的用户集合中存储一系列同事。同学也是如此。每个用户文档都有一个名称字段,一个同事字段,一个同学字段等。要获得Tom的信息,您只需从单个集合中提取单个文档即可获得所有文档。

请记住,跟踪文档之间的关系不是Mongo的强项。如果你有很多关系来处理和相对较小的文件,Mongo真的不是你最好的选择。

使用mySql管理用户和关系,同时在Mongo中存储活动日志,评论,帖子等,没有任何问题。