2008-12-03 38 views
22

Ví dụ: tôi có bảng "người dùng" có cột "loại" enum với hai giá trị có thể có: "cá nhân" và "tổ chức". Chúng là loại trừ lẫn nhau và bắt buộc (mỗi hàng phải có chính xác một giá trị từ hai giá trị có thể. Đây có phải là một trường hợp tốt để sử dụng enums không??)Cơ sở dữ liệu enums - ưu và khuyết điểm

Một số ưu điểm và nhược điểm khi sử dụng ENUM (set) ?. loại cho các lĩnh vực cơ sở dữ liệu

+1

RDBMS nào khác ngoài MySQL hỗ trợ kiểu dữ liệu ENUM? (Đây không phải là một quesion hùng biện.) – Tomalak

+0

@Tomalak: Tôi biết postgresql nào. –

+0

Câu hỏi hay, tôi muốn người khác tham gia và mang lại câu trả lời cho nó. Tomalak, có lẽ bạn thực sự nên đăng câu hỏi của bạn như là một câu trả lời con nếu bạn biết một số RDBMS phổ biến mà thực sự không hỗ trợ enum và liệt kê chúng. – Tom

Trả lời

17

Vâng, đây có vẻ như một ứng cử viên tốt cho một enum

Ưu điểm:

  • nhỏ (không gian đĩa)
  • nhanh (số nguyên so sánh)
  • 0.123.
  • Dễ hiểu (chủ yếu)

Nhược điểm:

  • Không thể thêm một giá trị mà không thay đổi cấu trúc bảng
  • Phải cẩn thận với độ nhạy trường hợp ở những nơi
  • Có thể rất khó hiểu nếu sử dụng xấu ... không sử dụng active = enum ('1', '0') như tôi phải đưa lên!
  • Không được hỗ trợ bởi tất cả các cơ sở dữ liệu
+3

+1 (Tôi sẽ thêm "khóa-in" vào một sản phẩm máy chủ DB nhất định vào Cons) – Tomalak

+0

Điều gì sai với hoạt động = enum (1,0)? – Tom

+3

active = 0 không giống như active = '0'! – Greg

9

Cá nhân tôi đã luôn luôn ưa thích để có cột int tiêu chuẩn cho điều này, với một liên kết chính nước ngoài vào một bảng mô tả. Điều này cho phép bạn giới hạn các giá trị cho cột id loại.

Tất nhiên điều này có thể dẫn đến bảng bloat, nhưng nó cho phép bạn có bảng "bản địa hóa" đi kèm với bảng mô tả, để ứng dụng của bạn có thể hiển thị nội dung được bản địa hóa trong danh sách thả xuống/báo cáo, v.v.

User.UserTypeID -> UserType.UserTypeID -> UserTypeLocalised.UserTypeID where locality = ?? 

Đây cũng là cơ sở dữ liệu bất khả tri hơn và do đó dễ dàng chuyển sang các nền tảng khác nhau.

Ngoài ra, điều này không đúng đối với người dùng là cá nhân hoặc tổ chức. Tôi hy vọng một người dùng sẽ là một phần của một tổ chức, thay vào đó sẽ yêu cầu một bảng Organization và người dùng có một cột OrganisationID. Kiểu người dùng thường có nhiều khả năng là sự khác biệt "Con người/hệ thống" (giả sử hệ thống của bạn sử dụng các logons môi trường xung quanh để thực hiện các hoạt động và bạn muốn có kiểm toán).

6

Đặt dữ liệu tham chiếu vào bảng bằng khóa ngoài có nghĩa là cơ sở dữ liệu có thể thực thi quy tắc toàn vẹn dữ liệu. Bạn cũng có thể thêm một loại khác (ví dụ: 'Internal' hoặc 'Non-Profit') mà không phải mở rộng lược đồ cơ sở dữ liệu. Cuối cùng, bạn có thể chú thích bảng tham chiếu bằng cờ hoặc mã hóa khác để cho phép bạn triển khai logic nghiệp vụ theo hướng dữ liệu nếu muốn.

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