Toto je založeno na zásadním nedorozumění vnitřního fungování Postgresu a designů EAV .
Pokud nemáte stovky různých polí nebo dynamickou sadu typů atributů, použijte jedinou tabulku se všemi sloupci - kromě normalizace databáze
. Sloupce bez hodnoty jsou vyplněny NULL
.
Nulové úložiště je velmi levné , zabírající 1 bit na sloupec v tabulce pro nulovou bitmapu, obvykle přidělené v jednotkách 8 bajtů pro pokrytí 64 sloupců. Viz:
Samostatný řádek pro single další atribut zabírá nejméně dalších 36 bajtů .
4 bytes item identifier 23 bytes heap tuple header 1 byte padding 8 bytes minimum row data size
Obvykle více, kvůli vycpávání a další režii.
Musely by existovat stovky různých, řídce osídlených sloupců, než by se takový nepraktický design EAV mohl vyplatit – a hstore
nebo jsonb
v Postgresu 9.4 by bylo na to lepší řešení . Pro váš návrh a jestli mezi tím není téměř žádný prostor tam bylo, pravděpodobně byste používali enum
pro typ.
Dotazy jsou přitom složitější a dražší. Jsme tady v úzkých.
Místo toho použijte rozložení tabulky, jako je toto:
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
);
Úzce související odpověď s dalšími radami: