Su esquema de base de datos me parece un esquema de base de datos relacional 'clásico'. Mongodb se adapta bien a la desnormalización de datos. Supongo que cuando muestra rutas está cargando todos los clientes relacionados, conductor, camión.
Si desea que su sistema sea realmente rápido, puede incorporar todo en la recopilación de rutas.
Así que sugiero seguir las modificaciones de su esquema:
- clientes - tal cual
- camiones - tal cual
- controladores - tal cual
-
lista de rutas:
Incruste datos sobre los clientes dentro de las paradas en lugar de referencia. También incrustar camión. En este caso el esquema será:
{ "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 } }] }
-
rutas:
Cuando el conductor inicia una nueva ruta, copie la ruta de la lista de rutas y, además, incorpore la información del conductor:
{ //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" }] }
Supongo que se está preguntando qué hacer si el controlador, el cliente u otros datos desnormalizados cambiaron en la colección principal. Sí, necesita actualizar todos los datos desnormalizados dentro de otras colecciones. Probablemente necesitará actualizar miles de millones de documentos (depende del tamaño de su sistema) y está bien. Puede hacerlo de forma asíncrona si le llevará mucho tiempo.
¿Qué beneficios tiene la estructura de datos anterior?
- Cada documento contiene todos los datos que puede necesitar mostrar en su aplicación. Entonces, por ejemplo, no necesita cargar clientes relacionados, conductor, camión cuando necesita mostrar rutas.
- Puede realizar cualquier consulta difícil a su base de datos. Por ejemplo, en su esquema puede crear una consulta que devolverá todas las rutas que contengan paradas en la parada del cliente con nombre ="Factura" (primero necesita cargar el cliente por nombre, obtener la identificación y buscar la identificación del cliente en su esquema actual).
Probablemente se esté preguntando si sus datos se pueden desincronizar en algunos casos, pero para resolver esto solo necesita crear algunas pruebas unitarias para asegurarse de que actualiza sus datos desnormolizados correctamente.
La esperanza anterior lo ayudará a ver el mundo desde un lado no relacional, desde el punto de vista de la base de datos de documentos.