8

Tôi đang thiết kế một bảng User trong cơ sở dữ liệu của mình. Tôi có khoảng 30 tùy chọn cho mỗi người dùng có thể là "cho phép" hoặc "không cho phép".Lưu trữ nhiều bit - Tôi có nên sử dụng nhiều cột hoặc một cột bitfield không?

Câu hỏi của tôi là tôi nên lưu trữ các cột này dưới dạng cột 30 bit hoặc tôi nên sử dụng một cột int để lưu trữ và phân tích từng bit trong ứng dụng của mình?

Ngoài ra, cơ sở dữ liệu của chúng tôi là SQL Server 2008 và 2005 (tùy thuộc vào môi trường)

+1

@Martin Tôi vừa thêm câu hỏi của mình – Earlz

Trả lời

4

Tôi nghĩ rằng nó sẽ được dễ dàng hơn để cho phép mở rộng trong tương lai nếu bạn có các cột cho mỗi giá trị. Nếu bạn thêm một tùy chọn khác trong tương lai (có khả năng cho hầu hết các ứng dụng như thế này), thì nó có thể ảnh hưởng đến tất cả các mã khác của bạn vì bạn cần phải sửa đổi cột int của bạn để tính toán các bit mới.

5

Không - trừ khi bạn có vấn đề về không gian lớn hoặc yêu cầu tương thích với một số hệ thống khác, hãy suy nghĩ về cách điều này sẽ ngăn bạn tối ưu hóa truy vấn của bạn và hiểu rõ từng bit đại diện.

Bạn có thể có nhiều hơn một nghìn cột trong bảng hoặc bạn có thể có bảng con cho cài đặt người dùng. Tại sao bạn giới hạn 30 bit mà bạn cần phân tích cú pháp trong ứng dụng của mình? Hãy tưởng tượng bạn sẽ cần loại thay đổi nào đối với ứng dụng nếu một số cài đặt này không được chấp nhận hoặc một số cài đặt mới được giới thiệu.

4

Nếu bạn kết hợp thành trường bitflag, sẽ rất khó để xem nội dung nào được đặt nếu bạn đang xem dữ liệu thô. Tôi muốn đi với các cột riêng lẻ cho mỗi giá trị hoặc lưu trữ các tùy chọn trong bảng của riêng chúng.

11

Tôi chỉ cố gắng tạo ra hai bảng, một với một cột int duy nhất và một với cột 30 chút sau đó thêm vào một hàng để mỗi và nhìn họ với SQL Server Internals Viewer

CREATE TABLE T_INT(X INT DEFAULT 1073741823); 

CREATE TABLE T_BIT(
X1 BIT DEFAULT 1, 
/*Other columns omitted for brevity*/ 
X30 BIT DEFAULT 1 
); 

INSERT INTO T_INT DEFAULT VALUES; 

INSERT INTO T_BIT DEFAULT VALUES; 

hàng duy nhất cho bảng với 30 Bit cột

BITS

đơn hàng cho bảng với một int cột

INT

Từ một điểm lưu trữ của xem SQL Server kết hợp các cột bit và các dữ liệu được lưu trữ trong chính xác cùng một lượng không gian (màu vàng).Bạn cuối cùng mất 3 byte một hàng cho bitmap NULL (màu tía) mặc dù độ dài của tỷ lệ này là tỷ lệ thuận với số cột (bất kể chúng có cho phép null) không.

Khóa cho các trường (cho int phiên bản, màu sắc mã hóa là như nhau cho phiên bản chút)

Int key

+2

+1 để cung cấp chi tiết kỹ thuật – Earlz

+0

Sẽ cập nhật hình ảnh bị hỏng khi thời gian. –

+0

Và đây là lý do tại sao bạn nên sử dụng hình ảnh imgur trong tương lai;) – Earlz

1

tôi đồng ý thiết kế của bạn nên được đúng bình thường, ba bảng người dùng và cài đặt User, và một cái bàn cầu:

User:

Userid int

UserName varchar (X)

UserSetting:

Settingid int

SettingName varchar (X)

UserUserSetting:

01.

Userid int

SettingId int

isset cắn

Sẽ có FK giữa bảng cầu UserUserSettingUserSetting và bảng người dùng và một hạn chế Contr độc đáo của t UserId, SettingId trong Người dùngUserSetting

+1

+1 Bravo để chuẩn hóa. Tuy nhiên, là 'UserUserSetting' cần thiết. Không phải sự tồn tại của một hàng chỉ ra rằng cài đặt người dùng được bật cho người dùng? – bobs

+2

Việc coi mỗi cài đặt người dùng là một thuộc tính thay vì một thực thể không nhất thiết vi phạm 1NF. Cách câu hỏi được đặt phrased, tuy nhiên điều trị một "thiết lập người dùng" như một khái niệm chung chung; trong cài đặt người dùng mô hình này là một thực thể và cần một bảng. Thông tin thêm về cách cài đặt người dùng được sử dụng và các ví dụ cụ thể là cần thiết để hiểu cách tiếp cận nào phù hợp hơn. –

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