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

SQL:Tạo bản ghi đầy đủ từ 2 bảng

Giải pháp theo yêu cầu

Trong khi bị mắc kẹt với thiết kế đáng tiếc này, truy vấn nhanh nhất sẽ là crosstab() , được cung cấp bởi mô-đun bổ sung tablefunc . Chi tiết đầy đủ trong câu trả lời liên quan này:

Đối với câu hỏi được hỏi:

SELECT * FROM crosstab(
      $$SELECT e.id, ef.name, ef.value
       FROM   entry             e
       LEFT   JOIN entry_fields ef
              ON ef.entryid = e.id
             AND ef.name = ANY ('{result,output,code,command}'::text[])
       ORDER  BY 1, 2$$

     ,$$SELECT unnest('{result,output,code,command}'::text[])$$
   ) AS ct (id int, result text, output text, code text, command text);

Thiết kế cơ sở dữ liệu

Nếu bạn không có khổng lồ nhiều trường khác nhau, nó sẽ đơn giản và hiệu quả hơn nhiều để hợp nhất tất cả ba bảng thành một bảng đơn giản:

Mục nhập
CREATE TABLE entry (
   entry_id serial PRIMARY KEY
  ,field1   text
  ,field2   text
  , ... more fields
);

Các trường không có giá trị có thể là NULL . NULL dung lượng lưu trữ rất rẻ (về cơ bản là 1 bit trên mỗi cột trong bitmap NULL):

Ngay cả khi bạn có hàng trăm cột khác nhau và chỉ một vài cột được lấp đầy cho mỗi mục nhập, điều này sẽ vẫn sử dụng ít dung lượng đĩa hơn nhiều.

Truy vấn của bạn trở nên tầm thường:

SELECT entry_id, result, output, code, command
FROM   enty;

Nếu bạn có quá nhiều cột và đó không chỉ là một thiết kế sai lầm (thông thường, điều này có thể được gấp lại thành ít cột hơn nhiều), hãy xem xét các loại dữ liệu hstore hoặc json / jsonb (trong Postgres 9.4) cho EAV lưu trữ.

trang "Giới thiệu" trên mỗi Postgres :

Maximum Columns per Table   250 - 1600 depending on column types

Hãy xem xét câu trả lời có liên quan này với các lựa chọn thay thế:

Và câu hỏi này về các trường hợp / vấn đề sử dụng điển hình của cấu trúc EAV trên dba.SE:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. postgresql - lấy danh sách chênh lệch cột giữa 2 bảng

  2. Tạo quy tắc hoặc trình kích hoạt Postgres để tự động chuyển đổi một cột thành chữ thường hoặc chữ hoa khi chèn

  3. PGError:không có kết nối với máy chủ sau khi không hoạt động

  4. Postgres Query JSON Array chứa một cái gì đó

  5. 'thứ' và 'cho đường dẫn xml (' ')' từ SQL Server trong Postgresql