Tom -Group Classmates Steve -Group Coworkers Steve Gavin
我的问题是如何设计这个架构? 在rails和Mongoid中,我写了以下代码:
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
class Group include Mongoid::Document embedded_in :user field :name field :members, :type => Array, :default => [] end
class PendingRequest include Mongoid::Document embedded_in :user field :username field :body end
有什么建议吗?谢谢。
答案 0 :(得分:0)
有几种方法可以为此目的设计架构。其中一个重要的问题是:如果Tom说Gavin是同事,那是否意味着Gavin还会将Tom视为同事?
是强>: 如果Tom或Gavin可以在他们两个之间创建一个链接,并且它是相同的链接(无论创建该链接的过程如何),那么您真正谈论的是一种关系。 Mongo是一个NoSql数据库,不进行连接,因此您必须使用多个选择和更新查询来管理此关系。汤姆可以保留一份同事名单,加文可以保留同事名单,任何时候他们中的任何一个都会增加另一个,两个文件都需要更新。老实说,这种关系是关系数据库擅长的。 Mongo可能不是最好的解决方案。
否强>: 如果Tom可以确定Gavin是否完全独立于Gavin的想法,那么您应该在您的用户集合中存储一系列同事。同学也是如此。每个用户文档都有一个名称字段,一个同事字段,一个同学字段等。要获得Tom的信息,您只需从单个集合中提取单个文档即可获得所有文档。
请记住,跟踪文档之间的关系不是Mongo的强项。如果你有很多关系来处理和相对较小的文件,Mongo真的不是你最好的选择。
使用mySql管理用户和关系,同时在Mongo中存储活动日志,评论,帖子等,没有任何问题。