Có bất kỳ lợi ích nào của khóa chính bao gồm tất cả các cột của bảng không?


17

Tôi có một bảng có bốn cột hoàn toàn không có giá trị và dữ liệu sao cho cả bốn cột đều cần thiết để phân biệt một bản ghi duy nhất. Điều này có nghĩa là nếu tôi tạo khóa chính, nó sẽ cần bao gồm tất cả các cột. Các truy vấn đối với bảng hầu như sẽ luôn được lấy lại một bản ghi, tức là tất cả các cột sẽ được lọc trong truy vấn.

Vì mỗi cột sẽ cần được tìm kiếm, liệu có một khóa chính có mang lại lợi ích gì cho tôi không (ngoài việc thực thi tính duy nhất của hồ sơ)?

Câu trả lời:


12

Trong trường hợp của bạn, các trường này là khóa tự nhiên .

Phím thay thế:

Các khóa thay thế là các khóa không có ý nghĩa kinh doanh trực tuyến và chỉ được sử dụng để xác định một bản ghi trong bảng. Các khóa như vậy là cơ sở dữ liệu được tạo (ví dụ: Danh tính trong SQL Server, Chuỗi trong Oracle, Chuỗi / Nhận dạng trong UDB của DB2, v.v.) hoặc các giá trị được tạo bởi hệ thống (như được tạo thông qua một bảng trong lược đồ).

Khóa tự nhiên:

Các khóa là tự nhiên nếu thuộc tính mà nó đại diện được sử dụng để nhận dạng độc lập với lược đồ cơ sở dữ liệu. Điều này về cơ bản có nghĩa là các khóa là tự nhiên nếu mọi người sử dụng chúng ví dụ: Số hóa đơn, Mã số thuế, SSN, v.v.

Khóa thay thế so với Khóa tự nhiên cho Khóa chính

Tôi thích thêm khóa thay thế để quản lý mô hình cơ sở dữ liệu và kinh doanh riêng biệt. Một câu hỏi khác là sử dụng chỉ mục được phân cụm và không bao gồm trên khóa chính .. Nếu bạn thay đổi bảng (bảng không tĩnh, nó có chèn hoặc cập nhật chuyên sâu cao), bạn sẽ gặp vấn đề với hiệu suất trong trường hợp sử dụng chỉ mục được phân cụm trên khóa tăng không đơn điệu.


2
Tôi thường nói với mọi người rằng họ nên sử dụng khóa thay thế trừ khi họ muốn đảm bảo các chỉ số bị phân mảnh và hiệu suất kém. Luôn có ngoại lệ nhưng rất, rất ít trong trường hợp này.
AndrewQuery

7

Chúng tôi thường khuyên bạn nên có khóa thay thế trong các tình huống như vậy, vì vậy các khóa ngoại trong các bảng khác (và mọi tham chiếu bản ghi có thể được lưu trữ bên ngoài, chẳng hạn như nếu chúng được thực hiện trên các chuỗi truy vấn trong đó yêu cầu http (s) đề cập đến một của các bản ghi) có một cái gì đó để tham khảo sẽ không thay đổi nếu dữ liệu trong hàng thay đổi. Nếu bạn làm điều này thì đó sẽ là chìa khóa chính của bạn.

Nếu bạn không thêm khóa thay thế như vậy, thì hãy đưa ra cách bạn mô tả dữ liệu đang truy cập có tất cả bốn cột làm khóa chính sẽ không phải là bất lợi. Nếu bạn tạo khóa chỉ mục được nhóm cho bảng, nó sẽ giúp các yêu cầu như vậy sẽ có một cấp độ trong cây b trên đĩa để đi xuống để tìm dữ liệu cho một hàng nhất định.


1

Khóa tổng hợp làm khóa chính cũng gặp phải các vấn đề về kích thước chỉ mục có thể ảnh hưởng đến việc sử dụng đĩa, tốc độ io và sao lưu. Bạn có thể muốn xem lại các bài đăng của Kimberly Tripp về các khóa chính và các chỉ mục được nhóm ở đây: http://www.sqlskills.com/BLOGS/KIMBERLY/post/The-Clustered-Index-Debate-again!.aspx

Tôi cũng sẽ đề nghị một khóa thay thế trong trường hợp này thay vì một khóa tự nhiên.


0

Nếu bạn có một bảng biểu thị mối quan hệ nhiều-nhiều chỉ có 2 cột thì có vẻ hợp lý.

Cf. câu hỏi SO này

Nhưng tôi thừa nhận rằng tôi đã thêm Khóa thay thế ngay cả trong những trường hợp đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.