Справка по структуре базы данных MongoDB и рекомендациям - PullRequest
11 голосов
/ 11 июня 2011

Я нахожусь в процессе разработки программного обеспечения для отслеживания / оптимизации маршрутов для моей компании по сбору мусора и хотел бы получить отзывы о моей текущей структуре данных / ситуации.

Вот упрощенная версия моей структуры MongoDB:

База данных: данные

Коллекция:

«клиенты» - сбор данных, содержащих все данные клиентов.

  [
    {
        "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"
    }, { ... }, { ... }, ...
]

«грузовики» - сбор данных, содержащий все данные о грузовиках.

[
    {
        "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"
    }
]

«драйверы» - сбор данных, содержащий все данные драйвера.

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

«Списки маршрутов» - сбор данных, содержащий все заранее определенные списки маршрутов.

   [
    {
        "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"
            }
        ]
    }
]

"маршруты" - сбор данных, содержащий данные для всех активных и завершенных маршрутов.

[
    {
        "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": ""
            }
        ]
    }
]

Вот процесс на данный момент:

Каждый день водители начинают с запуска нового маршрута. Перед началом нового маршрута водители должны сначала ввести данные:

  1. driverid
  2. дата
  3. грузовик

Как только все данные введены правильно, начнется новый маршрут:

  1. Создать новый объект в коллекции «маршруты»
  2. Коллекция запросов «Списки маршрутов » для «День» + «Грузовик» Совпадение и возврат «Остановки»
  3. Вставить «списки маршрутов» данные в «маршруты» сборник

По мере того, как водитель выполняет свои ежедневные остановки / задания, коллекция «маршруты» будет обновляться соответствующим образом.

По завершении всех задач у водителя будет возможность завершить процесс маршрута, просто изменив поле «состояние» на «активное» с «завершено» в коллекции «маршруты».

Это примерно так. Любые отзывы, мнения, комментарии, ссылки, тактика оптимизации приветствуются.

Заранее спасибо за ваше время.

1 Ответ

15 голосов
/ 12 июня 2011

Ваша схема базы данных выглядит для меня как «классическая» схема реляционной базы данных.Mongodb хорошо подходит для денормализации данных.Я предполагаю, что при отображении маршрутов вы загружаете всех связанных клиентов, водителя, грузовик.

Если вы хотите, чтобы ваша система была действительно быстрой, вы можете встроить все в коллекцию маршрутов.

Поэтому я предлагаю следующие модификацииВаша схема:

  1. клиенты - как есть
  2. грузовики - как есть
  3. водители - как есть
  4. маршрут-list:

    Вставить данные о клиентах внутри остановок вместо ссылки.Также встроенный грузовик.В этом случае схема будет иметь вид:

     {
         "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. маршруты:

    Когда водитель запускает новый маршрут, скопируйте маршрут из списка маршрутов и дополнительно вставьте информацию о драйвере:

     {
         //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"
         }]
     }
    

Я полагаю, вы спрашиваете себя, что делать, если в основной коллекции изменились данные о водителе, клиенте или других денормализованных данных.Да, вам нужно обновить все денормализованные данные в других коллекциях.Вам, вероятно, потребуется обновить миллиарды документов (в зависимости от размера вашей системы), и это нормально.Вы можете сделать это асинхронно, если это займет много времени.

Какие преимущества в приведенной выше структуре данных?

  1. Каждый документ содержит все данные, которые могут понадобиться для отображения в вашем приложении.Так, например, вам не нужно загружать связанных клиентов, водителя, грузовик, когда вам нужно отобразить маршруты.
  2. Вы можете делать любые сложные запросы к вашей базе данных.Например, в вашей схеме вы можете создать запрос, который будет возвращать все маршруты, которые содержат остановки в остановке клиента с именем = "Билл" (сначала нужно загрузить клиента по имени, получить идентификатор и просмотреть идентификатор клиента в вашей текущей схеме).

Возможно, вы спрашиваете себя, что ваши данные могут быть несинхронизированы в некоторых случаях, но для решения этой проблемы вам просто нужно создать несколько модульных тестов, чтобы убедиться, что вы корректно обновляете свои денормолизированные данные.

Надеюсь, что это поможет вам увидеть мир с нереляционной стороны, с точки зрения базы данных документов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...