2009-04-30 36 views

Trả lời

15

Bạn chắc chắn nên sử dụng số INT (nếu bạn cần 32 cờ) hoặc BIGINT (đối với 64 cờ). Nếu bạn cần thêm cờ, bạn có thể sử dụng BINARY (nhưng bạn cũng nên tự hỏi tại sao bạn cần nhiều cờ trong ứng dụng của mình).

Bên cạnh đó, nếu bạn sử dụng loại tích phân, bạn có thể sử dụng trực tiếp tiêu chuẩn bitwise operators mà không cần chuyển mảng byte thành loại tích phân.

Nếu bạn cần thêm cờ và phải sử dụng BINARY bạn mất hỗ trợ gốc cho các toán tử bitwise và do đó hỗ trợ dễ dàng để kiểm tra các giá trị cờ. Tôi có lẽ sẽ di chuyển kiểm tra cho các giá trị cờ cho một ứng dụng khách hàng, nhưng nếu bạn đang thoải mái lập trình trong T-SQL đó là một lựa chọn là tốt. Nếu bạn đang sử dụng C# bạn có một lớp học BitArray với các hoạt động cần thiết và trong Java bạn có một lớp học BitSet.

+1

vâng, hoặc sự kiện các loại nhỏ hơn như int nhỏ cho mặt nạ bit nhỏ hơn? Tôi chưa bao giờ sử dụng một int nhỏ như mặt nạ bit được nêu ra, nhưng nên không có vấn đề. công việc của int tuyệt vời. –

+1

Loại nhỏ hơn cho mặt nạ nhỏ hơn cũng là một ý tưởng hay. –

+0

Làm thế nào chúng ta có thể sử dụng varbinary khi chúng ta có, ví dụ, 100 lá cờ? Có thể varbinary được sử dụng linh hoạt như int hoặc bigint? Nó không thể thực hiện thao tác bitwise trên hai varbinary. Làm thế nào chúng ta có thể bắt chước hành vi int-flag? – aldebaran

2

Vâng, xem xét một int có ít không gian lưu trữ và nói chung là một chút dễ dàng hơn để làm việc với tôi không chắc chắn lý do tại sao bạn sẽ sử dụng một varbinary.

6

Thường được coi là thích hợp hơn khi sử dụng một loạt các cột bit thay vì một mặt nạ bit. Họ sẽ được đóng gói cùng nhau trong trang, vì vậy họ sẽ không mất thêm bất kỳ chỗ nào. Mặc dù tôi luôn luôn dường như đi với một cột int hoặc bigint để tránh tất cả các tên cột gõ .. nhưng với intellisense tôi có lẽ sẽ đi với các cột bit.

+7

Tôi không đồng ý, bitmasks vẫn có vị trí của họ và họ là một cách tuyệt vời để rời khỏi các tùy chọn của bạn mà không cần phải cấu trúc lại DB và SELECTS/VIEWS/SPROCS chỉ để thêm một bool đơn giản, chúng rất linh hoạt ... hiểu những gì họ đang có những ngày này –

+5

Vô minh lập trình đôi khi cho thấy chúng tôi đang làm cho tiến bộ tốt trừu tượng tối ưu hóa cấp thấp đi bên trong động cơ và khuôn khổ. CÁC BIT KIỂM TRA CÁ NHÂN: 1. Được xử lý hiệu quả bởi động cơ (được đóng gói cùng nhau, được điều khiển bằng mã gốc thay vì TSQL). 2. Có tên có ý nghĩa làm cho các truy vấn của bạn dễ hiểu hơn (thay vì sử dụng các số chỉ mục bit tùy ý). 3. Có thể có chỉ mục được đặt trên chúng, tăng tốc truy vấn. 4. Có thể có các giá trị mặc định có thể cấu hình riêng. 5. Dễ dàng hơn để cấu trúc lại thành một loại lớn hơn sau này nếu bạn quyết định trường cần nhiều hơn hai trạng thái. v.v. – Triynko

+0

Chính xác. Bitmasks trong SQL chỉ cần giết những gì SQL có thể làm - bạn sẽ không bao giờ có thể truy vấn chúng một cách hiệu quả. Ergo họ không nên được sử dụng. – TomTom

1

Tôi thường đồng ý với câu trả lời của @ hainstech về việc sử dụng các trường bit, vì bạn có thể đặt tên rõ ràng từng trường bit để cho biết nó nên lưu trữ gì. Tuy nhiên tôi đã không nhìn thấy một cách tiếp cận thực tế để làm so sánh bitmask với các lĩnh vực bit. Với các toán tử bitwise của SQL Server (&, |, v.v ...) thật dễ dàng để tìm ra nếu một loạt các cờ được đặt. Nhiều công việc hơn để làm điều đó với các toán tử bình đẳng đối với một số lượng lớn các trường bit.

+1

Ngoại trừ ... mũ nhà khai thác bitwise FORCE A SCAN TABLE mà giết chết hiệu suất trong khi các lĩnh vực bit indivitual hiệu quả có thể được truy vấn. – TomTom

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