2008-10-16 38 views
11

Tôi có một ứng dụng dựa trên web mà thông báo cho người sử dụng hoạt động trên các trang web thông qua email. Người dùng có thể chọn loại thông báo họ muốn nhận. Cho đến nay có khoảng 10 tùy chọn khác nhau (mỗi tùy chọn là đúng/sai).Cách tốt nhất để lưu trữ nhiều Flags Trong Cơ sở dữ liệu

Tôi hiện đang lưu trữ điều này trong một trường varchar dưới dạng 0 hoặc 1 được phân tách bằng dấu phẩy. Ví dụ: 1,0,0,0,1,1,1,1,0,0

Tác phẩm này rất khó để thêm cờ thông báo mới và theo dõi cờ nào thuộc về thông báo nào. Có tiêu chuẩn được chấp nhận để thực hiện việc này không? Tôi đã nghĩ đến việc thêm một bảng khác với một cột cho từng loại thông báo. Sau đó, tôi có thể thêm các cột mới nếu cần, nhưng tôi không chắc chắn hiệu quả của nó.

Cảm ơn trước!

Trả lời

20

Tôi sẽ sử dụng hai bảng. Một bảng sẽ lưu trữ dữ liệu người dùng và một bảng thông báo khác mà họ đăng ký. Bảng thứ hai sẽ trông giống như sau:

create table notifications (
    user_id int, 
    notification_type int 
); 

Tôi muốn tạo mối quan hệ FK giữa user_id và id của người dùng trong bảng người dùng với một tầng khi xóa. Sử dụng cả user_id và notification_type làm khóa chính. Để kiểm tra xem người dùng có muốn thông báo cụ thể chỉ cần tham gia giữa hai bảng và chọn các hàng có thông báo_type khớp với thông báo được đề cập hay không. Nếu tập hợp kết quả không trống thì người dùng muốn thông báo.

Thêm thông báo mới trở nên tầm thường (cũng như xóa). Chỉ cần thêm (xóa) một giá trị kiểu mới và cho phép người dùng chọn chấp nhận hay không. Nếu bạn muốn giữ các loại thông báo trong một bảng để quản lý thông qua ứng dụng cũng sẽ hoạt động, nhưng nó sẽ phức tạp hơn một chút.

+0

Điều này có vẻ là giải pháp tốt nhất cho đến nay IMO. Lưu trữ tất cả trong một cột không phải là rất mở rộng. Và lưu trữ chúng như các trường bool trong một bảng có nghĩa là bạn phải thêm một trường mới mỗi khi có một kiểu thông báo mới. – Craig

+0

Sẽ hoạt động tốt, đặc biệt nếu bạn muốn có thể quét các loại thông báo. – BCS

+0

bình thường hóa là tuyệt vời cho khả năng mở rộng, nhưng nó có một chút về hiệu suất. – stephenbayer

0

Tôi hy vọng rằng việc cho phép DB quản lý nó bằng cách sử dụng các cột Bool sẽ tốt hơn. Tôi dường như nhớ lại rằng một số hệ thống sẽ gói bools để bit (null có thể mess lên). Để tránh lộn xộn, bạn có thể biến nó thành một bảng riêng biệt.

(Tôi không có DBA)

Edit: tát đầu "Tôi chỉ gợi ý một cách chính xác những gì bạn đang điều của": b

2

Tôi sẽ sử dụng 10 bit hoặc lĩnh vực bool khác nhau. Nhưng nếu bạn làm điều đó trong một trường, bạn có thể sử dụng bitmap 0x1111111111 làm một số nguyên lớn hoặc trường văn bản không có dấu phẩy. Tôi đã làm việc trên các ứng dụng khác nhau, sử dụng tất cả các kỹ thuật đó. Nhưng tôi thực sự chỉ cần đi với nhiều lĩnh vực. Sẽ dễ dàng hơn khi thực hiện các câu lệnh chọn.

0

Nếu bạn quyết định sử dụng một trường bit như @stephenbayer được đề cập, bạn luôn có thể sử dụng chế độ xem trên bảng để các nhà phát triển dễ sử dụng hơn. Điều này có nghĩa là bạn vẫn có khoản tiết kiệm không gian trường bit và dễ sử dụng các cột riêng biệt trên mỗi trường và trong khi tránh phải phân tích cú pháp cột

Như đã đề cập, bảng riêng biệt là một tùy chọn tuyệt vời nếu bạn muốn giải pháp của mình dễ mở rộng hơn.Nhược điểm duy nhất là tăng độ phức tạp một chút.

Đây là giao dịch tắt. Nếu bạn muốn một cái gì đó thực sự dễ thực hiện và nhanh chóng xem xét trường bit. Nếu bạn muốn cái gì đó là dễ dàng hơn để mở rộng và duy trì ở chi phí phức tạp hơn một chút thì tất cả có nghĩa là đi cho bảng riêng biệt. Nếu phiếu bầu cho bạn biết bất cứ điều gì bạn có thể muốn thực hiện theo việc thực hiện bảng riêng biệt.

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