80

Ví dụ này được lấy from w3schools.Tại sao sử dụng nhiều cột làm khóa chính (khóa chính kết hợp)

CREATE TABLE Persons 
(
    P_Id int NOT NULL, 
    LastName varchar(255) NOT NULL, 
    FirstName varchar(255), 
    Address varchar(255), 
    City varchar(255), 
    CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName) 
) 

hiểu biết của tôi là cả hai cột với nhau (P_IdLastName) đại diện cho một khóa chính cho bảng Persons. Điều này có đúng không?

  • Tại sao một người nào đó muốn sử dụng nhiều cột làm khóa chính thay vì một cột?
  • Có thể sử dụng bao nhiêu cột cùng nhau làm khóa chính trong một bảng nhất định?
+0

... bây giờ đó cũng là một [câu trả lời cho Câu hỏi 2'] (http://stackoverflow.com/a/41741054/2932052) – Wolf

Trả lời

97

Hiểu biết của bạn là chính xác.

Bạn sẽ thực hiện việc này trong nhiều trường hợp. Một ví dụ có mối quan hệ như OrderHeaderOrderDetail. PK trong OrderHeader có thể là OrderNumber. PK trong OrderDetail có thể là OrderNumber AND LineNumber. Nếu đó là một trong hai, nó sẽ không phải là duy nhất, nhưng sự kết hợp của hai được đảm bảo duy nhất.

Cách khác là sử dụng khóa chính được tạo (không thông minh), ví dụ trong trường hợp này là OrderDetailId. Nhưng sau đó bạn sẽ không luôn luôn nhìn thấy mối quan hệ dễ dàng như vậy. Một số người thích một cách; một số thích cách khác.

+0

Đây có phải là hữu ích nếu tôi đang sử dụng branch_id và sử dụng nhân rộng giữa hai cơ sở dữ liệu, sẽ giải quyết trùng lặp của id? !! – Mhmd

+5

Lưu ý rằng trong nhiều trường hợp sử dụng khóa chính đã tạo, bạn vẫn muốn có một khóa duy nhất trên các giá trị tổng hợp. –

2

Có, cả hai đều tạo thành khóa chính. Đặc biệt trong các bảng mà bạn không có surrogate key, có thể cần phải chỉ định nhiều thuộc tính làm số nhận dạng duy nhất cho mỗi bản ghi (ví dụ xấu: bảng có cả tên và họ có thể yêu cầu kết hợp chúng là duy nhất).

20

Một ví dụ khác về các khóa chính ghép là việc sử dụng các bảng Association. Giả sử bạn có bảng người chứa một nhóm người và một bảng nhóm có chứa một tập hợp các nhóm. Bây giờ bạn muốn tạo mối quan hệ nhiều với nhiều người và nhóm. Có nghĩa là mỗi người có thể thuộc về nhiều nhóm. Đây là cấu trúc bảng trông như thế nào khi sử dụng khóa chính ghép.

Create Table Person(
PersonID int Not Null, 
FirstName varchar(50), 
LastName varchar(50), 
Constraint PK_Person PRIMARY KEY (PersonID)) 

Create Table Group (
GroupId int Not Null, 
GroupName varchar(50), 
Constraint PK_Group PRIMARY KEY (GroupId)) 

Create Table GroupMember (
GroupId int Not Null, 
PersonId int Not Null, 
CONSTRAINT FK_GroupMember_Group FOREIGN KEY (GroupId) References Group(GroupId), 
CONSTRAINT FK_GroupMember_Person FOREIGN KEY (PersonId) References Person(PersonId), 
CONSTRAINT PK_GroupMember PRIMARY KEY (GroupId, PersonID)) 
+0

giải thích tuyệt vời: Tôi nghĩ rằng sự cần thiết của các thuộc tính cho quan hệ m-to-n (trong một fasion bình thường hóa) là chìa khóa. – Wolf

8

Ví dụ W3Schools không nói khi bạn nên sử dụng các khóa chính ghép và chỉ đưa ra ví dụ bằng cách sử dụng cùng một bảng mẫu cho các phím khác.

Lựa chọn ví dụ của họ có lẽ gây nhầm lẫn cho bạn bằng cách kết hợp khóa vô nghĩa (P_Id) và khóa tự nhiên (Họ). Lựa chọn kỳ quặc này của khóa chính nói rằng các hàng sau đây là hợp lệ theo lược đồ và cần thiết để xác định duy nhất một học sinh. Trực giác điều này không có ý nghĩa.

1234  Jobs 
1234  Gates 

Đọc thêm: The great primary-key debate hay chỉ Google meaningless primary keys hoặc thậm chí lướt này SO question

FWIW - My 2 cent là để tránh khóa chính nhiều cột và sử dụng một trường id tạo đơn (phím thay thế) là khóa chính và thêm các ràng buộc bổ sung (duy nhất) khi cần thiết.

2

Nhiều cột trong một khóa sẽ nói chung, hoạt động kém hơn so với khóa thay thế. Tôi thích có một khóa thay thế và sau đó là một chỉ mục duy nhất trên một khóa đa điểm. Bằng cách đó bạn có thể có hiệu suất tốt hơn và tính duy nhất cần thiết được duy trì.Và thậm chí tốt hơn, khi một trong các giá trị trong khóa đó thay đổi, bạn cũng không phải cập nhật một triệu mục con trong 215 bảng con.

2

Bạn sử dụng khóa phức hợp (khóa có nhiều hơn một thuộc tính) bất cứ khi nào bạn muốn đảm bảo tính duy nhất của kết hợp một số thuộc tính. Một khóa thuộc tính duy nhất sẽ không đạt được điều tương tự.

+1

Để đảm bảo khóa duy nhất, bạn có thể dựa vào sự kết hợp của hai thuộc tính để tạo thành khóa không thể sao chép hợp lý, Người và ngày tốt nghiệp từ tập dữ liệu lớn hơn sẽ là một ví dụ. –

0

Sử dụng khóa chính trên nhiều bảng có ích khi bạn đang sử dụng bảng trung gian trong cơ sở dữ liệu quan hệ.

Tôi sẽ sử dụng cơ sở dữ liệu tôi đã thực hiện cho một ví dụ và cụ thể là ba bảng trong bảng đó. Tôi cre ä ted một cơ sở dữ liệu cho một webcomic một số năm trước đây. Một bảng được gọi là "truyện tranh" — một danh sách tất cả truyện tranh, tên sách, tên tệp hình ảnh, v.v. Khóa chính là "truyện tranh".

Bảng thứ hai là "ký tự" — tên của chúng và mô tả ngắn gọn. Khóa chính là "charname".

Vì mỗi truyện tranh — với một số ngoại lệ — có nhiều ký tự và mỗi ký tự xuất hiện trong nhiều truyện tranh, không thực tế khi đặt cột trong "ký tự" hoặc "truyện tranh". Thay vào đó, tôi cre ä ted a bảng thứ ba được gọi là "truyện tranh" và đó là danh sách các nhân vật xuất hiện trong truyện tranh nào. Vì bảng này về cơ bản gia nhập hai bảng, nó cần thiết nhưng hai cột: charname và comicnum, và khóa chính là trên cả hai.

2

phần câu hỏi thứ hai của bạn

bao nhiêu cột có thể được sử dụng với nhau như một khóa chính trong một bảng được đưa ra?

là triển khai cụ thể: được xác định trong DBMS thực tế đang được sử dụng. [1], [2], [3] Bạn phải kiểm tra đặc tả kỹ thuật của hệ thống cơ sở dữ liệu bạn sử dụng. Một số rất chi tiết, một số thì không. Tìm kiếm trên web về giới hạn như vậy có thể khó khăn vì thuật ngữ thay đổi. Thuật ngữ khóa chính composite phải được thực hiện bắt buộc;)

Nếu bạn không thể tìm thấy thông tin rõ ràng, hãy thử với cơ sở dữ liệu thử nghiệm để đảm bảo xử lý ổn định (và cụ thể)). Hãy cẩn thận để có được thông tin chính xác về điều này: đôi khi các giới hạn được tích lũy và bạn sẽ thấy các kết quả khác nhau với các bố cục cơ sở dữ liệu khác nhau.