MongoDB: сохраняйте среднюю скорость в виде поля или вычисляйте на ходу

Я разрабатываю приложение для Android, которое использует MongoDB для хранения пользовательских записей в формате документа. У меня будет несколько записей, содержащих информацию о GPS-треке, такую ​​как начальная долгота и широта, конечная долгота и широта, общее время, максимальная скорость и общее расстояние.

Мой вопрос касается средней скорости. Должен ли я позволить моему приложению вычислять среднюю скорость и сохранять ее как поле в документе, или я должен вычислять ее, получая только время и расстояние?

У меня будут тысячи записей, которые должны быть отсортированы по средней скорости, и наиболее разумным кажется сохранение средней скорости в документе. Однако это отходит от традиционного мышления SQL Acid, когда скорость вычисляется вне БД.

Текущая структура документа для коллекции записей выглядит следующим образом:

DocumentID (record)
DocumentID (user)
Start lnlt
Finish lnlt
Start time/date/gmt
End time/date/gmt
Total distance
Total time
Top speed
KMZ File

person Karl    schedule 02.11.2012    source источник


Ответы (2)


Вы не должны говорить о свойствах ACID, если вы решили использовать документно-ориентированную БД, такую ​​​​как Mongo. Теперь вы сами ответили на вопрос:

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

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

В любом случае, я предлагаю сохранить его так, как вы хотите, чтобы сортировка выполнялась БД, а не приложением. Это означает, что если какие-либо переменные, влияющие на среднюю скорость, изменятся после первоначального сохранения, вы должны не забыть также обновить поле результата.

person Aravind Yarram    schedule 02.11.2012

Мой вопрос касается средней скорости. Должен ли я позволить моему приложению вычислять среднюю скорость и сохранять ее как поле в документе, или я должен вычислять ее, получая только время и расстояние?

Как правильно сказал @Panegea, MongoDB не полагается на свойства ACID. Это зависит от того, что ваше приложение может контролировать распределенную природу самого себя, однако, как говорится, расчет средней скорости вне БД не так уж и плох, и использование атомарного оператора, такого как $set, предотвратит странности, когда не используются полные запросы ACID .

То, о чем вы и @Panegea говорите, является формой предварительной агрегации необходимого вам значения в предварительно определенное поле в документе. Это, безусловно, рекомендуемый подход не только в MongoDB, но и в SQL (например, общее количество акций в посте на стене Facebook), где запрос на агрегирование вычисляемого поля был бы утомителен и очень сложен для сервера или просто неразумно.

Редактировать

Вы можете добиться этого с помощью структуры агрегации: http://docs.mongodb.org/manual/applications/aggregation/ тоже, возможно, стоит заглянуть туда, но предварительная агрегация, безусловно, самый быстрый метод.

person Sammaye    schedule 02.11.2012
comment
Я знаю о возможности агрегатных фреймворков для поддержки вычисляемых полей, но не включил их, поскольку они доступны только в последней версии. - person Aravind Yarram; 02.11.2012
comment
Спасибо за ответы, ребята. Переменные никогда не изменятся после создания документа. Я позволю приложению заполнить поля, включая среднюю скорость, поскольку в приложении будет много запросов для этого поля. - person Karl; 03.11.2012
comment
Кстати, было еще одно поле для типа транспортного средства, использованного для создания записи. Первоначально я хотел просто сослаться на идентификатор документа этого транспортного средства, чтобы получить тип, но, учитывая, что будет много запросов для сортировки на основе как типа транспортного средства, так и средней скорости, имеет смысл иметь это значение также в документе записи. Исходя из Excel, я привык максимально упрощать структуру, чтобы свести к минимуму ошибки. Но, учитывая, что соответствующие поля статичны после создания, я вместо этого оптимизирую их для удобочитаемости и скорости. - person Karl; 03.11.2012