2012-05-15 50 views
9

Tôi thiết kế một cơ sở dữ liệu để xử lý người sử dụng, tài khoản và các dự án với các mối quan hệ sau và hạn chế:Phân rã một mối quan hệ ternary vào mối quan hệ nhị phân

  • Một tài khoản có nhiều người sử dụng
  • Một người sử dụng thuộc về nhiều tài khoản
  • một tài khoản có nhiều dự án
  • một dự án thuộc chỉ một tài khoản
  • một người sử dụng hợp tác trong nhiều proje cts (ghi chú dư thừa: mỗi một trong số chúng thuộc về tài khoản riêng của nó).

Nói cách khác, người dùng có thể cộng tác trong nhiều dự án của cùng một tài khoản. Nhưng vì người dùng có thể thuộc về một số tài khoản nên người dùng có thể cộng tác trong nhiều dự án của một số tài khoản. Điều này dẫn tôi đến một ternary cộng tác mối quan hệ:

enter image description here

Sau khi đọc một vài giấy tờ về việc chuyển đổi các mối quan hệ ternary vào mối quan hệ nhị phân tôi đã đưa ra các mối quan hệ tương đương sau:

enter image description here

Hai câu hỏi phát sinh ở đây:

  1. Chuyển đổi này có đúng không? Tôi đã tìm thấy rằng tôi phải thêm kiểm tra bổ sung ở cấp ứng dụng để xử lý chèn. Ví dụ: trước khi thêm (User,Project) mới, tôi phải kiểm tra xem người dùng có thuộc cùng một tài khoản mà dự án thuộc về hay không.

  2. Có thực sự cần thiết để thiết lập mối quan hệ giữa AccountUser? Khi mối quan hệ giữa UserProject đã được thêm vào, chúng tôi có thể không biết tài khoản mà người dùng thuộc về bằng cách truy cập dự án không?

Cảm ơn !!

Trả lời

11

Chuyển đổi này có đúng không?

Nếu bằng "đúng" nghĩa là "tương đương", thì không.

Không có gì ngăn bạn kết nối dự án và tài khoản mà không cần kết nối người dùng (v.v.), điều này sẽ không thể thực hiện được trong mối quan hệ thực sự.

Có thực sự cần thiết để thiết lập mối quan hệ giữa Tài khoản và Người dùng không? ... chúng tôi không thể biết tài khoản của người dùng thuộc về bằng cách truy cập dự án?

Thực ra, chúng tôi chỉ biết tài khoản nào là "ứng cử viên" được kết nối với người dùng, nhưng chúng tôi sẽ không có cách nào tốt để chọn một tài khoản.

Vấn đề thực sự với lược đồ này là nó cho phép bạn kết nối người dùng với tài khoản không liên quan đến bất kỳ dự án nào của người dùng.


Theo ý kiến ​​của tôi, nếu bạn cần mối quan hệ thứ ba, hãy tiếp tục và đại diện trực tiếp trong mô hình vật lý. Nếu tôi hiểu yêu cầu của bạn một cách chính xác, điều này sẽ giống như thế này:

enter image description here

Lưu ý cách AccountId nằm ngoài Collaboration PK. Điều này có nghĩa là mọi kết hợp dự án/người dùng phải được kết nối với chính xác một tài khoản (một kết hợp khác nhau vẫn có thể được kết nối với một tài khoản khác).

+0

Tôi thích cách tiếp cận của bạn nhưng rất nhiều người khuyên bạn nên phân tích theo mặc định, do đó, câu hỏi của tôi. – elitalon

+0

Ai đề xuất phân tích theo mặc định? –

+2

@elitalon Đừng bao giờ làm điều gì đó chỉ vì ai đó (kể cả tôi!) Nói với bạn. Luôn hiểu bạn đang làm gì và ** tại sao **, nếu không bạn sẽ [lập trình trùng hợp ngẫu nhiên] (http://pragprog.com/the-pragmatic-programmer/extracts/coincidence). –

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