Je databaseschema ziet er voor mij uit als een 'klassiek' relationeel databaseschema. Mongodb goed geschikt voor denormalisatie van gegevens. Ik denk dat wanneer je routes weergeeft, je alle gerelateerde klanten, chauffeur, vrachtwagen laadt.
Als je je systeem echt snel wilt maken, kun je alles in de routeverzameling insluiten.
Dus ik stel voor de volgende wijzigingen van uw schema te volgen:
- klanten - zoals het is
- vrachtwagens - zoals ze zijn
- stuurprogramma's - zoals het is
-
routelijst:
Sluit gegevens over klanten in tussen haltes in plaats van referentie. Ook vrachtwagen inbouwen. In dit geval is het schema:
{ "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 } }] }
-
routes:
Wanneer de bestuurder een nieuwe route start, kopieert u de route uit de routelijst en voegt u bovendien bestuurdersinformatie toe:
{ //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" }] }
Ik denk dat je jezelf afvraagt wat te doen als de bestuurder, klant of andere gedenormaliseerde gegevens in de hoofdverzameling zijn gewijzigd. Ja, je moet alle gedenormaliseerde gegevens binnen andere collecties bijwerken. U zult waarschijnlijk miljarden documenten moeten bijwerken (afhankelijk van de grootte van uw systeem) en dat is oké. Je kunt het asynchroon doen als het veel tijd kost.
Wat is handig in bovenstaande datastructuur?
- Elk document bevat alle gegevens die u mogelijk in uw toepassing moet weergeven. U heeft dus bijvoorbeeld geen lastgerelateerde klanten, chauffeur of vrachtwagen nodig als u routes wilt weergeven.
- U kunt elke moeilijke query naar uw database maken. In uw schema kunt u bijvoorbeeld een query maken die alle routes retourneert die stops in de stop van de klant bevatten met naam ="Bill" (u moet eerst klant op naam laden, id ophalen en zoeken op klant-id in uw huidige schema).
Waarschijnlijk vraagt u zich af of uw gegevens in sommige gevallen niet gesynchroniseerd kunnen zijn, maar om dit op te lossen, hoeft u alleen maar een paar eenheidstests te bouwen om ervoor te zorgen dat u uw gedenormeerde gegevens correct bijwerkt.
Hoop hierboven zal je helpen om de wereld te zien van een niet relationele kant, vanuit het oogpunt van de documentdatabase.