Mongodb-data-modeling
提供:Dev Guides
MongoDB-データモデリング
MongoDBのデータには、同じコレクション内の柔軟なschema.documentsがあります。 コレクションのドキュメント内の共通フィールドは、同じフィールドセットや構造を持つ必要はありません。異なるタイプのデータを保持できます。
データモデルの設計
MongoDBは、2種類のデータモデルを提供します。—埋め込みデータモデルと正規化データモデル。 要件に基づいて、ドキュメントの準備中にどちらのモデルも使用できます。
埋め込みデータモデル
このモデルでは、1つのドキュメントにすべての関連データを含める(埋め込む)ことができます。これは、非正規化データモデルとも呼ばれます。
たとえば、Personal_details、Contact、Addressの3つの異なるドキュメントで従業員の詳細を取得していると仮定すると、以下に示すように、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"
}
}
正規化されたデータモデル
このモデルでは、参照を使用して、元のドキュメントのサブドキュメントを参照できます。 たとえば、上記のドキュメントを正規化モデルで次のように書き直すことができます。
社員:
{
_id: <ObjectId101>,
Emp_ID: "10025AE336"
}
- Personal_details:*
{
_id: <ObjectId102>,
empDocID: " ObjectId101",
First_Name: "Radhika",
Last_Name: "Sharma",
Date_Of_Birth: "1995-09-26"
}
接触:
{
_id: <ObjectId103>,
empDocID: " ObjectId101",
e-mail: "[email protected]",
phone: "9848022338"
}
住所:
{
_id: <ObjectId104>,
empDocID: " ObjectId101",
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つのコレクションからのみ表示されます。