Я работаю над дизайном БД PostgreSQL и мне интересно, как лучше хранить временные метки.
Предположения
Пользователи в разных часовых поясах будут использовать базу данных для всех функций CRUD.
Я посмотрел на 2 варианта:
timestamp NOT NULL DEFAULT (now() AT TIME ZONE 'UTC')
bigint NOT NULL DEFAULT
Поскольку timestamp
я послал бы строку, которая представит точную (UTC) метку времени для момента ВСТАВКИ.
Ибо bigint
я бы сохранил то же самое, но в числовом формате. (Проблемы с часовым поясом обрабатываются до того, как миллис будет передан на сервер, поэтому всегда миллис в UTC.)
Одним из основных преимуществ хранения a bigint
может быть то, что его будет проще хранить и извлекать, поскольку передача правильно отформатированной временной метки является более сложной, чем простое число (миллис со времен Unix Epoc).
Мой вопрос заключается в том, какой из них позволил бы создать наиболее гибкую конструкцию и какие могут быть подводные камни каждого подхода.
Ответы:
Храните временные метки как
timestamp
, а точнееtimestamptz
(timestamp with time zone
), так как вы имеете дело с несколькими часовыми поясами . Это обеспечивает правильность данных и, как правило, наиболее эффективно. Убедитесь, что вы понимаете тип данных, есть некоторые заблуждения:Для решения вашей проблемы:
Вы можете передать и получить эпоху UNIX в любом случае, если вы предпочитаете:
Связанный:
Если вы хотите сохранить текущую метку времени с записью в БД, используйте
timestamptz
столбец со значением по умолчаниюnow()
. Системное время на сервере БД, как правило, гораздо более надежно и согласованно, чем несколько клиентов, которые сообщают о своем времени.Ибо
INSERT
это может быть так просто, как:И просто не пишите в эту колонку. Заполняется автоматически.
источник
Вы всегда должны хранить данные в их собственном типе данных, чтобы вы могли использовать встроенные функции. И тип данных временной метки, очевидно, является
timestamp
.Кстати,
timestamp
это не хранится в виде строки, она хранится как 8-байтовое целое число, точно так же , какbigint
: PostgreSQL документации .источник