Ưu điểm và nhược điểm của việc sử dụng loại ENUM so với Integer?


110

Hãy nói trong một số bảng ngẫu nhiên, bạn có một cột có tên trạng thái . Đó là giá trị trong thế giới thực sẽ được bật hoặc tắt .

Là loại dữ liệu của cột này tốt hơn là một int / bool (1 hoặc 0) hoặc sử dụng ENUMvới các giá trị đang enableddisabled? Những lợi thế hay bất lợi là gì?

Giả sử thay vì chỉ có hai trạng thái hợp lệ, bạn có 4 hoặc 10 hoặc thậm chí nhiều hơn? Do những lợi thế và bất lợi lắc lư sang một bên hay bên kia khi số lượng giá trị cần thiết tăng lên?


5
Câu hỏi này nên được đánh dấu bởi tất cả các Nhà phát triển MySQL vì nó có thể trở thành nguồn gốc của sự đau lòng hoặc chiến thắng. +1 !!!
RolandoMySQLDBA

Câu trả lời:


70

Tôi tìm thấy một bài viết rất kỳ quái nhưng đầy thông tin về 8 lý do tại sao người ta không nên sử dụng ENUM.

Ngay cả khi không có bài báo, tôi biết


1
Mặc dù (các) câu trả lời khác trong chủ đề này rất nhiều thông tin, tôi đánh dấu câu này là câu trả lời vì bài viết rất hữu ích.
Jake Wilson

6
+1 Bạn không thể sử dụng lại danh sách thành viên của cột ENUM trong các bảng khác. ENUM có tính di động hạn chế đối với các DBMS khác.
ngày

Tôi có thể phải làm gì nếu tôi có một lĩnh vực có quan hệ với các bản ghi khác của cùng một bảng? Ví dụ: giả sử unitsmô hình cho một mặt hàng cửa hàng trong đó mỗi bản ghi nên có tài sản cho các đơn vị liên quan composition. tức là Tôn, Kg, gm
SaidbakR

Không có gì kỳ quái về bài viết đó - thật tuyệt! Tôi nghĩ rằng chính bài đăng này đã đưa tôi đến lý do tại sao họ xấu! Tôi đã cho nó +1!
Vérace

1
Bài viết gợi ý sử dụng một bảng cũ tốt, thay vì các loại ENUM. Chúng ta có nên thêm điều này vào câu trả lời?
Utku

39

Vâng, trước hết chúng tôi có các yêu cầu lưu trữ . Tôi sẽ giả sử bạn có nghĩa là một tinyint (thay vì int).

  • ENUM mất 1 byte (nếu dưới 255 giá trị) hoặc 2 byte (tối đa là 65,535
  • TinyInt mất 1 byte (tối đa 255 giá trị)
  • Boolean là từ đồng nghĩa với TinyInt

Nhìn bề ngoài, tất cả đều giống nhau. ENUM chiếm một số siêu dữ liệu cho giá trị chuỗi được liên kết với nó mặc dù ( src cũ hơn )

Tôi sẽ nói khi bạn thêm nhiều giá trị hơn, bất kỳ lợi thế nào cũng bắt đầu biến mất ENUM. Đặc biệt nếu bạn thêm các giá trị sau khi bảng đã được sử dụng, vì bạn phải thay đổi cấu trúc bảng để chứa.

Lợi thế của việc sử dụng là ENUMgì? Một chuỗi đại diện cho những gì giá trị có nghĩa. Đó là nó, theo như tôi quan tâm. Làm thế nào có giá trị đó là phụ thuộc vào ứng dụng của bạn.


4
+1 để đề cập đến lợi thế thực sự duy nhất: Biểu diễn chuỗi. Tất cả mọi thứ khác là một rửa đi về phía trước.
RolandoMySQLDBA

19

Tôi thấy ENUM là một định nghĩa dạng ngắn của bảng mã. Ưu điểm chính của nó là tránh được mã cần thiết để tham gia và hiển thị mô tả mã. Nó cũng dễ dàng thiết lập các giá trị nếu chúng đến ở dạng chuỗi.

Tôi thấy nó có những nhược điểm sau:

  • Không có khả năng cho siêu dữ liệu bổ sung về mã.
  • Khó thêm hoặc vô hiệu hóa các giá trị. (Việc vô hiệu hóa mã có thể được thực hiện với trường kích hoạt và hết hạn.)
  • I18n trong cơ sở dữ liệu không thể được thực hiện.
  • Không thể tái sử dụng trên các bảng.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.