2010-06-02 35 views
7

Tôi có một bảng MySQL, users, với các cột sau:Enum datatype so với bảng dữ liệu trong MySQL?

  1. user_id (PK)
  2. email
  3. tên
  4. mật khẩu

Để quản lý một hệ thống vai trò, sẽ có một nhược điểm cho một trong các tùy chọn sau đây?

Lựa chọn 1:

Tạo một bảng thứ hai được gọi là roles với ba cột: role_id (Khóa chính), namedescription, sau đó kết hợp users.user_id với roles.role_id như phím nước ngoài trong một bảng thứ ba gọi là users_roles?

Hoặc ...

Phương án 2:

Tạo một bảng thứ hai được gọi là roles với hai cột: user_id (key Ngoại từ users.user_id) và role (ENUM)? Cột kiểu dữ liệu ENUM sẽ cho phép một danh sách ngắn các vai trò cho phép được chèn vào dưới dạng các giá trị.

Tôi chưa bao giờ sử dụng kiểu dữ liệu ENUM trong MySQL trước đây, vì vậy tôi chỉ tò mò, vì tùy chọn 2 có nghĩa là một bảng ít hơn. Tôi hy vọng rằng có ý nghĩa, đây là lần đầu tiên tôi đã cố gắng để mô tả các bảng MySQL trong một diễn đàn.

Trả lời

9

Nói chung, ENUM loại không có nghĩa là được sử dụng trong các trường hợp này. Điều này đặc biệt đúng với trường hợp nếu bạn định phục vụ cho tính linh hoạt của việc thêm hoặc xóa các vai trò trong tương lai. Cách duy nhất để thay đổi các giá trị của một ENUM là với một ALTER TABLE, trong khi xác định các vai trò trong bảng riêng của chúng sẽ chỉ yêu cầu một hàng mới trong bảng roles.

Ngoài ra, sử dụng bảng roles cho phép bạn thêm các cột bổ sung để xác định vai trò, như trường description mà bạn đã đề xuất trong Tùy chọn 1. Điều này là không thể nếu bạn sử dụng loại ENUM như trong Tùy chọn 2.

Cá nhân tôi sẽ không chọn tham gia ENUM trong các trường hợp này. Có lẽ tôi có thể thấy chúng được sử dụng cho các cột với một tập hợp các giá trị hoàn toàn hữu hạn, chẳng hạn như {Spades, Hearts, Diamonds, Clubs} để xác định phù hợp với thẻ, nhưng không phải trong các trường hợp như thẻ được đề cập, vì những bất lợi được đề cập trước đó.

+0

Cảm ơn! Bạn đã làm một công việc tuyệt vời để giải thích điều này. –

0

Sử dụng ENUM cho trường hợp Bạn đề xuất chỉ có ý nghĩa khi Bạn có ORM bị bẻ khóa nghiêm ngặt trên đầu nhận để istance ánh xạ các hàng db vào danh sách các đối tượng phẳng tự động.

Ví dụ: động vật bảng (ENUM ('bò sát', 'mamals') Danh mục, (varchar 50) Tên);

được tự động maped để

đối tượng động vật animal-> Thể loại animal-> Tên

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