2012-07-15 32 views
13

Tôi đã làm việc chủ yếu với Oracle trong vài năm qua, và tôi khá quen với việc nhìn thấy các cột đơn varchar ký tự được sử dụng như các giá trị boolean.Tại sao các cột kiểu BOOLEAN có vấn đề trong thiết kế cơ sở dữ liệu quan hệ?

Tôi cũng có thể thấy (mỗi câu trả lời tràn ngăn xếp), loại đề xuất cho MySQL là TINYINT.

Bây giờ tôi đã thực hiện dự án nhỏ của mình - sử dụng DerbyDB, và nó hỗ trợ các cột BOOLEAN, nhưng không cho đến sau phiên bản 10 hoặc lâu hơn.

Vì vậy, câu hỏi đặt ra là tại sao việc kết hợp cột BOOLEAN lại khó khăn trong khi thiết kế một cơ sở dữ liệu quan hệ? Tôi có thiếu một cái gì đó, hoặc là nó chỉ đẩy xuống danh sách việc cần làm là không quan trọng, vì bạn có thể sử dụng một loại cột khác trong khi đó?

+0

Và để thêm vào danh sách SQL Server của bạn chỉ hỗ trợ 'bit' chứ không phải là' ANSI 'kiểu dữ liệu boolean. –

+0

vâng và với tất cả những gì bạn đã làm tôi khá vui mừng về việc thực hiện bit quantic trong cơ sở dữ liệu ... – Sebas

+0

Cuộc tranh luận này đã được chiến đấu trong C++ và các ngôn ngữ khác và chiến thắng bởi những người ủng hộ 'bool' một thời gian dài trước đây và hầu hết các DBMS hỗ trợ nó theo một cách hay cách khác nữa. Thật không may, một số vẫn còn tụt lại phía sau, đáng chú ý nhất là Oracle. Thành thật mà nói, tất cả những lời giải thích tôi nghe được cho đến nay tại sao lại không có ý nghĩa với tôi ... –

Trả lời

7

Tom Kyte khá nhiều vang câu cuối cùng của bạn in this blog entry:

"Nó chỉ không phải là một loại chúng tôi có - Tôi có thể nói không hơn không kém.ANSI không có - nhiều cơ sở dữ liệu không có nó (chúng tôi chắc chắn không phải là một mình). Trong đề án lớn của sự vật - Tôi sẽ nói priotization của việc này là khá "thấp" (thats Theo tôi đó) "

Ông đang nói từ quan điểm Oracle, nhưng nó áp dụng cho bất kỳ RDBMS quan hệ..

+2

Để tôi dịch: "Chúng tôi không đưa ra thông tin về nhà phát triển vì họ không thể chuyển đổi sản phẩm" –

+0

@ JensSchauder: với tôi nó cũng dịch thành "* Chúng tôi không quan tâm tiêu chuẩn ANSI nói gì * ". Tuyên bố của Tom là từ năm 2002 và kiểu 'BOOLEAN' đã được giới thiệu trong SQL99. –

-1

Tôi không biết vì tôi chưa thiết kế, nhưng tôi đoán là vì RDBMS là về mô tả và lưu trữ bộ đồ vật, trường boolean không cần thiết vì chúng cũng biểu thị những gì có trong một tập hợp, nhưng chúng không liên quan như là thành viên của các bộ sẽ được bắt nguồn từ dữ liệu hoặc cấu trúc thực tế của cơ sở dữ liệu.

Ví dụ: lấy cột boolean cho vai trò được cung cấp cho nhân viên, nơi họ là người quản lý hoặc họ không phải là người quản lý. Bạn có thể sử dụng cột boolean để mô tả điều này, nhưng những gì bạn nên làm là có bảng cho người quản lý và bảng cho người quản lý không hoặc (và đây sẽ là cách linh hoạt hơn và có thể quản lý hơn) tạo thêm "tra cứu" bảng cung cấp các vai trò (như một cột văn bản đơn) và và khóa đó sau đó được nhắc đến (một khoá ngoại) trong bảng nhân viên.


Tôi nghĩ rằng tôi nên thêm rằng hầu hết thời gian bạn thấy một lĩnh vực boolean trong một bảng đó là một mùi mã, vì nó sẽthể hiệu suất hit - sử dụng một boolean trong một mệnh đề where sẽ gọi một bảng quét và làm cho một chỉ mục trên bảng khá vô nghĩa (nhưng xem các ý kiến ​​cho một cuộc thảo luận thêm về điều này). Tôi có thể đoán thêm rằng các kiểu dữ liệu boolean đã được thêm vào hầu hết các RDBMS để sử dụng trong các phần mở rộng ngôn ngữ thủ tục của chúng (T-SQL, PLSQL) để trợ giúp với câu lệnh điều kiện lẻ cần thiết.

+2

Một boolean trong mệnh đề where * không * nhất thiết có nghĩa là quét bảng sẽ được sử dụng. Điều đó phụ thuộc vào số lượng hàng mà điều kiện sẽ trả lại (như với bất kỳ điều kiện nào khác) –

+0

@a_horse_with_no_name Điều đó thật thú vị, bạn có liên kết hữu ích về điều đó không? – iain

+0

@lain: không thực sự nhưng đó là quy tắc chung để sử dụng chỉ mục (không bao gồm chỉ mục): khi số hàng được truy xuất từ ​​bảng vượt quá ngưỡng nhất định, việc quét bảng nhanh hơn quét chỉ mục. Do đó nếu số lượng hàng đủ nhỏ thì việc quét chỉ mục sẽ được sử dụng. Nó không quan trọng những gì datatype cột được lập chỉ mục có. –

12

Trong trường hợp của Derby, cụ thể, câu trả lời là một chút lịch sử lạ: Derby, cơ sở dữ liệu nguồn mở, từng được gọi là Cloudscape và là một sản phẩm độc quyền. Vào thời điểm đó, nó hỗ trợ đầy đủ BOOLEAN.

Sau đó, Cloudscape đã được mua bởi Informix do IBM mua và kỹ sư IBM đã quyết định làm cho Derby tương thích với DB2. Lý do cho điều này là, nếu hai cơ sở dữ liệu tương thích, người dùng sẽ dễ dàng di chuyển các ứng dụng của họ giữa cơ sở dữ liệu Derby và cơ sở dữ liệu DB2. Tuy nhiên, các nhân viên kỹ thuật đã không loại bỏ các tính năng không tương thích với DB2 từ Derby, họ chỉ đơn giản là vô hiệu hóa chúng trong ngữ pháp SQL, để lại hầu hết việc thực hiện tại chỗ.

Sau đó, Cloudscape có nguồn mở của IBM đến Quỹ phần mềm Apache, đặt tên là Derby. Cộng đồng nguồn mở, không còn bị ràng buộc bởi yêu cầu Derby hoàn toàn tương thích với DB2, quyết định làm sống lại sự hỗ trợ kiểu dữ liệu BOOLEAN. Và vì vậy Derby hiện có hỗ trợ kiểu dữ liệu BOOLEAN.

+0

+1 cho lịch sử derby. Không bao giờ nghĩ về nó. Thật sự thú vị. –

2

PostgreSQL không có hỗ trợ cho boolean cho miễn là tôi có thể nghĩ

các doc trực tuyến lâu đời nhất tôi có thể tìm được cho phiên bản 6.3 phát hành 1998/03/01 Họ đề cập đến kiểu boolean:..

http://www.postgresql.org/docs/6.3/static/c0805.htm

Trong later docs, chúng đề cập đến SQL99 làm tiêu chuẩn chúng tuân theo.

Kể từ SQL99 dường như đề cập đến loại này, tôi sẽ giả định, rằng nhiều DBS đã có hỗ trợ cho loại đó khá tốt trước năm 1999.

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