Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tôi có nên đặt các giá trị EAV trong bảng kiểu dữ liệu không?

Thành thật mà nói, lựa chọn tốt nhất là "không phải EAV". Xem xét việc sử dụng hstore các trường, XML hoặc json .

Trong PostgreSQL, không có lợi thế về hiệu suất khi sử dụng bảng per-datatype. NULL các giá trị được lưu trữ trong NULL nhỏ gọn bitmap, vì vậy nó tạo ra rất ít khác biệt cho dù bạn có một bộ giá trị như (NULL, NULL, NULL, 42, NULL, NULL) hoặc chỉ (42) .

Điều này cũng cho phép bạn thêm CHECK ràng buộc thực thi rằng chính xác một trường phải không phải là NULL , vì vậy bạn không nhận được nhiều giá trị thuộc các loại khác nhau.

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)

Trong trường hợp này, bitmap rỗng hoàn toàn không thêm bất kỳ khoảng trống nào, có thể là do các yêu cầu về căn chỉnh.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hiểu về kích thước lưu trữ cho kiểu dữ liệu MySQL TEXT

  2. PHP:Khái niệm hệ thống xếp hạng sao?

  3. MySQL có hỗ trợ kế thừa bảng không?

  4. SQL / PHP:Hiển thị 3 sản phẩm bán chạy nhất từ ​​cơ sở dữ liệu

  5. Làm thế nào để làm mới trình đơn thả xuống mà không cần làm mới trang?