2011-01-19 50 views
17

Đây là điều khiến tôi khó hiểu. Tôi thường có các khóa chính kết hợp trong các bảng cơ sở dữ liệu. Mặt xấu của phương pháp đó là tôi có thêm nhiều công việc khi tôi xóa hoặc chỉnh sửa các mục nhập. Tuy nhiên, tôi cảm thấy rằng cách tiếp cận này là theo tinh thần của thiết kế cơ sở dữ liệu. Ở phía bên kia, có những người bạn của tôi, những người không bao giờ sử dụng các phím tổng hợp, mà là giới thiệu một cột 'id' khác trong một bảng và tất cả các khóa khác chỉ là FK. Họ có ít công việc hơn trong khi mã hóa các thủ tục xóa và chỉnh sửa. Tuy nhiên, tôi không biết cách chúng duy trì tính duy nhất của các mục nhập dữ liệu.Khóa chính kết hợp hay không?

Ví dụ:
Way 1

create table ProxUsingDept (
    fkProx int references Prox(ProxID) NOT NULL,  
    fkDept int references Department(DeptID) NOT NULL,  
    Value int,  
    PRIMARY KEY(fkProx,fkDept) 
) 

Way 2

create table ProxUsingDept (
     ID int NOT NULL IDENTITY PRIMARY KEY 
     fkProx int references Prox(ProxID) NOT NULL,  
     fkDept int references Department(DeptID) NOT NULL,  
     Value int 
) 

Mà cách nào tốt hơn? Các mặt xấu của việc sử dụng phương pháp thứ 2 là gì? Bất kỳ đề xuất?

+0

Khám phá http://stackoverflow.com/questions/159087/composite-primary-keys-versus-unique-object-id-field – TechTravelThink

Trả lời

23

Cá nhân tôi thích cách tiếp cận thứ 2 của bạn (và sẽ sử dụng gần như 100% thời gian) - giới thiệu trường thay thế ID.

Tại sao?

  • làm cho cuộc sống dễ dàng hơn rất nhiều đối với bất kỳ bảng tham khảo bảng của bạn - JOIN điều kiện đơn giản hơn nhiều chỉ với một cột duy nhất ID (chứ không phải 2, 3, hoặc thậm chí nhiều cột mà bạn cần phải tham gia vào , tất cả các thời gian)

  • làm cho cuộc sống dễ dàng hơn rất nhiều kể từ bất kỳ bảng tham khảo bảng của bạn chỉ cần thực hiện một single ID như lĩnh vực trọng điểm nước ngoài - không nhiều cột từ hợp chất của bạn chính

  • làm cho cuộc sống dễ dàng hơn nhiều kể từ khi cơ sở dữ liệu ca n xử lý việc tạo ra các ID cột độc đáo (sử dụng INT IDENTITY)

Tuy nhiên, tôi không biết làm thế nào họ giữ gìn độc đáo của các mục dữ liệu.

Rất đơn giản: đặt INDI UNIQUE trên các cột phức hợp mà bạn sẽ sử dụng làm khóa chính của mình!

CREATE UNIQUE INDEX UIX_WhateverNameYouWant 
    ON dbo.ProxUsingDept(fkProx, fkDept) 

Bây giờ, bảng của bạn đảm bảo sẽ không bao giờ là cặp trùng lặp (fkProx, fkDept) trong bảng của bạn - giải quyết được vấn đề!

+0

THANKS MAN !!! Tôi thậm chí không biết UNIQUE INDEX. Cảm ơn một lần nữa! – sandalone

+3

@askmo. Vì vậy, hãy để tôi có được quyền này. Bạn sẽ thêm (a) một cột autoincrement (b) và chỉ số bổ sung, vì mã hóa đơn giản hơn? Không có mối quan ngại về yêu cầu hoàn chỉnh phi hoặc không kinh doanh? Không có mối quan tâm nào về hiệu suất tiêu cực? Các navigaton bị mất (xem câu trả lời của Larry)? – PerformanceDBA

+4

@marc_s. Đây là những gì xảy ra khi bạn để cho những người quan tâm đến những sở thích và không thích cá nhân của họ; dễ dàng mã hóa, thiết kế "cơ sở dữ liệu". Thay vì các nhà thiết kế cơ sở dữ liệu chuyên nghiệp, những người quan tâm đến việc sử dụng tổng thể, hiệu suất, các tiêu chuẩn, Quyền lực quan hệ. Ngành công nghiệp đang ở trong trạng thái rất buồn. – PerformanceDBA

0

Có các trường hợp như M: N nối các bảng trong đó các phím tổng hợp có ý nghĩa nhất (và nếu bản chất hoặc liên kết M: N thay đổi, bạn sẽ phải làm lại bảng này).

+0

Thực ra tôi nghĩ rằng bạn có ý nghĩa về M: M tham gia nơi các phím tổng hợp có ý nghĩa nhất, nhưng thực hành tốt hơn là giới thiệu khóa nhân tạo (thay thế). Việc quản lý phát triển ứng dụng dễ dàng hơn. – sbrbot

16

Bạn hỏi các câu hỏi sau:

Tuy nhiên, tôi không biết làm thế nào họ giữ gìn độc đáo của các mục dữ liệu.

Tính duy nhất có thể được giữ nguyên bằng cách khai báo một chỉ mục UNIQUE tổng hợp riêng biệt trên các cột có thể tạo thành khóa chính tự nhiên.

Cách nào tốt hơn?

Những người khác nhau có ý kiến ​​khác nhau, đôi khi được tổ chức mạnh mẽ. Tôi nghĩ rằng bạn sẽ thấy rằng nhiều người sử dụng các phím số nguyên thay thế (không phải là điều đó làm cho nó là "đúng" giải pháp).

Mặt xấu nào khi sử dụng phương pháp tiếp cận thứ hai là ?

Dưới đây là một số trong những nhược điểm để sử dụng một phím thay thế:

  1. Bạn đòi hỏi một chỉ số bổ sung để duy trì độc đáo-Ness của khóa chính tự nhiên. Bạn có thể yêu cầu thêm JOIN khi chọn dữ liệu để có được kết quả mong muốn (điều này xảy ra khi bạn có thể đáp ứng các yêu cầu của truy vấn chỉ sử dụng các cột trong khóa tự nhiên tổng hợp; trong trường hợp này bạn có thể sử dụng ngoại kiều này). các cột chính thay vì THAM GIA trở lại bảng gốc).

+1

Câu trả lời hay. Luôn luôn, không phải đôi khi. (2) có thể cần giải thích cho một số độc giả và tất cả những người phản hồi. Great-granchild để cha mẹ bị mất; ID yêu cầu phải tham gia cháu của cháu từ con cháu sang cha mẹ. – PerformanceDBA

+1

+1 cho đối số thứ hai của bạn về việc sử dụng khóa thay thế. (không phải là tôi chống lại các khóa thay thế - chỉ là đối diện thực sự) –

+0

Nói công bằng hơn tôi có thể có. Khái niệm về DB của bạn như một pháo đài dường như bị mất trong các khung công tác mới. Các khóa đơn giản, thay thế giúp ORM dễ thiết lập hơn.Nhưng các phím tổng hợp và đặc biệt là các khóa tự nhiên tổng hợp giúp phân tích dữ liệu dễ dàng hơn và gọn gàng hơn. Với công việc tôi làm, làm việc với một cột ID trên mỗi bảng là mega-tẻ nhạt. Ứng dụng sẽ đến và đi nhưng dữ liệu vẫn ở lại và có giá trị cao nhất. Các phím đơn giản so với các phím tổng hợp và các khóa thay thế so với các khóa tự nhiên là các đối số sẽ không bao giờ được giải quyết. Đọc "Enterprise Rails" của Dan Chak. Một số có được nó, một số không, những người khác bỏ qua nó. – juanitogan

-2

Tôi biết đã rất lâu kể từ khi bài đăng này được tạo. Nhưng tôi phải đi qua một tình huống tương tự liên quan đến khóa tổng hợp để tôi đăng những suy nghĩ của mình.

Giả sử chúng ta có hai bảng T1 và T2.

T1 có các cột C1 và C2.

T2 có các cột C1, C2 và C3

C1 và C2 là chìa khóa composite tiểu học cho T1 bảng và các phím nước ngoài để T2 bảng. Giả sử chúng tôi đã sử dụng khóa thay thế cho Bảng T1 (T1_ID) và được sử dụng như Khóa ngoài trong bảng T2, nếu các giá trị C1 và C2 của bảng T1 thay đổi, đó là công việc bổ sung để thực thi tham chiếu ràng buộc về tính chính xác trên bảng T2 khi chúng ta chỉ tìm kiếm khóa thay thế từ Bảng T1 có giá trị không thay đổi trong Bảng T1. Đây có thể là một vấn đề với cách tiếp cận thứ hai.

+4

Trong cơ sở dữ liệu chuẩn hóa T2 sẽ không ' t chứa C1 và C2 vì vậy tôi sợ tôi không nghĩ rằng đây là một đối số hợp lệ. – Caltor

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