2012-06-04 28 views
6

Vì vậy, một vài năm trước, tôi thấy lược đồ DB của một hệ thống được phát triển bởi một bên thứ 3 và nhận thấy họ đã sử dụng enum ('y', 'n') thay vì một trường boolean (tinyint). Tôi không biết tại sao nhưng tôi yêu nó rất nhiều, tôi thấy nó dễ đọc hơn (hoàn toàn chủ quan mà tôi biết) nhưng tôi đã sử dụng nó và bắt đầu sử dụng nó từ đó. Tôi cho rằng tôi có thể đổi nó thành "true" và "false" nhưng, tôi có thể nói gì, tôi thích nó.Có sử dụng enum ('y', 'n') thay vì một trường boolean trong bảng MySQL không?

Bây giờ bạn đang nói, có bất kỳ trở ngại nào để thực hiện mọi việc theo cách này hay không - ngoài một người lập trình có thể hơi khó chịu khi đến trễ trong trò chơi?

+3

tại sao lại bỏ phiếu này?Đây là câu hỏi hợp pháp –

+0

Tôi muốn nói nó thuộc về http://programmers.stackexchange.com thay vì bị đóng. – lanzz

Trả lời

9

Có, nó rất tệ. Bạn mất logic boolean trực quan với nó (SELECT * FROM user WHERE NOT banned trở thành SELECT * FROM user WHERE banned = 'n'), và bạn nhận được chuỗi thay vì boolean ở phía ứng dụng của bạn, vì vậy điều kiện boolean của bạn cũng trở nên cồng kềnh. Những người khác làm việc với lược đồ của bạn sẽ bị cắn bằng cách nhìn thấy các tên cột giống cờ và cố gắng sử dụng logic boolean trên chúng.

-2

Tôi nghĩ rằng đó là điều kỳ diệu - chỉ cần sử dụng boolean loại - đó là những gì nó được.

Nhưng giả sử nó để cửa mở cho các giá trị "mờ" như 'có thể' và 'có thể`.

+0

Vì vậy, enum ('y', 'n', 'p', 'm')? :) Bất kỳ lý do mang tính xây dựng nào về lý do tại sao nó là moronic ngoài những gì lanzz đã chia sẻ? Tôi đã đọc một số câu hỏi đề cập rằng enum buộc nó là true/false như trái ngược với một tinyint mà sẽ cho phép một giá trị như 9 (mà tôi đoán vẫn được đánh giá là đúng). – Gazillion

+0

Giá trị của '9' là một biểu diễn tốt cho' true', vì 'NOT 9' là' false' như mong đợi. Mặt khác, 'NOT 'n'' _and_' NOT' y'' là _both_ 'true', điều này không có ý nghĩa gì cả. – lanzz

1

Như đã giải thích trong the manual:

Nếu bạn chèn một giá trị không hợp lệ vào một ENUM (có nghĩa là, một chuỗi không có mặt trong danh sách các giá trị cho phép), các chuỗi rỗng được chèn thay vì như một lỗi đặc biệt giá trị. Chuỗi này có thể được phân biệt với chuỗi rỗng "bình thường" bởi thực tế là chuỗi này có giá trị số 0. Xem Section 11.4.4, “ Index Values for Enumeration Literals ” để biết chi tiết về các chỉ mục số cho các giá trị đếm.

Nếu chế độ SQL nghiêm ngặt được bật, cố gắng chèn giá trị ENUM không hợp lệ sẽ dẫn đến lỗi.

Về mặt này, một kết quả là ENUM với hành vi khác nhau đối với loại BOOLEAN; nếu không tôi có xu hướng đồng ý với @lanzz's answer rằng nó làm cho việc tích hợp với ứng dụng của một người ít trực tiếp hơn một chút.

0

Một yếu tố cần xem xét là liệu những người viết lược đồ gốc có giới hạn nó với MySQL hay không. Nếu nó chỉ được dự định chạy trên MySQL, thì việc thích ứng với MySQL có ý nghĩa. Nếu cùng một lược đồ có thể sử dụng được với các DBMS khác, thì một thiết kế lược đồ chung hơn hoạt động trong tất cả các DBMS có liên quan có thể tốt hơn cho những người tạo ra thiết kế.

Với những gì đã nói, các enum là vừa phải MySQL cụ thể, nhưng một cái gì đó tương đương với enum có thể dễ dàng được tạo ra trong DBMS khác:

CREATE TABLE ... 
(
    ... 
    FlagColumn CHAR(1) NOT NULL CHECK(FlagColumn IN ('y', 'n')), 
    ... 
); 

Cách mà khác nhau DBMS xử lý BOOLEAN không phải là thống nhất như bạn muốn giống như vậy, SQL Standard mặc dù (và lý do là, bao giờ hết, lịch sử; các hệ thống ít tuân thủ có một biến thể về chủ đề BOOLEAN trước khi tiêu chuẩn đã làm, và thay đổi việc thực hiện của chúng phá vỡ mã của khách hàng hiện tại của chúng).

Vì vậy, tôi sẽ không tự động kết án việc sử dụng enum qua boolean, nhưng tốt hơn nên sử dụng boolean cho cờ boolean.

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