MongoDB設計方法及びテクニック例の詳細


前言
MongoDBは人気のあるデータベースです。どのテーブルもschemaモードに制約されずに作業できます。データはJSONのような形式で保存され、異なる種類のデータ構造を含むことができる。例えば、同じセットのcollectionにおいて、以下の2つの文書documentを持つことができる。

{
  id: '4',
  name: 'Mark',
  age: '21',
  addresses : [
    { street: '123 Church St', city: 'Miami', cc: 'USA' },
    { street: '123 Mary Av', city: 'Los Angeles', cc: 'USA' }
  ]
}

{
  id: '15',
  name: 'Robin',
  department: 'New Business',
  example: '[email protected]'
}
MongoDBの利点を十分に活用するためには、基本的なデータベース設計の原則を理解して遵守しなければなりません。設計方法を説明する前に、まずMongoDBのデータを記憶する仕組みを理解しなければなりません。
一、データはどうやってMongoDBに保存しますか?
従来のRDBMS関係型データベースと違って、MongoDBはテーブルテーブルテーブルテーブルテーブルテーブルテーブルテーブルテーブルテーブルテーブルテーブルテーブルテーブルテーブルテーブルテーブルテーブルテーブル、行rowと列columnの概念がない。これは、集合collection、ドキュメントdocuments、フィールドfieldsにデータを格納します。下図は、RDBMSとの構造の関係を説明しています。

二、データベース設計技術とコツ
2.1.規範化された記憶と非正規化された記憶
MongoDBはドキュメントを使ってデータを記憶するので、「規範化記憶」と「非正規化記憶」の概念を理解することが重要です。
正規化記憶:−正規化は、データを複数のセットのcollectionに格納し、それらの間で関連関係を設計することを意味する。データを保存してから、データを更新しやすいです。しかし、データを読み込む際には、規格化された記憶の欠点が現れます。複数のセットからデータを検索する場合は、複数のクエリーを実行して、データの読み込み速度を遅くする必要があります。例えば、ページタイトル、著者、コンテンツをそれぞれ異なるコレクションに格納する)
非正規化記憶:-このようにいくつかのオブジェクトデータを入れ子として単一のドキュメントに格納します。データを読み取る時には表現がより良いですが、書き込み時には遅くなります。このようなデータを格納する方式はさらに多くの空間を占有する(例えば、ページタイトル、著者、コンテンツをそれぞれ同じコレクションに格納する)
二つの保存データ方式の間で選択する前に、あなたのアプリケーションデータベースの使い方を評価してください。
頻繁に更新する必要がないデータがある場合は、更新の即時一致は重要ではないが、読み取り時に良好な性能が必要であれば、非正規化は賢明な選択かもしれない。例えば、私達のブログのブログは、作者が保存したら、ほとんど頻繁に修正しないですが、読者の頻繁な読み取り操作に直面しています。
データベース内の文書データを更新し続ける必要がある場合、書き込み時に良好な性能を期待すると、正規化された記憶を考慮する必要があります。例えば、頻繁にデータを修正する必要がある業務系システム)
2.2.一対多関係
RDBMSに比べ、MongoDBでは「ペアが多い」関係のモデリングに対して、より微細な設計が必要です。多くの初心者は、ドキュメント配列を親ドキュメントに埋め込む落とし穴にはまっています。上記で紹介したように、いつ規範化された記憶が行われるか、または非正規化された記憶が重要であるかを知ることができる。そのため、設計者は関係の基数を考慮する必要があります。「1対少数」ですか?それとも「1対複数」ですか?各関係は異なるモデリング方法を持つであろう。
例えば、以下の「1対少数数」のモデリングの例である。最適なモデリング方法は、親文書(persopn)にいくつかの(address)を埋め込むことである。

> db.person.findOne()
{
 name: 'Mark Kornfield',
 ssn: '1223-234-75554',
 addresses : [
   { street: '123 Church St', city: 'Miami', cc: 'USA' },
   { street: '123 Mary Av', city: 'Los Angeles', cc: 'USA' }
 ]
}
「1つの対複数」の例では、2つのセットを設計すること、すなわちプロダクトセットと部品partsセットを検討します。各部品には「ObjectID」があります。この「ObjectID」は製品セットの引用に登場します。このような設計は読み書きの性能をより効率的にすることができる。

> db.parts.findOne()
{
  _id : ObjectID('AAAA'),
  partno : '1224-dsdf-2215',
  name : 'bearing',
  price: 2.63

> db.products.findOne()
{
  name : 'car',
  manufacturer : 'Ford',
  catalog_number: 2234,
  parts : [   // array of references to Part documents
    ObjectID('AAAA'),  // reference to the bearing above
    ObjectID('F17C'),  // reference to a different Part
    ObjectID('D2AA'),
    // etc
]
2.3.設計モードの可視化
MongoDBはschemalessの「モードなし」であるにもかかわらず、集合collectionをグラフ化する方法がある。図面を見ることができます。MongoDBを理解し設計する方法に大きな影響を与えます。
DbSchemaは視覚化設計の仕事をよく完成させるツールである。図のように、集合とドキュメントを読み取ることによってアーキテクチャを導出する。また、クリックするだけで図中のオブジェクトを変更できます。DbSchemaでは、MongoDBのために外キーを作成することもできます。もちろんローカルでのみ作成され、デザインの目的だけに使用されます。

2.4.スマートインデックス
データベースの性能を良好に保つためには、書き込みと読み取りの操作を簡単にするために、スマートインデックスを確立する必要があります。MongoDBのインデックスの利点と限界が非常に重要であることを知っていて、MongoDBは並べ替え操作に使うメモリを保留して32 MBに制限します。インデックスを使用しない場合、並べ替え時にデータベースはすべての並べ替えられたドキュメントをメモリ内に残すように強制されます。32 Mの制限に達すると、データベースはエラーまたは空セットに戻ります。
結論
MongoDBに対する徹底的な理解とデータベースの達成したい目標の明確な理解は、良好なデータベース設計の秘訣である。
締め括りをつける
ここでは、MongoDBのデザイン方法とテクニックについての文章を紹介します。MongoDBのデザイン方法とノウハウについては、以前の文章を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。