Cột riêng biệt cho mỗi giá trị linh hoạt hơn khi tìm kiếm.
Một bảng khóa / giá trị riêng biệt linh hoạt hơn nếu các hàng khác nhau có các bộ sưu tập giá trị Boolean khác nhau.
Và, nếu
- danh sách các giá trị Boolean của bạn ít nhiều là tĩnh
- tất cả các hàng của bạn có tất cả các giá trị Boolean đó
- tìm kiếm quan trọng về hiệu suất của bạn là tìm các hàng có bất kỳ giá trị nào là sai
thì việc sử dụng các chuỗi văn bản như '1001010010', v.v. là một cách tốt để lưu trữ chúng. Bạn có thể tìm kiếm như thế này
WHERE flags <> '11111111'
để tìm các hàng bạn cần.
Bạn có thể sử dụng cột BINARY với một bit trên mỗi cờ. Nhưng bảng của bạn sẽ dễ sử dụng hơn cho các truy vấn thông thường và kiểm tra nhãn cầu nếu bạn sử dụng văn bản. Tiết kiệm không gian từ việc sử dụng BINARY thay vì CHAR sẽ không đáng kể cho đến khi bạn bắt đầu lưu trữ nhiều triệu hàng.
chỉnh sửa Phải nói rằng:mỗi khi tôi xây dựng một cái gì đó như thế này với các mảng thuộc tính Boolean, sau đó tôi đã thất vọng về việc nó trở nên thiếu linh hoạt như thế nào. Ví dụ, giả sử đó là một danh mục bóng đèn. Vào đầu thiên niên kỷ, các lá cờ Boolean có thể giống như
screw base
halogen
mercury vapor
low voltage
Sau đó, mọi thứ thay đổi và tôi thấy mình cần nhiều cờ Boolean hơn, như
LED
CFL
dimmable
Energy Star
v.v ... Đột nhiên, các loại dữ liệu của tôi không đủ lớn để chứa những gì tôi cần. Khi tôi viết "danh sách các giá trị Boolean của bạn ít nhiều là tĩnh", tôi muốn nói rằng bạn không mong đợi một cách hợp lý nào đó giống như các đặc tính của bóng đèn thay đổi trong suốt thời gian ứng dụng của bạn.
Vì vậy, một bảng các thuộc tính riêng biệt might là một giải pháp tốt hơn. Nó sẽ có các cột sau:
item_id fk to item table -- pk
attribute_id attribute identifier -- pk
attribute_value
Điều này cuối cùng là linh hoạt. Bạn chỉ có thể thêm cờ mới. Bạn có thể thêm chúng vào các mục hiện có hoặc vào các mục mới, bất kỳ lúc nào trong vòng đời ứng dụng của bạn. Và, mọi vật phẩm không cần bộ sưu tập cờ giống nhau. Bạn có thể viết "những mục nào có bất kỳ thuộc tính sai nào?" truy vấn như thế này:
SELECT DISTINCT item_id FROM attribute_table WHERE attribute_value = 0
Tuy nhiên, bạn phải cẩn thận vì truy vấn "mục nào có thuộc tính bị thiếu" khó viết hơn rất nhiều.