2

コミュニティ ブログ エンジンを構築しているとします。

  • いくつかのカテゴリがありますCategory
  • 私たちはたくさんのブログを持っていますBlog
  • たくさんの投稿がありますPost
  • 私たちは多くの著者を持っていますAccount
  • Everyには複数のCategoryが含まれる場合がありますBlog
  • everyは複数のBlogに含まれる場合がありますCategory
  • Everyには複数のBlogが含まれる場合がありますPost
  • everyは複数のPostに含まれる場合がありますBlog
  • everyは、複数の のAccount両方ownerである場合があります。そのため、およびフィールドに複数の のObjectID の配列が含まれる場合があります。editorBlogBlogownereditor
  • EveryBlogは、複数の によって所有および編集されている場合がありますAccount。そのため、およびフィールドに複数Accountの のObjectID の配列が含まれる場合があります。ownereditor

スキーマは次のとおりです。

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 editorBlog.find {owner:acc_id, editor:acc_id}

だから、私の質問は:

  • オブジェクト間の双方向リンクは本当に必要ですか?
  • はいの場合、それを最適化するためのツールはありますか?

Mongoose で何らかの多対多の関係を使用する必要があるのではないでしょうか?

ありがとう!

4

1 に答える 1

0

いいえ、双方向リンクは必要ありません。

必要なのは

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

カテゴリとユーザーがオブジェクト ID を変更することはないため、ブログ内の参照の更新について心配する必要はありません。また、ブログを削除する場合は、レコードを削除しないでください。代わりに、ブログを削除済みとしてマークするフラグを追加します。コンテンツを表示するときは、対応するブログの削除フラグを確認するか、クエリに条件を追加して、それらの結果を完全に回避します。(これには履歴を保存するという利点もあります)

要約すると、双方向リンクを作成する代わりに、より具体的で変更可能なコンテンツからより静的なコンテンツにリンクすることができます。レコードを削除するには、削除フラグを追加してレコードの追跡を気にしないか、問題の blog_id を持つすべての投稿を選択して最初に削除することができます。

于 2013-07-25T07:41:59.063 に答える