ネストされた情報のためのより良いmongodbデータモデル

kcoder

私はmangodbのデータモデルを設計していますが、以下のjsonと同様の要件があります。

Single_Collection。

{

"collegeid": 1234,
"Name": "aaaa",
 "otherinfo": 1,

"studnet":[
    {
        "stdid": 1,
        "name": "n1"
    },
    {
        "stdid": 2,
        "name": "n2"
    }
]
}

2つのコレクション。

  1. 大学情報

    {
    "collegeid": 1234,
    "Name": "aaaa",
     "otherinfo": 1
    }
    

学生情報コレクション

    {
    "collegeid": 1234,
    "stdid": 1,
    "name": "n1"
    }

    {
    "collegeid": 1234,
    "stdid": 2,
    "name": "n2"
    }

読書パフォーマンスの中間(単一のコレクションを持っているか、それを分離する)のより良い方法はどれですか、私は与えられた学生IDが大学IDを見つけるようにもっと読んでいます。学生IDリストは非常に大きくなります。

また、私はより多くの学生挿入操作を実行します

yellowB

IMO、各モデル設計には独自の長所と短所があります。「より良い方法」とは、ユースケースによって異なります(データのクエリ方法?最初にすべてのデータが必要ですか?ページングが必要ですか?など)。 。)

要件から始めましょう。

あなたの要件

  1. 大学IDを指定して、この大学の学生を見つけます。
  2. 学生IDを指定して、彼の大学IDを調べます。

オブジェクト間の関係

1つの大学には多くの学生がいますが、各学生は1つの大学にしか滞在できないため、明らかに大学と学生は1:mマッピングです。

いくつかの異なるモデルデザインを紹介し、各モデルの長所と短所も示します。

アプローチ1-学生を大学に埋め込む

これはあなたが単一のコレクションとして言及したデザインです。

{
   "collegeid":1234,
   "Name":"aaaa",
   "otherinfo":1,
   "studnet":[
      {
         "stdid":1,
         "name":"n1"
      },
      {
         "stdid":2,
         "name":"n2"
      }
   ]
}

長所:

  1. 人間が読み取り、フロントエンドが表示するための非常に自然なモデル。
  2. 大学とその中のすべての学生をロードするときの良いパフォーマンス。エンジンに保存されているデータは連続しているためです。エンジンはそれを行うためにより少ないI / Oを必要とします。

短所:

  1. 大学に膨大な数の学生がいる場合、ドキュメントのサイズは非常に大きくなります。学生を頻繁に追加/削除/更新すると非効率になります。
  2. 要件(2)を達成するための迅速な方法はありません。大学->学生からのマッピングのみを維持するため、すべてのドキュメントを調べて、指定されたstudentIDが含まれている大学を見つける必要があります。

アプローチ2-学生は大学に言及している

これはあなたが2つのコレクションとして言及したデザインです。これはRDBMSテーブルに似ており、学生モデルはその大学への参照キーポイントを所有しています。

  1. カレッジコレクション:
{
   "collegeid":1234,
   "Name":"aaaa",
   "otherinfo":1
}
  1. 学生コレクション:
{
   "collegeid":1234,
   "stdid":1,
   "name":"n1"
}
{
   "collegeid":1234,
   "stdid":2,
   "name":"n2"
}

長所:

  1. 要件(1)および(2)を達成できます。インデックス"collegeid""stdid"フィールドを追加することを忘れないでください
  2. すべてのドキュメントを小さなサイズで管理できるため、エンジンがデータを簡単に保存できます。

短所:

  1. 大学と学生は分かれています。大学とそのすべての学生をロードする場合、アプローチ1よりも遅くなります(2つのクエリが必要です)。
  2. UIに表示する前に、大学と学生を自分でマージする必要があります。

アプローチ3-大学と学生の重複データ

このアプローチは、アプローチ1とアプローチ2を混同しているように見えます。2つのコレクションがあります。大学では、学生がそれ自体に埋め込まれ、別の学生コレクションもあります。したがって、学生データは両方のコレクションで複製されます。

  1. カレッジコレクション:
{
   "collegeid":1234,
   "Name":"aaaa",
   "otherinfo":1,
   "studnet":[         // duplicated here!
      {
         "stdid":1,
         "name":"n1"
      },
      {
         "stdid":2,
         "name":"n2"
      }
   ]
}
  1. 学生コレクション:
{
   "collegeid":1234,
   "stdid":1,
   "name":"n1"
}
{
   "collegeid":1234,
   "stdid":2,
   "name":"n2"
}

長所:

  1. アプローチ1とアプローチ2のすべての長所があります。

短所:

  1. 大学のコレクションのドキュメントは非常に大きくなります。
  2. 大学のコレクションと学生のコレクションのデータを自分で同期ておく必要があります。

アプローチ4-大学(studentIDのみ)と学生の重複データ

これはアプローチ3の変形です。ユースケースは次のとおりであると想定しています。

  1. ユーザーは大学を検索できます。
  2. ユーザーが検索結果で1つの大学をクリックします。
  3. 新しいUIは、すべての学生IDをユーザーに表示します(グリッドまたはリストに表示される場合があります)。
  4. ユーザーは1つの学生IDをクリックします。
  5. システムは指定された学生の完全なデータをロードし、別のUIでユーザーに表示します。

簡単に言うと、ユーザーは最初はすべての学生の完全なデータを必要とせず、学生の基本情報(学生IDなど)が必要なだけですユーザーがそのようなシナリオを受け入れる場合は、以下のモデルを使用できます。

  1. カレッジコレクション:
{
   "collegeid":1234,
   "Name":"aaaa",
   "otherinfo":1,
   "studnetIds":[1, 2]  // only student IDs are duplicated
}
  1. 学生コレクション:
{
   "collegeid":1234,
   "stdid":1,
   "name":"n1"
}
{
   "collegeid":1234,
   "stdid":2,
   "name":"n2"
}

大学にはスタッドネットIDしかありません。これがアプローチ3との違いです。

長所:

  1. 要件(1)および(2)を達成できます。
  2. 大学のドキュメントが巨大になることを心配する必要はありません。学生IDしか持っていないので。
  3. ユーザーが上記のシナリオを受け入れる場合、これはパフォーマンス/複雑さ/データサイズのバランスに関するより良い設計になります。

短所:

  1. 特定のユースケースに適しており、将来要件が変更された場合、シナリオが破られ、このモデルは適切ではありません。

概要

  1. ユースケースを明確にする必要があります。
  2. ユースケースに基づいて、アプローチを比較して、長所と短所を受け入れることができるかどうかを確認します。
  3. 負荷テストは重要です!

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

データベース情報を取得するためのより良い方法

分類Dev

Java 7でネストされたデータでnullを回避するためのより良い方法

分類Dev

Javascriptでネストされたデータにアクセスするためのより良いパターン

分類Dev

この単純なスキーマ設計(MongoDB)をモデル化するためのより良い方法は?

分類Dev

glomを使用してネストされたデータを取得するためのより良い方法をお探しですか?

分類Dev

Railsのjsonとしてネストされたモデルの検証エラーを返すより良い方法は?

分類Dev

Haskell、Aeson-USDAデータベースから必要な情報を取得するためのより良い方法はありますか?

分類Dev

Mongoosejs / Mongodb-ネストされたデータと新しいモデル

分類Dev

SnowFlakeのXMLデータからネストされたキー属性に関する情報を取得するにはどうすればよいですか?

分類Dev

Django:ビューまたはテンプレートのモデルからユーザー情報を取得するためのより良い方法は何ですか?

分類Dev

ネストされたモナドを処理するためのより良い方法は?

分類Dev

コモドール64のタイルデータを動的に更新するためのより良い方法

分類Dev

ネストされた配列を印刷するためのより良い方法

分類Dev

ネストされたif-elseステートメントを記述するためのより良い方法

分類Dev

ネストされたループのより良い代替手段

分類Dev

バックボーンを使用して、オブジェクトの特定のネストされた配列に新しいモデル情報を設定するにはどうすればよいですか?

分類Dev

MySQLモデルに整数のリストを保存するためのより良い方法はありますか?

分類Dev

このモジュールのデバッグ情報にソース情報がありません-PDBが正常にロードされました

分類Dev

Python-ネストされたforループよりも複雑なリストを繰り返すためのより良い方法

分類Dev

データを表示するためのネストされたforeachループ

分類Dev

qmlのネストされたリスト:モデルのデータモデル

分類Dev

nodejsを使用して、データモデルのネストされたオブジェクトからmongodbのデータコレクションにデータを入力するにはどうすればよいですか?

分類Dev

VB.net、WPF、ネストされたデータモデル:データベースに書き戻す最良の方法は?

分類Dev

動的に更新されたページにHTMLを含めるためのより良い方法:php include()またはMySQLデータベース?

分類Dev

c#ネストされた辞書、より良い代替手段?3つのクラス間でデータを整理するのが最適

分類Dev

データベースに挿入されたオブジェクトの戻り情報

分類Dev

intデータ型で表される年のリストをDatetimeIndexに変換するためのより良い方法

分類Dev

次のうち、モーゼをトレーニングおよび調整するためのより良いデータセットはどれですか?

分類Dev

neo4jムービーグラフデータベースでRATED関係をモデル化するためのより良い方法

Related 関連記事

  1. 1

    データベース情報を取得するためのより良い方法

  2. 2

    Java 7でネストされたデータでnullを回避するためのより良い方法

  3. 3

    Javascriptでネストされたデータにアクセスするためのより良いパターン

  4. 4

    この単純なスキーマ設計(MongoDB)をモデル化するためのより良い方法は?

  5. 5

    glomを使用してネストされたデータを取得するためのより良い方法をお探しですか?

  6. 6

    Railsのjsonとしてネストされたモデルの検証エラーを返すより良い方法は?

  7. 7

    Haskell、Aeson-USDAデータベースから必要な情報を取得するためのより良い方法はありますか?

  8. 8

    Mongoosejs / Mongodb-ネストされたデータと新しいモデル

  9. 9

    SnowFlakeのXMLデータからネストされたキー属性に関する情報を取得するにはどうすればよいですか?

  10. 10

    Django:ビューまたはテンプレートのモデルからユーザー情報を取得するためのより良い方法は何ですか?

  11. 11

    ネストされたモナドを処理するためのより良い方法は?

  12. 12

    コモドール64のタイルデータを動的に更新するためのより良い方法

  13. 13

    ネストされた配列を印刷するためのより良い方法

  14. 14

    ネストされたif-elseステートメントを記述するためのより良い方法

  15. 15

    ネストされたループのより良い代替手段

  16. 16

    バックボーンを使用して、オブジェクトの特定のネストされた配列に新しいモデル情報を設定するにはどうすればよいですか?

  17. 17

    MySQLモデルに整数のリストを保存するためのより良い方法はありますか?

  18. 18

    このモジュールのデバッグ情報にソース情報がありません-PDBが正常にロードされました

  19. 19

    Python-ネストされたforループよりも複雑なリストを繰り返すためのより良い方法

  20. 20

    データを表示するためのネストされたforeachループ

  21. 21

    qmlのネストされたリスト:モデルのデータモデル

  22. 22

    nodejsを使用して、データモデルのネストされたオブジェクトからmongodbのデータコレクションにデータを入力するにはどうすればよいですか?

  23. 23

    VB.net、WPF、ネストされたデータモデル:データベースに書き戻す最良の方法は?

  24. 24

    動的に更新されたページにHTMLを含めるためのより良い方法:php include()またはMySQLデータベース?

  25. 25

    c#ネストされた辞書、より良い代替手段?3つのクラス間でデータを整理するのが最適

  26. 26

    データベースに挿入されたオブジェクトの戻り情報

  27. 27

    intデータ型で表される年のリストをDatetimeIndexに変換するためのより良い方法

  28. 28

    次のうち、モーゼをトレーニングおよび調整するためのより良いデータセットはどれですか?

  29. 29

    neo4jムービーグラフデータベースでRATED関係をモデル化するためのより良い方法

ホットタグ

アーカイブ