Je travaille sur une conception de base de données PostgreSQL et je me demande comment stocker au mieux les horodatages.
Hypothèses
Les utilisateurs de différents fuseaux horaires utiliseront la base de données pour toutes les fonctions CRUD.
J'ai regardé 2 options:
timestamp NOT NULL DEFAULT (now() AT TIME ZONE 'UTC')
bigint NOT NULL DEFAULT
Car timestamp
j'enverrais une chaîne qui représenterait l'horodatage (UTC) exact pour le moment INSERT.
Car bigint
je stockerais exactement la même chose, mais dans un format numérique. (les problèmes de fuseau horaire sont traités avant la remise des millis au serveur, donc toujours des millis en UTC.)
Un des principaux avantages du stockage d'un bigint
pourrait être qu'il serait plus facile de le stocker et de le récupérer, car le passage d'un horodatage correctement formaté est plus complexe qu'un simple nombre (millis depuis Unix Epoc).
Ma question est de savoir laquelle permettrait la conception la plus flexible et quels pourraient être les pièges de chaque approche.
Réponses:
Stockez les horodatages en tant que
timestamp
, ou plutôttimestamptz
(timestamp with time zone
) car vous avez affaire à plusieurs fuseaux horaires . Cela impose des données valides et est généralement plus efficace. Assurez-vous de comprendre le type de données, il y a des idées fausses qui circulent:Pour répondre à votre préoccupation:
Vous pouvez passer et récupérer une époque UNIX de toute façon si vous préférez:
En relation:
Si vous souhaitez stocker l' horodatage actuel avec des écritures dans la base de données, utilisez une
timestamptz
colonne avec la valeur par défautnow()
. L'heure système sur le serveur de base de données est généralement beaucoup plus fiable et cohérente que plusieurs clients remettant leur notion respective de l'heure.Car
INSERT
cela peut être aussi simple que:Et n'écrivez tout simplement pas dans cette colonne. Il est rempli automatiquement.
la source
Vous devez toujours stocker les données dans son type de données natif pour pouvoir utiliser les fonctions intégrées. Et le type de données d'un horodatage est évidemment un
timestamp
.Btw, a
timestamp
n'est pas stocké sous forme de chaîne, il est stocké sous la forme d'un entier de 8 octets, exactement la même chose quebigint
: la documentation PostgreSQL .la source