猫鼬 - 物体之间的多重关系

时间:2013-07-13 12:15:59

标签: database-design architecture mongoose

假设我正在构建一个社区博客引擎:

  • 我们有几个类别Category
  • 我们有很多博客Blog
  • 我们有很多帖子Post
  • 我们可能有作者Account
  • 每个Category可能包含多个Blog
  • 每个Blog可能包含在多个Category
  • 每个Blog可能包含多个Post
  • 每个Post可能包含在多个Blog
  • 每个Account可能是多个owner的{​​{1}}和editor。这就是为什么它可能包含BlogBlog字段中几个owner的ObjectID数组。
  • 每个editor可能由多个Blog拥有和编辑。这就是为什么它可能包含AccountAccount字段中几个owner的ObjectID数组。

这是一个架构:

editor

每个帖子还可能包含可能仅与此对象相关的赞,评论和其他对象。

问题是当我尝试添加新的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或删除时 - 我必须在很多对象中的各种数组字段中查找,检查,修改/删除大量记录。

我是suggested,我不应该存储直接关系(类别 - >博客,博客 - >帖子),只能反向关系(博客 - >分类,帖子 - >博客),当我需要获取某个类别中的所有博客时,请执行一个简单的Blog,但想想如果我需要一些请求,例如Blogs.find({category: cat_id})将会是什么。假设可能有很多博客,每个博客都可能包含很多onwers和edtiors,直接Get all Blogs where account_ID both owner and editor会更快。这就是为什么我认为我需要双向链接。

所以,我的问题是:

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

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

谢谢!

1 个答案:

答案 0 :(得分:0)

不,你不需要双向链接。

你需要的只是

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

因为您的类别和用户永远不会更改对象ID,所以您不必担心更新博客内的引用。此外,如果要删除博客,请不要删除记录。而是添加一个标记,将博客标记为已删除。当您显示内容时,只需检查相应博客的删除标记,甚至为查询添加条件以完全避免这些结果。 (这也有保留历史的好处)

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