2010-06-15 14 views
12

Tôi đã đọc qua một số hướng dẫn về tối ưu hóa cơ sở dữ liệu và thực hành tốt nhất và rất nhiều trong số họ đề xuất không sử dụng cờ boolean ở tất cả trong lược đồ DB (ví dụ: http://forge.mysql.com/wiki/Top10SQLPerformanceTips). Tuy nhiên, họ không bao giờ cung cấp bất kỳ lý do gì là tại sao điều này là xấu. Nó là một vấn đề về peformance? khó lập chỉ mục hay truy vấn đúng cách?Tại sao sử dụng cờ boolean trong cơ sở dữ liệu lại xấu? Và những gì nên được sử dụng thay thế?

Hơn nữa, nếu cờ boolean là xấu, bạn nên sử dụng những gì để lưu trữ các giá trị boolean trong cơ sở dữ liệu? Là tốt hơn để lưu trữ cờ boolean như một số nguyên và sử dụng một bitmask? Điều này có vẻ như nó sẽ ít có thể đọc được.

+6

Đừng bao giờ coi trọng bất cứ ai sẽ chỉ nói với bạn "Không sử dụng cờ boolean" hoặc "Sử dụng chỉ mục" mà không có lý do gì. – cherouvim

+1

Có vẻ như họ không cung cấp lý do cho * mọi thứ * trên trang đó. – animuson

+0

OK, để công bằng đây là những ghi chú từ một sự kiện/trại. Tôi vẫn không biết tại sao loại trường đúng/sai là xấu. – cherouvim

Trả lời

5

Tôi không nghĩ rằng nó xấu và tôi chưa bao giờ thấy lý do được nêu rõ cho điều này. Có lẽ một số công cụ cơ sở dữ liệu cũ không thể lưu trữ chúng một cách hiệu quả, nhưng những công cụ hiện đại thì có. Như bạn nói, nó có thể đọc được nhiều hơn để sử dụng boolean hơn bitmask. Xem câu hỏi này để thảo luận tương tự: Is adding a bit mask to all tables in a database useful?

4

Lý do duy nhất tôi có thể nghĩ là trường hợp bạn nên sử dụng ENUM thay thế. Chắc chắn, bạn chỉ muốn đúng và sai bây giờ, nhưng nếu bạn muốn thêm một cái gì đó khác sau đó hơn bạn cần phải làm một hoạt động ALTER TABLE, mà có thể rất tốn kém.

+1

Enums rock bất kể chúng được triển khai như thế nào (enum, varchar, int): http://www.mysqlperformanceblog.com/2008/01/24/enum-fields-vs-varchar-vs-int-joined-table-what -is-faster/ – cherouvim

+1

@cherouvim: Tôi không thấy lý do tại sao các loại BOOL cần được triển khai khác với các loại ENUM. Chúng chỉ là số nguyên bên dưới. –

+0

@cherouvim: Nhưng nó có số nguyên đơn giản. Booleans và enums chỉ đơn giản là hàm bao quanh các số nguyên. Do đó sẽ có rất ít nếu có sự khác biệt về hiệu suất giữa chúng. EDIT: Điều này là để đáp ứng với một bình luận đã bị xóa bây giờ. –

1

Đoán của tôi: tính di động của thiết kế của bạn.

ví dụ:

  1. Microsoft Access đối xử với boolean như -1 là đúng hay sai 0 như trong khi cơ sở dữ liệu khác có thể điều trị boolean khác nhau.

  2. Trong MySQL (phiên bản 4+) mặt khác, giá trị bằng không được coi là sai. Các giá trị khác không được coi là đúng.

+1

Dựa vào bất kỳ chuyển đổi datatype nào là không thể thay đổi trong SQL, không chỉ là bool -> int. –

+0

Trong MySQL, các giá trị TRUE và FALSE chỉ là các bí danh tương ứng với 1 và 0. –

0

Thực hành cơ sở dữ liệu được cấp có ít liên quan đến lý thuyết, tôi vẫn sẽ cố gắng giải thích lý thuyết. Bàn là quan hệ hữu hạn. Mỗi quan hệ là một phần mở rộng của vị từ. Thuộc tính Boolean là một từ khóa sai cho một vị từ.

+0

Vâng, có thể là tiếng Anh hoặc toán học của tôi là xấu, nhưng bài viết của bạn có vẻ như mumbo-jumbo với tôi;) Ngoài ra cách boolean thuộc tính khác với bất kỳ thuộc tính không boolean khác, có thể chỉ có hai giá trị? Ngoài ra, các thuộc tính boolean không hình thành bất kỳ quan hệ nào giống như các số nguyên, tôi nghĩ vậy. –

+0

Các giá trị tương tự của boolean TRUE và FALSE là TABLE_DEE và TABLE_DUM. Không có gì sai với ý tưởng về các mối quan hệ lồng nhau, tất nhiên, nhưng quan điểm khác là các giá trị boolean đã có trong RDBMS, ngay cả khi không có miền boolean rõ ràng nào có các giá trị boolean. –

-1

This thread provides the best answer mà tôi đã tìm thấy. Tóm lại, các thuộc tính tiếp cận như boolean ngăn cản bạn lập mô hình dữ liệu một cách chính xác và độc lập (tức là, bình thường hóa). Giải pháp tốt hơn - không chỉ từ quan điểm của mô hình hóa, mà còn từ quan điểm về tính dễ sử dụng và dễ bảo trì, là sử dụng các bảng tra cứu bổ sung. Và nếu ý tưởng tham gia nhiều hơn và bảng scares bạn, hãy chắc chắn để đọc toàn bộ thread.

+1

Tôi thực sự không thấy cách điều này thực sự ngăn bạn lập mô hình dữ liệu chính xác. Bạn có thể vui lòng xây dựng? –

+0

Để trích dẫn một bài đăng từ chủ đề nói trên: "[Nhận dạng các thuộc tính là boolean] cản trở khả năng mô hình dữ liệu độc lập. Hãy gọi bảng chính Person và các thuộc tính bạn mô tả Mô tả. Vấn đề xác định là bảng Person có thể có một hoặc nhiều Mô tả, mỗi Mô tả có thể áp dụng cho một hoặc nhiều Người. Một bảng kết hợp thông thường là bắt buộc: PersonDescription. " Vì vậy, xử lý các thuộc tính như boolean bỏ qua các mối quan hệ. Các lợi ích bổ sung là tính dễ sử dụng và dễ bảo trì. – buckthorn

+0

Tôi không nghĩ rằng lời khuyên có thể được áp dụng đúng cho mọi trường hợp. Tất nhiên, thuộc tính boolean có thể được coi là cờ của sự hiện diện/vắng mặt của một số thuộc tính. Nhưng nếu không có thông tin khác liên quan đến thuộc tính đó, việc tạo một bảng riêng biệt có thể tác động tiêu cực đến hiệu suất mà không có lý do chính đáng. Tôi không đồng ý với tuyên bố rằng cờ boolean là rất khó hiểu, mà bạn cần phải nhầm lẫn với bản thân của bạn với việc tạo ra bảng riêng biệt và thiết lập mối quan hệ. –

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