web-dev-qa-db-ja.com

postgres列に-1 0と1のみを格納するための適切なデータ型は何ですか?

  • 列に3つの状態のみを格納したい(2の場合はブール値を使用する)
  • ENUM( 'up'、 'down'、 'none')の使用を検討しましたが、ENUMにはかなりのスペースが必要です
  • PostgresQLカラムに-1 0と1のみを格納するより良い方法はありますか?
14
PirateApp

スペースを節約したい場合は、"char"データ型を使用できます。 1バイトを格納します。

integerまたはtext"char"にキャストできます。

SELECT 'u'::"char", 'd'::"char", 'n'::"char";

 char | char | char 
------+------+------
 u    | d    | n
(1 row)

Enumは内部的にrealとして格納されるため、4バイトを使用します。

スペースを節約するために何をしているのか、alignmentを考慮する必要があります。値は常にtype alignmentに従って整列されます。たとえば、bigintは常に8で割り切れるアドレスから開始する必要があります。

テーブルが次のように定義されている場合

CREATE TABLE (
   smallflag "char",
   largenum  bigint
);

列の間に7 パディングバイトがあり、"char" mootからのすべてのスペースの増加をレンダリングします。

したがって、テーブルの列を慎重に配置してください。

20
Laurenz Albe

少しハックですが、列をnull可能にしても、3番目の値としてnull値を使用してブール値を使用できます。

ただし、ブールはPostgresで引き続き1バイトを使用します。

15
simon at rcl

-128から127までの整数を1バイトのスペースに格納できるtinyint拡張機能がありますが、現在postgresバージョン11以降と互換性を持たせるには、書き換えが必要です。

https://github.com/umitanuki/tinyint-postgresql

このデータ型がメインのPostgres型でまだ利用できない理由は、常に私には謎でした。

1
Lucas