Điều này dựa trên sự hiểu lầm chính hoạt động bên trong của Postgres và thiết kế EAV .
Nếu bạn không có hàng trăm trường khác nhau hoặc một tập hợp động các loại thuộc tính, hãy sử dụng một bảng có tất cả các cột - ngoại trừ chuẩn hóa cơ sở dữ liệu
. Các cột không có giá trị được điền bằng NULL
.
Bộ nhớ rỗng có giá rất rẻ , chiếm 1 bit mỗi cột trong bảng cho bitmap rỗng, thường được phân bổ theo đơn vị 8 byte để bao phủ 64 cột. Xem:
Một hàng riêng biệt cho một đơn lẻ thuộc tính bổ sung chiếm ít nhất thêm 36 byte .
4 bytes item identifier 23 bytes heap tuple header 1 byte padding 8 bytes minimum row data size
Thông thường hơn, do đệm và chi phí bổ sung.
Sẽ phải có hàng trăm cột khác nhau, dân cư thưa thớt trước khi một thiết kế EAV khó sử dụng như vậy có thể trả tiền - và hstore
hoặc jsonb
trong Postgres 9.4 sẽ là giải pháp vượt trội cho điều đó . Hầu như không có bất kỳ khoảng trống nào giữa thiết kế của bạn và nếu ở đó, có thể bạn đang sử dụng enum
cho loại.
Đồng thời, các truy vấn phức tạp và tốn kém hơn. Chúng tôi đang ở trong tình trạng khó khăn ở đây.
Thay vào đó, hãy sử dụng bố cục bảng như sau:
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
);
Câu trả lời liên quan chặt chẽ với nhiều lời khuyên hơn: