Twój schemat bazy danych wygląda dla mnie jak „klasyczny” schemat relacyjnej bazy danych. Mongodb dobrze nadaje się do denormalizacji danych. Myślę, że kiedy wyświetlasz trasy, ładujesz wszystkich powiązanych klientów, kierowcę, ciężarówkę.
Jeśli chcesz, aby Twój system był naprawdę szybki, możesz osadzić wszystko w kolekcji tras.
Proponuję więc następujące modyfikacje twojego schematu:
- klienci – w stanie, w jakim są
- ciężarówki – w stanie, w jakim są
- sterowniki - w stanie, w jakim są
-
lista tras:
Osadzaj dane o klientach wewnątrz przystanków zamiast referencji. Wbudowana również ciężarówka. W tym przypadku schemat będzie wyglądał następująco:
{ "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 } }] }
-
trasy:
Gdy kierowca rozpoczyna nową trasę, skopiuj trasę z listy tras i dodatkowo wstaw informacje o kierowcy:
{ //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" }] }
Myślę, że zadajesz sobie pytanie, co zrobić, jeśli kierowca, klient lub inne zdenormalizowane dane zmieniły się w głównej kolekcji. Tak, musisz zaktualizować wszystkie zdenormalizowane dane w innych kolekcjach. Prawdopodobnie będziesz potrzebować aktualizacji miliardów dokumentów (w zależności od rozmiaru systemu) i jest w porządku. Możesz to zrobić asynchronicznie, jeśli zajmie to dużo czasu.
Co jest korzystne w powyższej strukturze danych?
- Każdy dokument zawiera wszystkie dane, które mogą być potrzebne do wyświetlenia w aplikacji. Na przykład nie potrzebujesz klientów związanych z ładunkiem, kierowcy, ciężarówki, gdy potrzebujesz tras wyświetlania.
- Możesz wykonać dowolne trudne zapytania do swojej bazy danych. Na przykład w swoim schemacie możesz zbudować zapytanie, które zwróci wszystkie trasy, które zawierają przystanki na przystanku klienta o nazwie ="Bill" (musisz najpierw załadować klienta według nazwy, uzyskać identyfikator i szukać według identyfikatora klienta w bieżącym schemacie).
Prawdopodobnie zadajesz sobie pytanie, czy w niektórych przypadkach Twoje dane mogą być niezsynchronizowane, ale aby rozwiązać ten problem, wystarczy zbudować kilka testów jednostkowych, aby upewnić się, że prawidłowo aktualizujesz zdenormizowane dane.
Nadzieja, że powyżej pomoże Ci zobaczyć świat z nie relacyjnej strony, z punktu widzenia bazy danych dokumentów.