2013-07-13 43 views
2
之间的多重关系

比方说,我建立一个社区博客引擎:猫鼬 - 对象

  • 我们有几类Category
  • 我们有许多博客Blog
  • 我们有很多帖子Post
  • 我们可能有作者Account
  • 每个Category可能包含几个Blog
  • Blog可以包含在几个Category
  • Blog可能包含几个Post
  • Post可以包含在几个Blog
  • Account可以既是ownereditor的几个Blog的。这就是为什么它可能在ownereditor字段中包含几个Blog的ObjectID的数组。
  • 每个Blog可能由几个Account的拥有和编辑。这就是为什么它可能包含ownereditor字段中几个Account的ObjectID的数组。

这里有一个模式:

categorySchema = mongoose.Schema(
    title: String 
    blogs: [ 
    type: ObjectId 
    ref: "Blog" 
    ] 
) 

blogSchema = mongoose.Schema(
    title: String 
    description: String 
    owner: 
    type: ObjectId 
    ref: "Account" 

    editor: [ 
    type: ObjectId 
    ref: "Account" 
    ] 
    category: [ 
    type: ObjectId 
    ref: "Category" 
    ] 
    posts: [ 
    type: ObjectId 
    ref: "Post" 
    ] 
) 
postSchema = mongoose.Schema(
    blogs: [ 
    type: ObjectId 
    ref: "Blog" 
    ] 
    author: 
    type: ObjectId 
    ref: "Account" 
) 

accountSchema = mongoose.Schema(
    name: String 
    owner: [ 
    type: ObjectId 
    ref: "Blog" 
    ] 
    editor: [ 
    type: ObjectId 
    ref: "Blog" 
    ] 
) 

每一个岗位也可能包含喜欢,评论和其他对象,可能只涉及该对象。

问题是当我尝试添加新的Blog时,我将不得不在许多集合中管理很多字段。同样的事情是当我编辑Blog或删除 - 我必须找到,检查,修改/删除很多对象中的各种数组字段中的很多记录。

suggested,我不应该存储直接关系(分类 - >博客,博客 - >主题),只有反向关系(博客 - > Categores,帖子 - >博客),当我需要获得某些类别的所有博客,执行一个简单的Blogs.find({category: cat_id}),但想一下如果我需要一些深的请求,如Get all Blogs where account_ID both owner and editor。假设事实上可能有很多博客,并且每个博客可能包含很多歌曲和edtiors,直接Blog.find {owner:acc_id, editor:acc_id}将会更快。那为什么我认为我需要双向链接。

所以,我的问题是:

  • 我真的需要对象之间的2-定向链接?
  • 如果是,是否有任何工具可以优化使用它?

也许我应该在Mongoose中使用某种多对多的关系?

谢谢!

+0

在我看来,你想建立对象之间的关系。请问为什么选择mongoDB?它的重点在于它是一个noSQL db。这意味着当你开始开发一个mongoDB应用程序时,你应该改变你的思维方式。你需要思考的不是关系,而是关于文章。每篇文章都应该完整。一旦你开始设计关系,你打破了NoSQL模型,你会讨厌mongoDB。你会认为这是最糟糕的,而事实并非如此。所以我会说找出你的设计,然后决定一个数据库。 – Zee

回答

0

不,你不需要双向链接。

所有你需要的是

Blog->Category 
Blog->Editors 
Blog->Owners 
Post->Blog 

因为你的类别和用户永远不会改变对象ID,那么你不必担心博客里更新引用。另外,当您想删除博客时,请勿删除记录。相反,请添加标记为已删除博客的标志。当您显示内容时,只需检查相应博客的删除标志,或者甚至为查询添加条件以完全避免这些结果。 (这也有保留历史的好处)

总而言之,不是创建双向链接,而是从更具体和可更改的内容链接到更多静态内容。要删除记录,您可以添加删除标记,不必担心追踪记录,或者您可以选择所有具有相关blog_id的帖子,并先删除它们。