これは、主な誤解に基づいています Postgresと
何百もの異なるフィールドや属性タイプの動的なセットがない場合は、すべての列を含む単一のテーブルを使用してください -データベースの正規化
を除く 。値のない列はNULL
で埋められます 。
ヌルストレージは非常に安い 、1ビットを占める nullビットマップのテーブルの列ごと。通常、64列をカバーするために8バイト単位で割り当てられます。参照:
シングルの別の行 追加の属性は少なくともを占めます 追加の36バイト 。
4 bytes item identifier 23 bytes heap tuple header 1 byte padding 8 bytes minimum row data size
通常、パディングと追加のオーバーヘッドのために、それ以上になります。
このような扱いにくいEAV設計が支払う前に、何百もの異なる、まばらに入力された列が必要になります-そして hstore
または jsonb
Postgres 9.4では、の優れたソリューションになります。 。デザインの間にスペースはほとんどありません。if おそらく、 enum
>
タイプについて。
同時に、クエリはより複雑で費用がかかります。ここは厳しい状況にあります。
代わりに、次のようなテーブルレイアウトを使用してください:
CREATE TABLE users (
users_id serial PRIMARY KEY
, salutation text
, given_name text
, surname text
, alias text
... (many) more columns
);
CREATE TABLE address (
address_id serial PRIMARY KEY
, users_id int REFERENCES users
, city text -- or separate TABLE city incl region_id etc. ...
, region_id int REFERENCES region
, address text
... (many) more columns
);
より多くのアドバイスを伴う密接に関連した回答: