タイムスタンプをPostgreSQLに最適に保存する方法は?


19

私はPostgreSQL DBの設計に取り組んでおり、タイムスタンプをどのように保存するのが最善か疑問に思っています。

仮定

異なるタイムゾーンのユーザーは、すべてのCRUD機能にデータベースを使用します。

私は2つのオプションを見ました:

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

  • bigint NOT NULL DEFAULT

以下のためにtimestamp私は、INSERTモーメントの正確な(UTC)のタイムスタンプを表すことになり、文字列を送信します。

以下のためにbigint私はまったく同じことを格納し、その数形式のでしょう。(タイムゾーンの問題はミリスがサーバーに引き渡される前に処理されるため、UTCでは常にミリスです。)

を格納するbigintことの主な利点の1つは、正しい形式のタイムスタンプの受け渡しが単純な数値よりも複雑であるため(Unix Epocからのミリ秒)、格納および取得が容易になることです。

私の質問は、どちらが最も柔軟な設計を可能にし、各アプローチの落とし穴になる可能性があるものです。


タイムスタンプを表すために、タイムスタンプがbigintよりも優れている理由はたくさんあります。タイムスタンプよりもbigintの方が優れている理由を考えることはできません。
レナート

BigIntの方が簡単だと思うことができる主な理由は、BigIntの取得と保存がずっと簡単だからです。質問を更新します。
バム

回答:


23

複数のタイムゾーンを扱っているためtimestamp、タイムスタンプをとして保存するか、むしろtimestamptztimestamp with time zone)として保存します。有効なデータを強制し、通常は最も効率的です。データ型を必ず理解してください。いくつかの誤解が浮かんでいます。

あなたの懸念に対処するには:

正しい形式のタイムスタンプを渡すことは、単純な数字よりも複雑です

希望する場合は、どちらの方法でもUNIXエポックを渡して取得できます。

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

関連:

現在のタイムスタンプをDBへの書き込みとともに保存する場合はtimestamptz 、デフォルト値の列を使用しますnow()。DBサーバーのシステム時間は、通常、複数のクライアントがそれぞれの時間の概念を渡すよりもはるかに信頼性が高く一貫しています。
以下のためにINSERT、それはのようにシンプルにすることができます:

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

そして、その列には書かないでください。自動的に入力されます。


これは物事を明確にしました。タイムスタンプは8バイトの整数として保存されるという事実に加えて、bigintとして保存するのと同じように不可欠であり、「to_timestamp」関数を使用して保存および取得すると、これがはるかに簡単な選択になります。ありがとう
バム

8

組み込み関数を使用できるように、常にネイティブデータ型でデータを保存する必要があります。そして、タイムスタンプのデータ型は明らかにa timestampです。

ところで、timestampされていない文字列として保存され、それが全く同じ、8バイトの整数として格納されていますbigintPostgreSQLのドキュメント


申し訳ありませんが、タイムスタンプを保存するのではなく、保存する文字列送信するつもりです。それを修正しました。
バム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.