2

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

  • 我们有几个类别Category
  • 我们有很多博客Blog
  • 我们有很多帖子Post
  • 我们有可能的作者Account
  • 每个可能包含Category几个Blog
  • 每一个都可能Blog包含在几个Category
  • 每个可能包含Blog几个Post
  • 每一个都可能Post包含在几个Blog
  • 每一个都Account可能是ownereditor几个Blog的。这就是为什么它可能包含多个Blog's inownereditor字段的 ObjectID 数组。
  • 每一个都Blog可能被几个Account's 拥有和编辑。这就是为什么它可能包含多个字段的AccountObjectIDowner数组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"
  ]
)

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

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

有人建议,我不应该存储直接关系(类别 --> 博客、博客 --> 帖子),只存储反向关系(博客 --> 类别、帖子 --> 博客),以及当我需要获取所有博客时某些类别,执行一个简单的Blogs.find({category: cat_id}),但如果我需要一些深层请求,比如Get all Blogs where account_ID both owner and editor. 假设可以有很多博客,并且每个博客都可能包含很多作者和编辑,那么直接Blog.find {owner:acc_id, editor:acc_id}会更快。这就是为什么我认为我需要双向链接。

所以,我的问题是:

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

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

谢谢!

4

1 回答 1

0

不,您不需要双向链接。

你所需要的只是

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

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

总而言之,您可以从更具体和可变的内容链接到更静态的内容,而不是创建双向链接。要删除记录,您可以添加删除标志而不必担心追逐记录,或者您可以选择所有具有该 blog_id 的帖子并先将其删除。

于 2013-07-25T07:41:59.063 回答