Ditt databasschema ser för mig ut som ett "klassiskt" relationsdatabasschema. Mongodb passar bra för datadenormalisering. Jag antar att när du visar rutter laddar du alla relaterade kunder, chaufför, lastbil.
Om du vill göra ditt system riktigt snabbt kan du bädda in allt i ruttsamlingen.
Så jag föreslår följande ändringar av ditt schema:
- kunder – i befintligt skick
- lastbilar - i befintligt skick
- förare - i befintligt skick
-
ruttlista:
Bädda in data om kunder i hållplatser istället för referens. Även inbyggd lastbil. I det här fallet kommer schemat att vara:
{ "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 } }] }
-
rutter:
När föraren startar ny rutt, kopiera rutt från ruttlistan och bädda dessutom in förarinformation:
{ //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" }] }
Jag antar att du frågar dig själv vad gör om föraren, kund eller annan denormaliserad data ändras i huvudsamlingen. Ja, du måste uppdatera all denormaliserad data i andra samlingar. Du kommer förmodligen att behöva uppdatera miljarder dokument (beror på din systemstorlek) och det är okej. Du kan göra det asynkront om det tar mycket tid.
Vilka fördelar finns med ovanstående datastruktur?
- Varje dokument innehåller all data som du kan behöva visa i din ansökan. Så du behöver till exempel inga lastrelaterade kunder, chaufförer, lastbilar när du behöver visa rutter.
- Du kan göra alla svåra frågor till din databas. Till exempel i ditt schema kan du bygga en fråga som kommer att returnera alla rutter som innehåller stopp i stopp för kund med namn ="Bill" (du måste ladda kund efter namn först, hämta id och leta efter kund-id i ditt nuvarande schema).
Förmodligen frågar du dig själv att din data kan vara osynkroniserad i vissa fall, men för att lösa detta behöver du bara bygga några enhetstest för att säkerställa att du uppdaterar din denormoliserade data korrekt.
Hoppas ovan kommer att hjälpa dig att se världen från en inte relationell sida, från dokumentdatabas synvinkel.