2012-04-03 36 views
13

Tôi đang làm việc với một bảng trong cơ sở dữ liệu PostgreSQL có một số cột boolean xác định một số trạng thái (ví dụ: published, visible, v.v.). Tôi muốn tạo một cột trạng thái duy nhất sẽ lưu trữ tất cả các giá trị này cũng như các giá trị mới có thể có dưới dạng bitmap. Có sự khác biệt nào giữa trường hợp này là integerbit(n) không?Có sự khác nhau nào giữa các kiểu dữ liệu số nguyên và bit (n) cho một bitmap không?

Đây sẽ là một bảng khá lớn, vì nó lưu trữ các đối tượng mà người dùng tạo thông qua giao diện web. Vì vậy, tôi nghĩ rằng tôi sẽ phải sử dụng (một phần) chỉ mục cho cột này.

Trả lời

21

Nếu bạn chỉ có một vài biến Tôi sẽ cân nhắc việc giữ riêng các cột boolean riêng biệt.

  • Lập chỉ mục dễ dàng. Cụ thể là indexes on expressionspartial indexes.
  • Điều kiện truy vấn dễ viết, dễ đọc và có ý nghĩa.
  • Cột boolean chiếm 1 byte (không có đệm căn chỉnh). Đối với chỉ một vài biến này chiếm không gian ít nhất.
  • Không giống như các tùy chọn khác boolean cột cho phép NULL giá trị cho từng bit nếu bạn cần. Bạn luôn có thể xác định cột NOT NULL nếu không.

Nếu bạn có nhiều hơn một bàn tay biến đầy đủ nhưng không quá 32, một cột integerthể phục vụ tốt nhất. (Hoặc một bigint cho lên tới 64 biến.)

  • Chiếm 4 byte trên đĩa (có thể yêu cầu sự liên kết đệm, tùy thuộc vào cột trước).
  • Lập chỉ mục rất nhanh để đối sánh chính xác (nhà điều hành =).
  • Xử lý các giá trị riêng lẻ có thể chậm hơn/ít thuận tiện hơn với varbit hoặc boolean.

Với nhiều biến hơn, hoặc nếu bạn muốn thao tác các giá trị rất nhiều hoặc nếu bạn không có bảng lớn hoặc dung lượng ổ đĩa/RAM không phải là vấn đề hoặc nếu bạn không chắc chắn nên chọn gì , Tôi sẽ xem xét bit(n) or bit varying(n) (short: varbit(n).

Đối với chỉ 3 bit thông tin, cá nhân boolean cột nhận được bởi với 3 byte, một integer nhu cầu 4 byte (có thể thêm liên kết đệm) và một bit string 6 byte (5 + 1).

Đối 32 bit thông tin, một integer vẫn cần 4 byte (+ đệm), một bit string chiếm 9 byte cho cùng một (5 + 4) và boolean cột chiếm 32 byte.

Để tối ưu hóa không gian đĩa hơn nữa, bạn cần hiểu cơ chế lưu trữ của PostgreSQL, đặc biệt là căn chỉnh dữ liệu. More in this related answer.

This answer về cách chuyển đổi các loạiboolean, bit (n)nguyên có thể giúp đỡ, quá.

+0

Cảm ơn rất nhiều vì đã giải thích, đó chính xác là những gì tôi cần! Tôi nghĩ rằng tôi sẽ đi với một cột 'số nguyên'. –

0

Bạn có thể áp dụng trực tiếp bit string functions cho chuỗi bit mà không cần phải truyền từ số nguyên.

Các vấn đề liên quan