2011-06-11 21 views
10

Estoy en el proceso de desarrollo del software Route Tracking/Optimization para mi empresa de recogida de basuras y me gustaría recibir algunos comentarios sobre mi estructura/situación de datos actual.MongoDB Estructura de base de datos y prácticas recomendadas Ayuda

Aquí es una versión simplificada de la estructura de mi MongoDB:

base de datos: datos de

Colecciones:

“clientes” - recolección de datos que contiene todos los datos de los clientes.

[ 
    { 
     "cust_id": "1001", 
     "name": "Customer 1", 
     "address": "123 Fake St", 
     "city": "Boston" 
    }, 
    { 
     "cust_id": "1002", 
     "name": "Customer 2", 
     "address": "123 Real St", 
     "city": "Boston" 
     }, 
    { 
     "cust_id": "1003", 
     "name": "Customer 3", 
     "address": "12 Elm St", 
     "city": "Boston" 
    }, 
    { 
     "cust_id": "1004", 
     "name": "Customer 4", 
     "address": "16 Union St", 
     "city": "Boston" 
     }, 
    { 
     "cust_id": "1005", 
     "name": "Customer 5", 
     "address": "13 Massachusetts Ave", 
     "city": "Boston" 
    }, { ... }, { ... }, ... 
] 

“camiones” - recolección de datos que contiene todos los datos de camiones.

[ 
    { 
     "truckid": "21", 
     "type": "Refuse", 
     "year": "2011", 
     "make": "Mack", 
     "model": "TerraPro Cabover", 
     "body": "Mcneilus Rear Loader XC", 
     "capacity": "25 cubic yards" 
    }, 
    { 
     "truckid": "22", 
     "type": "Refuse", 
     "year": "2009", 
     "make": "Mack", 
     "model": "TerraPro Cabover", 
     "body": "Mcneilus Rear Loader XC", 
     "capacity": "25 cubic yards" 
    }, 
    { 
     "truckid": "12", 
     "type": "Dump", 
     "year": "2006", 
     "make": "Chevrolet", 
     "model": "C3500 HD", 
     "body": "Rugby Hydraulic Dump", 
     "capacity": "15 cubic yards" 
    } 
] 

“drivers” - recolección de datos que contiene todos los datos del conductor.

[ 
    { 
     "driverid": "1234", 
     "name": "John Doe" 
    }, 
    { 
     "driverid": "4321", 
     "name": "Jack Smith" 
    }, 
    { 
     "driverid": "3421", 
     "name": "Don Johnson" 
    } 
] 

“Ruta-listas” - colección de datos que contiene todas las listas de rutas predeterminadas.

[ 
    { 
     "route_name": "monday_1", 
     "day": "monday", 
     "truck": "21", 
     "stops": [ 
      { 
       "cust_id": "1001" 
      }, 
      { 
       "cust_id": "1010" 
      }, 
      { 
       "cust_id": "1002" 
      } 
     ] 
    }, 
    { 
     "route_name": "friday_1", 
     "day": "friday", 
     "truck": "12", 
     "stops": [ 
      { 
       "cust_id": "1003" 
      }, 
      { 
       "cust_id": "1004" 
      }, 
      { 
       "cust_id": "1012" 
      } 
     ] 
    } 
] 

"rutas" - colecciones de datos que contienen los datos para todas las rutas activos y terminados.

[ 
    { 
     "routeid": "1", 
     "route_name": "monday1", 
     "start_time": "04:31 AM", 
     "status": "active", 
     "stops": [ 
      { 
       "customerid": "1001", 
       "status": "complete", 
       "start_time": "04:45 AM", 
       "finish_time": "04:48 AM", 
       "elapsed_time": "3" 
      }, 
      { 
       "customerid": "1010", 
       "status": "complete", 
       "start_time": "04:50 AM", 
       "finish_time": "04:52 AM", 
       "elapsed_time": "2" 
      }, 
      { 
       "customerid": "1002", 
       "status": "incomplete", 
       "start_time": "", 
       "finish_time": "", 
       "elapsed_time": "" 
      }, 
      { 
       "customerid": "1005", 
       "status": "incomplete", 
       "start_time": "", 
       "finish_time": "", 
       "elapsed_time": "" 
      } 
     ] 
    } 
] 

Aquí es el proceso hasta el momento:

conductores

Cada día comienzan iniciando una nueva ruta.Antes de comenzar una nueva conductores de ruta debe en primer lugar los datos de entrada:

  1. DriverID
  2. fecha
  3. camión

Una vez que se ha introducido correctamente todos los datos del inicio de una nueva ruta comenzar:

  1. Crear nuevo objeto en la colección “rutas”
  2. consulta de la colección “Ruta de las listas” para “día” + “camión” partido y volver "detiene"
  3. Insertar “ route-listas” de datos en ‘rutas’ colección

Como el conductor procede con sus paradas/tareas diarias, la colección "rutas" se actualizará en consecuencia.

Al completar todas las tareas, el controlador tendrá la capacidad de completar el proceso de ruta simplemente cambiando el campo "estado" a "activo" de "completo" en la colección "rutas".

Eso lo resume todo. Todos los comentarios, opiniones, comentarios, enlaces, tácticas de optimización son muy apreciados.

Gracias de antemano por su tiempo.

Respuesta

11

Su esquema de base de datos se parece a mí como esquema de base de datos relacional 'clásico'. Mongodb es adecuado para la desnormalización de datos. Supongo que cuando muestra las rutas carga todos los clientes relacionados, conductor, camión.

Si desea que su sistema sea realmente rápido, puede incluir todo en la colección de rutas.

por lo que sugiero siguientes modificaciones de su esquema:

  1. clientes - como está
  2. camiones - como está
  3. conductores - como está
  4. ruta-list:

    Incrustar datos sobre clientes dentro de paradas en lugar de referencia. También camión empotrado.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 
         } 
        }] 
    } 
    
  5. rutas:

    Cuando controlador de partida nueva ruta copia ruta de la ruta-lista y además embedd información para el 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" 
        }] 
    } 
    

I Supongo que te preguntas qué hacer si el controlador, el cliente u otros datos desnormalizados han cambiado en la colección principal. Sí, necesitas actualizar todos los datos desnormalizados dentro de otras colecciones. Es probable que necesite actualizar miles de millones de documentos (depende del tamaño de su sistema) y está bien. Puedes hacerlo de manera sincronizada si lleva mucho tiempo.

¿Qué beneficios tiene la estructura de datos anterior?

  1. Cada documento contiene todos los datos que puede necesitar para mostrar en su aplicación. Entonces, por ejemplo, no necesita cargar clientes relacionados, conductor, camión cuando necesite rutas de exhibición.
  2. Puede realizar consultas difíciles a su base de datos. Por ejemplo, en su esquema puede generar consultas que devolverán todas las rutas que contengan paradas en stop del cliente con name = "Bill" (primero debe cargar al cliente por nombre, obtener la identificación y buscar por ID del cliente en su esquema actual).

Probablemente se esté preguntando que sus datos pueden no estar sincronizados en algunos casos, pero para resolver esto solo necesita construir unas pocas unidades de prueba para asegurarse de que actualiza correctamente sus datos denodolizados.

La esperanza anterior te ayudará a ver el mundo desde el lado no relacional, desde el punto de vista de la base de datos de documentos.

+0

¿Qué sucede si la información del cliente o del camión o el conductor está actualizada en el sistema? Creará ambigüedad de los datos. Mejor mantener solo los identificadores de otros modelos. –

Cuestiones relacionadas