Store time as timestamptz, never timestamp
timestamp without a zone stores whatever the client sent and forgets where it came from. Two servers in two regions write two different meanings into the same column and nobody notices until a report is off by hours.
created_at timestamptz NOT NULL DEFAULT now()timestamptz stores an instant. Convert to a zone at the edge, in the query or the UI, never in the schema.
postgresqlschema-design