BOOLEAN и DATE/TIMESTAMP
Тема дорожной карты · PostgreSQL
PostgreSQL предоставляет богатый набор временны́х и логических типов данных, необходимых для точного моделирования данных в любом приложении на основе реляционной базы данных. Тип BOOLEAN хранит значения TRUE, FALSE или NULL и принимает широкий спектр входных литералов, включая 'yes', 'no', 'on' и 'off', что делает его более гибким, чем аналогичные типы во многих других базах данных. Для хранения даты и времени PostgreSQL предлагает DATE, TIME, TIMESTAMP и TIMESTAMPTZ (timestamp with time zone); TIMESTAMPTZ является рекомендуемым выбором для большинства приложений, поскольку хранит значения в UTC и преобразует их к настройке TimeZone текущего сеанса при отображении. Функции NOW(), CURRENT_DATE, AGE() и DATE_TRUNC() обеспечивают мощную оптимизацию временны́х запросов, а интервальная арифметика PostgreSQL — например, timestamp + INTERVAL '7 days' — предоставляет выразительные вычисления на основе времени без необходимости обработки на уровне приложения.
Как это работает
BOOLEAN и DATE/TIMESTAMP покрывает numeric (int, bigint, numeric, real, double), character (text, varchar, char — берите text, кроме реального лимита), date/time (timestamp, timestamptz — всегда tz-вариант), boolean, JSONB (запросимый JSON с GIN-индексами), массивы (int[], text[]), ranges (int4range, tsrange), UUID, network (inet, cidr), геометрические, кастомные через DOMAIN или CREATE TYPE. Postgres необычно богат — используйте типы, а не перегружайте text/JSONB.
Когда применять
Всегда timestamptz (timestamp with time zone) для меток времени — Postgres хранит UTC + конвертирует на показ. numeric(10,2) для денег, никогда real/float (округление). uuid для ID, видимых клиентам (нет утечки объёма vs integer); bigint — для внутренних high-volume последовательностей. JSONB (не JSON) — бинарный, индексируется, быстрее. Enum использовать аккуратно (тяжело мигрировать); lookup-таблица часто яснее.
Типичные ошибки
Ловушки BOOLEAN и DATE/TIMESTAMP: timestamp (без tz) и тихое хранение локального (DST-ужас); varchar(255) "потому что MySQL" (в Postgres нет perf-выгоды — используйте text); JSON вместо JSONB (текст, медленней, без индексов); float для денег (копейка тут, копейка там — за годы). Прочтите справочник типов — окупается лучшими решениями по схеме.