PostgreSQL'de bir zaman damgası en iyi nasıl saklanır?


20

Bir PostgreSQL DB tasarımı üzerinde çalışıyorum ve en iyi nasıl zaman damgalarını depolamak merak ediyorum.

Varsayımlar

Farklı saat dilimlerindeki kullanıcılar veritabanını tüm CRUD işlevleri için kullanır.

2 seçeneğe baktım:

  • timestamp NOT NULL DEFAULT (now() AT TIME ZONE 'UTC')

  • bigint NOT NULL DEFAULT

Çünkü timestampINSERT anı için tam (UTC) zaman damgasını temsil eden bir dize gönderirim.

Çünkü bigintaynı şeyi saklıyorum, ama sayı formatında. (zaman dilimi sorunları, milisler sunucuya teslim edilmeden önce ele alındığından, her zaman UTC olarak milis olur.)

bigintA'yı saklamanın temel avantajlarından biri , doğru biçimlendirilmiş bir zaman damgasının geçirilmesinin basit bir sayıdan (Unix Epoc'tan beri milis) daha karmaşık olması nedeniyle depolamanın ve geri getirmenin daha kolay olacağı olabilir.

Benim sorum, hangisinin en esnek tasarıma izin vereceği ve her yaklaşımın tuzakları ne olabilir.


Zaman damgasının, zaman damgalarını temsil etmek için bir bigint'ten daha iyi olmasının birçok nedeni vardır. Bir bigint'in zaman damgasından daha iyi olmasının tek bir sebebini düşünemiyorum.
Lennart

Bir BigInt'in daha kolay olabileceğini düşünebilmemin ana nedeni, almanın ve saklamanın çok daha kolay olabileceğidir. Sorularımı güncelleyeceğim.
Bam

Yanıtlar:


23

Birden çok saat dilimi ile uğraştığınız için zaman damgalarını timestampveya timestamptz( timestamp with time zone) olarak depolayın . Bu, geçerli verileri zorlar ve genellikle en verimlidir. Veri türünü anladığınızdan emin olun, etrafta bazı yanlış algılar var:

Endişenizi gidermek için:

doğru biçimlendirilmiş bir zaman damgasını geçirmek basit bir sayıdan daha karmaşıktır

İsterseniz UNIX dönemini her iki şekilde geçebilir ve alabilirsiniz:

SELECT to_timestamp(1437346800)
     , extract(epoch FROM timestamptz '2015-07-20 01:00+02');

İlişkili:

Geçerli zaman damgasını DB'ye yazarak depolamak istiyorsanız timestamptz , varsayılan değeri olannow() bir sütun kullanın . DB sunucusundaki sistem zamanı genellikle kendi saatlerinin ne olduğu konusunda kendi fikirlerini veren birden fazla istemciden çok daha güvenilir ve tutarlıdır.
Çünkü INSERTbu kadar basit olabilir:

CREATE TABLE foo (
  ... -- other columns
, created_at timestamptz NOT NULL DEFAULT now()
);

Ve sadece o sütuna yazma. Otomatik olarak doldurulur.


Bu her şeyi netleştirdi. Zaman damgalarının 8 baytlık tamsayılar olarak saklanmasına ek olarak, "to_timestamp" işlevleriyle bigint olarak depolamak, depolamak ve almak da aynı şekilde çok daha kolay bir seçimdir. Teşekkür ederim
Bam

8

Yerleşik işlevleri kullanabilmeniz için verileri her zaman yerel veri türünde depolamanız gerekir. Ve zaman damgasının veri türü a timestamp.

Btw, bir timestampedilir değil bir dize olarak saklanan, bu tam olarak aynı, bir 8 bayt tamsayı olarak depolanır bigint: PostgreSQL belgelerine .


Özür dilerim, zaman damgasını saklamak için değil, depolama için bir dize göndereceğimi söyledim . Düzeltildi.
Bam
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.