2012-07-20 35 views
6

Thay vì có khóa chính kết hợp (bảng này duy trì mối quan hệ giữa hai bảng đại diện cho hai thực thể [hai bảng]), thiết kế được đề xuất để có cột identity làm khóa chính và ràng buộc dữ liệu duy nhất được thực thi trên hai cột đại diện cho dữ liệu từ khóa chính của các thực thể.Ưu điểm và nhược điểm của việc có khóa chính composite ...

Đối với tôi, việc có cột nhận dạng cho mỗi bảng quan hệ là phá vỡ các quy tắc chuẩn hóa.

  • Tiêu chuẩn ngành là gì?
  • Những cân nhắc cần thực hiện trước khi đưa ra quyết định thiết kế về điều này là gì?
  • Phương pháp nào là đúng?

Cảm ơn bạn,
Smith

+2

Bài viết đơn giản về các phím tổng hợp của pro: http://weblogs.sqlteam.com/jeffs/archive/2007/08/23/composite_primary_keys.aspx – RThomas

+0

không cần cột nhận dạng, khóa chính về cơ bản là một tập hợp cột (1 hoặc nhiều hơn) xác định duy nhất dữ liệu của bạn. Bằng cách thêm một cột nhận dạng, bạn đang thêm một chỉ mục bổ sung và tạo chỉ mục mà bạn có thể sử dụng nhiều nhất (với 2 cột quan trọng) là không nhóm, cộng với cập nhật/chèn sẽ chậm hơn một chút, v.v. Về cơ bản, không cần. – Rodolfo

+0

@RThomas - Trong weblog đó, họ đang sử dụng mối quan hệ Khách hàng-> Sản phẩm không nên có khóa tổng hợp vì nó cho biết dữ liệu giao dịch. Có * có thể * là nhiều mối quan hệ được tạo ra tại các thời điểm khác nhau, bảng đó cần một Mã định danh duy nhất PKey. ví dụ: đặt hàng chai rượu vang, dưới cùng một SKU - được tham chiếu bởi một ProductID duy nhất - (không lý tưởng, nhưng có thể). Nhưng, nếu mỗi chai có ID riêng, thì "giới hạn đặt hàng" là tranh luận vì bạn phải tạo một bản ghi giao dịch riêng cho mỗi mục. Hoặc bạn đã xây dựng cấu trúc sai hoặc bạn đang theo dõi dữ liệu không chính xác. – hajikelist

Trả lời

5

Có rất nhiều các bảng, nơi bạn có thể muốn có một cột sắc như một khóa chính. Tuy nhiên, trong trường hợp bảng quan hệ M: M mà bạn mô tả, thực hành tốt nhất là KHÔNG sử dụng cột nhận dạng mới cho khóa chính.

Liên kết của RThomas trong nhận xét của anh ấy cung cấp lý do tuyệt vời vì sao thực tiễn tốt nhất là KHÔNG thêm cột nhận dạng. Đây là that link.

Các khuyết điểm sẽ vượt trội hơn những ưu điểm trong mọi trường hợp, nhưng kể từ khi bạn yêu cầu ưu và khuyết điểm, tôi cũng đưa ra một số ưu điểm không mong muốn.

Nhược điểm

  • Thêm phức tạp

  • có thể dẫn đến trùng lặp các mối quan hệ, trừ khi bạn thực thi độc đáo về mối quan hệ (mà một khóa chính sẽ làm theo mặc định).

  • Có thể chậm hơn: db phải duy trì hai chỉ mục thay vì một chỉ mục.

Ưu

Tất cả những ưu là khá sơ sài

  • Nếu bạn đã có một tình huống mà bạn cần sử dụng khóa chính của bảng mối quan hệ như một tham gia vào một bảng riêng biệt (ví dụ như một bảng kiểm toán?) Việc tham gia có thể sẽ nhanh hơn. Hơn nữa, nếu bảng quan hệ của bạn là mối quan hệ giữa các bảng mà bản thân họ sử dụng các ID duy nhất, tốc độ tăng từ việc sử dụng một cột nhận dạng trong kết hợp với hai sẽ là tối thiểu.)

  • Ứng dụng, để đơn giản, có thể giả định rằng mọi bảng mà nó hoạt động có ID duy nhất làm khóa chính của nó. (Đó là thiết kế kém trong ứng dụng nhưng bạn có thể không có quyền kiểm soát nó.) Bạn có thể tưởng tượng một kịch bản tốt hơn nên giới thiệu thêm một số phức tạp trong DB hơn sự phức tạp thêm vào một ứng dụng như vậy.

+0

Câu trả lời là sử dụng cả hai - luôn có một định danh duy nhất trên mỗi bảng [điều này có nhiều lợi ích/lợi ích dựa trên hiệu suất thuần túy - người lập trình phải làm việc với các cấu trúc này và điều quan trọng là phải có một phương pháp nhất quán để tương tác với dữ liệu *], nhưng sử dụng các phím tổng hợp ở nơi có ý nghĩa để làm như vậy! Và trên tất cả, hãy nhất quán trong kiến ​​trúc cơ sở dữ liệu của bạn. – hajikelist

2

Nhược điểm:

  • khóa chính tổng hợp phải nhập khẩu trong tất cả các bảng tham khảo. Điều đó có nghĩa là các chỉ mục lớn hơn và nhiều mã hơn để viết (ví dụ: các kết nối, các bản cập nhật). Nếu bạn có hệ thống về việc sử dụng các khóa chính tổng hợp, nó có thể trở nên rất cồng kềnh.
  • Bạn không thể cập nhật một phần của khóa chính. Ví dụ. nếu bạn sử dụng university_id, student_id làm khóa chính trong bảng trường đại học sinh viên và một sinh viên thay đổi trường đại học, bạn phải xóa và tạo lại bản ghi.

Ưu điểm:

  • khóa chính composite cho phép để thực thi một loại phổ biến của chế một cách mạnh mẽ và seemless. Giả sử bạn có một bảng UNIVERSITY, một bảng STUDENT, một bảng COURSE và một bảng STUDENT_COURSE (trong đó học sinh theo học khóa học nào). Nếu đó là hạn chế bạn luôn phải là phải là sinh viên của trường đại học A để theo một khóa học là trường đại học A, thì ràng buộc đó sẽ tự động được xác thực nếu university_id là một phần của khóa tổng hợp của cả STUDENT và KHÓA HỌC.
2

Bạn phải tạo tất cả các cột trong mỗi bảng bất cứ nơi nào nó được sử dụng làm khóa ngoài. Đây là bất lợi lớn nhất.

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