Това се основава на основно недоразумение на вътрешната работа на Postgres и EAV дизайни .
Ако нямате стотици различни полета или динамичен набор от типове атрибути, използвайте единична таблица с всички колони - с изключение на нормализиране на база данни
. Колоните без стойност се попълват с NULL
.
Нулевото хранилище е много евтино , заемащ 1 бит на колона в таблицата за нулева растерна карта, обикновено разпределена в единици от 8 байта, за да покрие 64 колони. Вижте:
Отделен ред за едница допълнителен атрибут заема поне допълнителни 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 би било превъзходно решение за това . Едва ли има място между тях за вашия дизайн и ако имаше, вероятно ще използвате 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
);
Тясно свързан отговор с повече съвети: