役割がほんの一握りの場合、ストレージも保存しません。 PostgreSQLのスペース 。 integer
列は4バイト、bigint
を使用します 8バイト。どちらも位置合わせのパディングが必要な場合があります:
- Postgresの行サイズを理解する
- PostgreSQLでのスペースの計算と節約
boolean
列は1バイトを使用します。事実上、1つのinteger
に4つ以上のブール列を収めることができます。 列、bigint
の場合は8つ以上 。
NULL
も考慮に入れてください 値は、NULLビットマップで1ビット(簡略化)のみを使用します。
個々の列は読みやすく、インデックス 。他の人はすでにそれについてコメントしています。
式または部分インデックスのインデックスを利用して、インデックスの問題(「非仮位」)を回避することもできます。次のような一般的なステートメント:
データベースは、このようなクエリでインデックスを使用できません
または
これらの条件はSARGableではありません!
完全に真実ではない -おそらく、これらの機能を欠いている他のRDBMSの場合もあります。
しかし、問題を完全に回避できるのに、なぜ回避するのでしょうか。
あなたが明らかにしたように、私たちは6つの異なるタイプ(多分それ以上)について話している。個別のboolean
を使用する 列。 1つのbigint
と比較しても、おそらくスペースを節約できます。 。この場合、スペース要件は重要ではないようです。
もし これらのフラグは相互に排他的でした 、1つを使用できます タイプenum
の列 または、小さなルックアップテーブルとそれを参照する外部キー。 (質問の更新で除外されました。)