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

Postgres kiểu dữ liệu ENUM hoặc KIỂM TRA CONSTRAINT?

Dựa trên các nhận xét và câu trả lời ở đây, và một số nghiên cứu sơ bộ, tôi có bản tóm tắt sau đây để đưa ra nhận xét từ Postgres-erati. Sẽ thực sự đánh giá cao ý kiến ​​đóng góp của bạn.

Có ba cách để hạn chế các mục nhập trong cột bảng cơ sở dữ liệu Postgres. Hãy xem xét một bảng để lưu trữ "màu sắc" trong đó bạn chỉ muốn 'đỏ', 'xanh lá cây' hoặc 'xanh lam' là các mục nhập hợp lệ.

  1. Kiểu dữ liệu được liệt kê

    CREATE TYPE valid_colors AS ENUM ('red', 'green', 'blue');
    
    CREATE TABLE t (
        color VALID_COLORS
    );
    

    Ưu điểm là kiểu có thể được xác định một lần và sau đó được sử dụng lại trong nhiều bảng nếu cần. Một truy vấn chuẩn có thể liệt kê tất cả các giá trị cho một loại ENUM và có thể được sử dụng để tạo các tiện ích biểu mẫu ứng dụng.

    SELECT  n.nspname AS enum_schema,  
            t.typname AS enum_name,  
            e.enumlabel AS enum_value
    FROM    pg_type t JOIN 
            pg_enum e ON t.oid = e.enumtypid JOIN 
            pg_catalog.pg_namespace n ON n.oid = t.typnamespace
    WHERE   t.typname = 'valid_colors'
    
     enum_schema | enum_name     | enum_value 
    -------------+---------------+------------
     public      | valid_colors  | red
     public      | valid_colors  | green
     public      | valid_colors  | blue
    

    Nhược điểm là, kiểu ENUM được lưu trữ trong các danh mục hệ thống, vì vậy cần có một truy vấn như trên để xem định nghĩa của nó. Các giá trị này không rõ ràng khi xem định nghĩa bảng. Và, vì kiểu ENUM thực sự là một kiểu dữ liệu tách biệt với kiểu dữ liệu NUMERIC và TEXT được tích hợp sẵn, các toán tử và hàm số và chuỗi thông thường không hoạt động trên nó. Vì vậy, người ta không thể thực hiện một truy vấn như

    SELECT FROM t WHERE color LIKE 'bl%'; 
    
  2. Kiểm tra các ràng buộc

    CREATE TABLE t (
        colors TEXT CHECK (colors IN ('red', 'green', 'blue'))
    );
    

    Hai lợi thế là, một, "những gì bạn thấy là những gì bạn nhận được", nghĩa là, các giá trị hợp lệ cho cột được ghi lại ngay trong định nghĩa bảng và hai, tất cả các toán tử chuỗi hoặc số gốc đều hoạt động.

  3. Khóa ngoại

    CREATE TABLE valid_colors (
        id SERIAL PRIMARY KEY NOT NULL,
        color TEXT
    );
    
    INSERT INTO valid_colors (color) VALUES 
        ('red'),
        ('green'),
        ('blue');
    
    CREATE TABLE t (
        color_id INTEGER REFERENCES valid_colors (id)
    );
    

    Về cơ bản giống như tạo kiểu ENUM, ngoại trừ, các toán tử chuỗi hoặc số gốc hoạt động và người ta không phải truy vấn danh mục hệ thống để khám phá các giá trị hợp lệ. Cần có sự tham gia để liên kết color_id thành giá trị văn bản mong muốn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Giảm tham số postgresql.conf tại một thời điểm

  2. Cách Tầng () hoạt động trong PostgreSQL

  3. Liệt kê các hàm được lưu trữ tham chiếu đến một bảng trong PostgreSQL

  4. Có gì mới trong PostgreSQL 11

  5. Rails Resque worker không thành công với PGError:máy chủ đóng kết nối đột ngột