2010-02-17 33 views
7

Tôi có 3 loại khác nhau của người sử dụng và từng loại sử dụng có thể có các cột và các mối quan hệ với các bảng kiểu khác thì không, nhưng tất cả đều có đăng nhập (Unique) và mật khẩu,
làm thế nào bạn sẽ làm gì:đặt thông tin đăng nhập và mật khẩu vào một bảng hoặc trong nhiều bảng cho từng loại người dùng?

  • tạo một bảng cho từng loại hoặc
  • tạo một bảng cho tất cả trong số họ hoặc
  • tạo một bảng cho tất cả trong số họ chỉ để đăng nhập và mật khẩu và riêng biệt cho tất cả những điều khác và ràng buộc chúng với một FK
  • cái gì khác
+0

Tôi muốn nói điều đó phụ thuộc :) Có gì khác mà họ chia sẻ không? Bạn có muốn hiển thị chúng trên một trang không? Người dùng có thể bị "chuyển" không? Có thể cùng một người dùng tồn tại với hai loại không? –

+0

có, họ cũng có thể chia sẻ FirstName, LastName, vv Một người dùng không thể tồn tại với hai loại. Không biết những gì bạn có nghĩa là bằng cách chuyển giao, vì vậy tôi đoán không :). – Omu

+0

đặt mọi thứ họ chia sẻ trong cùng một bảng. Xem bảng trên http://en.wikipedia.org/wiki/Database_normalization#Normal_forms – chelmertz

Trả lời

2

Tôi có câu hỏi chính xác này khi xây dựng một hệ thống gần đây. Đây là một chủ đề cực kỳ hữu ích đối với tôi: Object-oriented-like structures in relational databases.

Tôi đã đi với giải pháp phân nhóm phụ, được mô tả kỹ ở đây: Polymorphism in SQL database tables?

+0

Tôi thấy, giải pháp đó, là giải pháp hoàn hảo từ các điểm khó khăn của xem, nhưng tôi nghĩ rằng nó sẽ được chậm hơn và tôi sẽ gặp rắc rối nhiều hơn với tất cả những hợp chất FK – Omu

+0

noup :), nó thực sự tốt hơn, tôi cần DB của tôi phù hợp – Omu

11

Số 3 là tốt nhất trong những lựa chọn bạn đề nghị (cập nhật hơi để làm rõ):

  • tạo một bảng cho tất cả trong số họ để đăng nhập và mật khẩu và bất cứ điều gì khác mà được chia sẻ và riêng biệt bảng cho tất cả những thứ khác không được chia sẻ và liên kết chúng với một FK

Ngoại trừ việc không lưu trữ mật khẩu, lưu trữ phiên bản băm của mật khẩu đã được muối.

Cách thay thế có thể là chỉ định nhóm và/hoặc vai trò cho người dùng của bạn. Điều này có thể linh hoạt hơn cấu trúc bảng cố định, cho phép bạn thêm các vai trò mới động. Nhưng nó phụ thuộc vào nhu cầu của bạn cho dù điều này có ích cho bạn hay không.

Như Aaronaught đã chỉ ra, trong bảng chính bạn cần AccountType để đảm bảo rằng người dùng chỉ có thể có một trong các vai trò. Bạn phải hãy nhớ kiểm tra giá trị của cột này khi tham gia các bảng để đảm bảo rằng người dùng chỉ có một vai trò hoạt động.

Ràng buộc duy nhất trên khóa ngoại đảm bảo rằng người dùng chỉ có thể có vai trò một lần.

+0

một điều với tùy chọn này là không có ràng buộc để ngăn chặn hai hàng từ 2 bảng loại người dùng khác nhau để tham chiếu cùng một hàng trong " login_password "table – Omu

+1

@Omu: Đặt ràng buộc' UNIQUE' trên cột đó trong mỗi bảng FK và sử dụng cột phân biệt ('AccountType') trong bảng chính. Tuy nhiên, bạn nên có sự phân biệt đối xử, điều đó rất quan trọng cho hiệu quả (và Mark, tôi nghĩ bạn nên thêm điều này). – Aaronaught

+0

@Aaronaught: Tốt. Khi tôi đăng câu trả lời ban đầu của tôi là không rõ ràng rằng mỗi người dùng chỉ có thể có một vai trò, nhưng tôi có thể thấy rằng bây giờ từ ý kiến ​​của Omu. –

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