English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

MongoDB データモデル

MongoDB内のデータは柔軟なスキーマ schema.documents で同一コレクション内に存在します。同一コレクション内のドキュメントは、同じフィールドセットやコレクション内の公共フィールドを持つ必要はありません。ドキュメントは異なるデータタイプを含むことができます。

データモデルの設計

MongoDBは2種類のデータモデルを提供します:エンブディングデータモデルと標準化データモデル。必要に応じて、準備中のドキュメントにこれらのモデルのうちの1つを使用できます。

エンブディングデータモデル

このモデルでは、すべての関連データ(エンブディング)を1つのドキュメントにまとめることができます。これも非標準化データモデルと呼ばれます。

例えば、私たちが3つの異なるドキュメント(Personal_details、Contact、Address)から従業員の詳細情報を取得する場合、すべての3つのドキュメントを1つのドキュメントにエンブディングすることができます。以下のように表示されます:

{
	_id:,
	Emp_ID: ""10025AE336"
	Personal_details:{
		First_Name: "Radhika",
		Last_Name: "Sharma",
		Date_Of_Birth: ""1995-09-26"
	},
	Contact: {
		e-mail: "[email protected]"
		phone: ""9848022338"
	},
	Address: {
		city: "Hyderabad",
		Area: "Madapur",
		State: "Telangana"
	}
}

標準化データモデル

このモデルでは、元のドキュメントのサブドキュメントを参照するために参照を使用できます。例えば、以下のドキュメントを標準化モデルとして再書き込みできます:

Employee:

{
	_id: "ObjectId"101>,
	Emp_ID: ""10025AE336"
}

Personal_details:

{
	_id: "ObjectId"102>,
	empDocID: " ObjectId"101"
	First_Name: "Radhika",
	Last_Name: "Sharma",
	Date_Of_Birth: ""1995-09-26"
}

Contact:

{
	_id: "ObjectId"103>,
	empDocID: " ObjectId"101"
	e-mail: "[email protected]"
	phone: ""9848022338"
}

Address:

{
	_id: "ObjectId"104>,
	empDocID: " ObjectId"101"
	city: "Hyderabad",
	Area: "Madapur",
	State: "Telangana"
}

MongoDBでアーキテクチャを設計する際の注意点

  • ユーザーの要求に応じてアーキテクチャを設計します。

  • それらを一緒に使用する場合、それらを1つのドキュメントに組み合わせます。それ以外の場合、それらを分離します(ただし、接続が必要でないことを確認してください)。

  • データをコピーします(ただし制限があります)、なぜならディスクスペースは計算時間よりも安価だからです。

  • 書き込み時に結合を行い、読み込み時に結合を行わないでください。

  • 最も一般的な用例に対してあなたのプランを最適化します。

  • アーキテクチャで複雑な集約を行います。

オンラインの例

仮に顧客がブログに/ウェブサイトはデータベース設計を行い、RDBMSとMongoDBの設計間の違いを確認します。ウェブサイトには以下の要件があります。

  • 各投稿にはユニークなタイトル、説明、URLがあります。

  • 各投稿には1つまたは複数のタグが含まれることができます。

  • 各投稿には投稿者の名前といいねの合計数があります。

  • 各投稿にはユーザーが提供したコメント、名前、メッセージ、データ時間、いいねが含まれています。

  • 各投稿には、0個または複数のコメントが含まれることができます。

RDBMS アーキテクチャでは、上記の要件に対するデザインは少なくとも3つのテーブルを持つでしょう。

MongoDB モードでは、デザインは1つの投稿コレクションと以下の構造を持つでしょう-

{
   _id: POST_ID
   title: TITLE_OF_POST, 
   description: POST_DESCRIPTION,
   by: POST_BY,
   url: URL_OF_POST,
   tags: [TAG1, TAG2, TAG3],
   likes: TOTAL_LIKES, 
   comments: [	
      {
         user:'COMMENT_BY',
         message: TEXT,
         dateCreated: DATE_TIME,
         like: LIKES 
      },
      {
         user:'COMMENT_BY',
         message: TEXT,
         dateCreated: DATE_TIME,
         like: LIKES
      }
   ]
}

したがって、データを表示する際には、RDBMSでは3つのテーブルに接続する必要がありますが、MongoDBではデータは1つのコレクションから表示されます。