あなたのデータベーススキーマは、私にとっては「クラシック」リレーショナルデータベーススキーマのように見えます。 Mongodbはデータの非正規化に最適です。ルートを表示すると、関連するすべての顧客、ドライバー、トラックをロードしていると思います。
システムを非常に高速にしたい場合は、ルートコレクションにすべてを埋め込むことができます。
したがって、スキーマを次のように変更することをお勧めします。
- 顧客-現状のまま
- トラック-現状のまま
- ドライバー-現状のまま
-
ルートリスト:
参照ではなく、停車地内の顧客に関するデータを埋め込みます。また、トラックを埋め込みます。この場合、スキーマは次のようになります。
{ "route_name": "monday_1", "day": "monday", "truck": { _id = 1, // here will be all truck data }, "stops": [{ "customer": { _id = 1, //here will be all customer data } }, { "customer": { _id = 2, //here will be all customer data } }] }
-
ルート:
ドライバーがルートリストからルートをコピーし、さらにドライバー情報を埋め込む場合:
{ //copy all route-list data (just make new id for the current route and leave reference to routes-list. In this case you will able to sync route with route-list.) "_id": "1", route_list_id: 1, "start_time": "04:31 AM", "status": "active", driver: { //embedd all driver data here }, "stops": [{ "customer": { //all customer data }, "status": "complete", "start_time": "04:45 AM", "finish_time": "04:48 AM", "elapsed_time": "3" }] }
ドライバー、顧客、またはその他の非正規化されたデータがメインコレクションで変更された場合はどうするかを自問してみてください。ええ、他のコレクション内のすべての非正規化データを更新する必要があります。おそらく数十億のドキュメントを更新する必要があり(システムのサイズによって異なります)、問題ありません。時間がかかる場合は、非同期で実行できます。
上記のデータ構造にはどのようなメリットがありますか?
- 各ドキュメントには、アプリケーションで表示する必要のあるすべてのデータが含まれています。したがって、たとえば、表示ルートが必要な場合、負荷に関連する顧客、ドライバー、トラックは必要ありません。
- データベースに対して難しいクエリを実行できます。たとえば、スキーマでは、name ="Bill"の顧客の停車地を含むすべてのルートを返すクエリを作成できます(最初に顧客を名前でロードし、IDを取得し、現在のスキーマで顧客IDで検索する必要があります)。
おそらく、データが非同期になる可能性があることを自問しますが、これを解決するには、いくつかの単体テストを作成して、正規化されていないデータを正しく更新することを確認する必要があります。
上記の希望が、ドキュメントデータベースの観点から、リレーショナル側ではなく世界を見るのに役立つことを願っています。