Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Haruskah saya menempatkan nilai EAV dalam tabel tipe data?

Terus terang, opsi terbaik adalah "bukan EAV". Lihat menggunakan hstore bidang, XML , atau json .

Di PostgreSQL tidak ada keuntungan kinerja untuk menggunakan tabel tipe data per. NULL nilai disimpan dalam NULL compact yang ringkas bitmap, jadi tidak ada bedanya apakah Anda memiliki tuple seperti (NULL, NULL, NULL, 42, NULL, NULL) atau cukup (42) .

Ini juga memungkinkan Anda untuk menambahkan CHECK batasan yang memberlakukan bahwa tepat satu bidang harus non-NULL , sehingga Anda tidak mendapatkan beberapa nilai dari jenis yang berbeda.

Demo:

regress=> CREATE TABLE eav_ugh (
    entity_id integer,
    int_value integer,
    numeric_value numeric,
    text_value text,
    timestamp_value timestamp with time zone,
    CONSTRAINT only_one_non_null CHECK (
            (int_value IS NOT NULL AND numeric_value IS NULL AND text_value IS NULL AND timestamp_value IS NULL) OR
            (int_value IS NULL AND numeric_value IS NOT NULL AND text_value IS NULL AND timestamp_value IS NULL) OR
            (int_value IS NULL AND numeric_value IS NULL AND text_value IS NOT NULL AND timestamp_value IS NULL) OR
            (int_value IS NULL AND numeric_value IS NULL AND text_value IS NULL AND timestamp_value IS NOT NULL)
    )
);
CREATE TABLE
regress=> insert into eav_ugh (entity_id, numeric_value) select x, x from generate_series(1,5000) x;
INSERT 0 5000
regress=> select pg_relation_size('eav_ugh');                                           
 pg_relation_size 
------------------
           229376
(1 row)

regress=> CREATE TABLE no_null_cols(entity_id integer, numeric_value numeric);
CREATE TABLE
regress=> insert into no_null_cols (entity_id, numeric_value) select x, x from generate_series(1,5000) x;
INSERT 0 5000
regress=> select pg_relation_size('no_null_cols');
 pg_relation_size 
------------------
           229376
(1 row)

regress=> SELECT sum(pg_column_size(eav_ugh)) FROM eav_ugh;
  sum   
--------
 164997
(1 row)

regress=> SELECT sum(pg_column_size(no_null_cols)) FROM no_null_cols;
  sum   
--------
 164997
(1 row)

Dalam hal ini bitmap nol tidak menambahkan spasi sama sekali, kemungkinan karena persyaratan penyelarasan.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Permintaan gabungan dengan beberapa pilihan posting Java 8

  2. Subquery dalam pernyataan SELECT (MySQL)

  3. Kesalahan MySql:Tidak dapat memperbarui tabel dalam fungsi/pemicu tersimpan karena sudah digunakan oleh pernyataan yang memanggil fungsi/pemicu tersimpan ini

  4. Temukan catatan dengan bidang tanggal dalam 24 jam terakhir

  5. Pertanyaan Dasar MySQL