2013-08-22 4 views
0

Я вижу людей, которые хранят/получают время и время сервера относительно него с использованием даты или getTime, которые могут храниться в базе данных в виде строки из следующих ролей: «21 июля 1983 года 01:15:00».Как сохранить время сервера?

До сих пор я сохранял время своего сервера как разницу между NOW и 1 января 2013 года. Это вернет числовое значение (в минутах), округленное до 1 января 2013 года и прямо сейчас, которое я сохраняю как время внутреннего сервера ,

Достоинствами этого являются: - запрос на сервер подразумевает простое числовое сравнение, в то время как (я делаю обоснованное предположение), сравнивая две даты, подразумевающие внутреннее преобразование в объекты и использование операций сравнения жира. - сохранение количества этого размера более легкое, чем строка ~ 25 символов. - возврат к «реальному» времени - добавление 1 января 2013 года, но второе и миллисекунда значения теряются из-за начальной округлости.

Но все же другие программисты-программисты настаивают на том, что использование строки версии - легко читается как человек. - его универсальный формат для большинства языков (особенно nodejs, mongodb и as3, который имеет этот проект).

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

Итак, что лучше и почему?

+1

хранить их в формате UTC, а также и сделать ваше приложение TZ известно, что путь у вас есть истинная интернационализация. Я бы действительно поспорил с программистами, с которыми вы разговаривали ... база данных хранит данные, которые не должны быть читаемыми человеком, поэтому вы делаете приложения – Sammaye

+0

Так почему бы не сохранить их как разницу между 1 января 2013 года? Таким образом, обе даты находятся в одном и том же часовом поясе. На самом деле все различия между этими датами времени. – Discipol

+0

@Discipol Если вы храните их как int, и они будут в будущем доказательством, нет ничего против этой части, любая другая дата, которая требует большего разрешения, должна быть объектом datetime, хотя строковые даты - это смертельный звон, поэтому многие системы, которые я принял которые совершили эти ошибки ... – Sammaye

ответ

1

Храните их как объекты Mongo Date. Mongo хранит даты как 8-байтовые целые числа второго смещения [1] и отображает их в человекообразном формате. Вы не храните 25 символов!

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

Ваша разница сохраняется как int в 4 байта. Таким образом, вы сохраняете ТОЛЬКО 4 байта над обычной памятью даты MongoDB. Это очень небольшая экономия, учитывая средний размер ваших объектов монго.

Рассмотрим все недостатки вашего «смещения с января 2013 года» метод:

  • Время, затраченное на написание дополнительной логики, чтобы компенсировать даты при обновлении или запросов.
  • Время, проведенное с ошибками, возникающими из-за того, что забыл компенсировать дату.
  • Время, затрачиваемое на перенос даты вручную или в голове при проверке вывода базы данных (при диагностике проблемы), вместо того, чтобы сразу увидеть фактическую дату.
  • Неспособность использовать операторов дат в агрегатах MongoDB без дополнительной работы (например, $ dayOfMonth, дополнительная работа - это проекция для смещения ваших дат внутри).

В основном, больше кода и больше головной боли и больше времени, чтобы сохранить 4 байта на объектах в базе данных, где те же 4 байта можно сохранить, переименовав свое поле с «обновленного» на «обновление»? Я не думаю, что это мудрый компромисс.

Кроме того, Best way to store date/time in mongodb

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

1 - http://bsonspec.org/#/specification

Смежные вопросы