Ini didasarkan pada kesalahpahaman utama cara kerja bagian dalam Postgres dan desain EAV .
Jika Anda tidak memiliki ratusan bidang berbeda atau kumpulan jenis atribut dinamis, gunakan tabel tunggal dengan semua kolom - kecuali untuk normalisasi database
. Kolom tanpa nilai diisi dengan NULL
.
Penyimpanan nol sangat murah , menempati 1 bit per kolom dalam tabel untuk bitmap nol, biasanya dialokasikan dalam satuan 8 byte untuk mencakup 64 kolom. Lihat:
Baris terpisah untuk tunggal atribut tambahan menempati setidaknya tambahan 36 byte .
4 bytes item identifier 23 bytes heap tuple header 1 byte padding 8 bytes minimum row data size
Biasanya lebih banyak, karena bantalan dan overhead tambahan.
Harus ada ratusan kolom berbeda yang jarang penduduknya sebelum desain EAV yang berat seperti itu dapat membayar - dan hstore
atau jsonb
di Postgres 9.4 akan menjadi solusi yang unggul untuk itu . Hampir tidak ada ruang di antaranya untuk desain Anda, dan jika ada, Anda mungkin akan menggunakan enum
untuk jenisnya.
Pada saat yang sama, kueri lebih rumit dan mahal. Kami berada di posisi yang sulit di sini.
Alih-alih menggunakan tata letak tabel seperti ini:
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
);
Jawaban yang terkait erat dengan lebih banyak saran: