Выбор ответа Middle Проектирование и нормализация обновлено
timestamp или timestamptz
Вопрос
Сервис работает с пользователями из разных часовых поясов. Какой тип взять для времени создания заказа в PostgreSQL?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: timestamptz: хранит момент (в UTC), показывает в зоне сессии. timestamptz описывает абсолютный момент: при вставке значение переводится в UTC, при чтении в зону сессии. timestamp без зоны это «часы на стене» без привязки, при разных зонах серверов и клиентов начинается путаница.
Варианты ответа
timestamptz: хранит момент (в UTC), показывает в зоне сессииправильный ответtimestamp: он меньше и быстрее, чем timestamptztimestamptz, потому что он хранит исходный пояс клиентаtextв формате ISO 8601 с указанием зоны
Разбор
timestamptz описывает абсолютный момент: при вставке значение переводится в UTC, при чтении в зону сессии. timestamp без зоны это «часы на стене» без привязки, при разных зонах серверов и клиентов начинается путаница. Распространённое заблуждение: timestamptz не хранит исходную зону, только момент; если зона клиента нужна, её хранят отдельной колонкой. Оба типа занимают 8 байт. Текст ломает сравнения, индексы и арифметику дат.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Проектирование и нормализация»
- Нарушение второй нормальной формы
- Транзитивная зависимость
- Денормализация
- Нормализация
- Суррогатный ключ
- Связь многие ко многим
- Тип для денег
- ON DELETE CASCADE