Các khóa ngoại có thực sự cần thiết trong thiết kế cơ sở dữ liệu không?


109

Theo như tôi biết, các khóa ngoại (FK) được sử dụng để hỗ trợ lập trình viên thao tác dữ liệu theo cách chính xác. Giả sử một lập trình viên đã thực sự làm điều này theo đúng cách, thì liệu chúng ta có thực sự cần khái niệm về khóa ngoại không?

Có bất kỳ cách sử dụng nào khác cho khóa ngoại không? Am i thiếu cái gì ở đây?


2
Điều này xuất hiện thường xuyên xung quanh đây. Tôi đổ lỗi cho Joel Spolsky :-). Có rất nhiều câu trả lời hay ở đây; thay vì nhập lại của tôi, tôi sẽ chỉ cung cấp cho bạn một liên kết: stackoverflow.com/questions/83147/whats-wrong-with-foreign-keys
SquareCog

70
"Giả sử một lập trình viên thực sự đang làm điều này theo đúng cách đã" - Tôi thậm chí không thể tưởng tượng ra một viễn cảnh như vậy.
đệ quy

11
"Khóa ngoại" là một ý tưởng, không phải là một công nghệ. Đó là một quy tắc quan hệ. Câu hỏi của bạn thực sự là liệu bạn có nên cố gắng thực thi quy tắc trong mã của mình hay để cơ sở dữ liệu giúp bạn. Khi có liên quan đến đồng thời, tốt nhất nên để công cụ cơ sở dữ liệu thực thi quy tắc, vì nó nhận biết được MỌI THỨ xảy ra trong cơ sở dữ liệu, trong khi mã của bạn không thể nhận biết được.
Triynko

5
@lubos & cdeszaq. Trên thực tế, nó LÀ một quy tắc quan hệ ... nó là một tập hợp con của quy tắc 10 của "Twleve Commandments" của Codd ... "Integrity Independence", về cơ bản nói rằng tính toàn vẹn quan hệ của RDBMS phải được duy trì độc lập với bất kỳ ứng dụng nào truy cập nó, chính xác là những gì tôi đã giải thích một cách dễ hiểu. Quy tắc này được thực hiện bởi, trong số những thứ khác, các ràng buộc khóa ngoại. Vì vậy, có, ý tưởng về khóa ngoại là quy tắc quan hệ "một".
Triynko

1
@lubos: Để làm rõ, bạn đang nói về việc liệu bạn có sử dụng một tính năng cụ thể hay không, nhưng tôi đang nói về việc liệu sự hiện diện của tính năng đó có cần thiết để có một RDBMS hoàn chỉnh, đầy đủ chức năng hay không. Các ràng buộc tham chiếu, nếu và khi bạn chọn sử dụng chúng, là thứ cần được thực thi trong RDBMS (chứ không phải ứng dụng), vì vậy đó là một tính năng nên có ở đó và theo nghĩa đó, nó là một yêu cầu của mô hình quan hệ nếu bạn sẽ phát triển một RDBMS hoàn chỉnh.
Triynko

Câu trả lời:


102

Khóa ngoại giúp thực thi tính toàn vẹn tham chiếu ở cấp dữ liệu. Chúng cũng cải thiện hiệu suất vì chúng thường được lập chỉ mục theo mặc định.


52
Nếu bạn cần tạo một chỉ mục, thì đây không phải là lý do chính cho FK. (Trên thực tế, trong một số trường hợp nhất định (Ví dụ: nhiều chèn hơn là chọn) việc duy trì FK có thể chậm hơn.)
Robert

7
Đó là một câu trả lời khủng khiếp FKs genaerally có thể thêm chi phí bổ sung không cải thiện hiệu suất.
Agile Jedi

Trong SQL-Server, chúng không được lập chỉ mục theo mặc định trên trọng tài hoặc liên kết giới thiệu. sqlskills.com/blogs/kimberly/…
user420667

1
Cũng không phải trong Oracle; bạn phải tự tạo chỉ mục (trên các cột FK).
Littlefoot

58

Các khóa ngoại cũng có thể giúp lập trình viên viết ít mã hơn bằng cách sử dụng những thứ như ON DELETE CASCADE. Điều này có nghĩa là nếu bạn có một bảng chứa người dùng và một bảng khác chứa đơn đặt hàng hoặc thứ gì đó, thì việc xóa người dùng có thể tự động xóa tất cả các đơn hàng trỏ đến người dùng đó.


3
@Greg Hewgill Điều này có thể dẫn đến rất nhiều vấn đề. Bạn nên hết sức cẩn thận với những suy nghĩ như XÓA CASCADE, vì trong nhiều trường hợp, bạn muốn giữ lại các lệnh do người dùng tạo khi xóa người dùng.
Kibbee 20/08/2016

8
Mặc dù điều này có lẽ nên được xử lý trong lớp logic nghiệp vụ. Quyết định có hay không lưu giữ các bản ghi con liên quan, không hoàn toàn giống với việc đảm bảo rằng không có giá trị nào vi phạm các mối quan hệ khóa ngoại.
Codewerks

5
Vấn đề khác là kiểm toán, nếu kiểm tra không được thực hiện ở cấp db, việc cập nhật hoặc xóa theo tầng sẽ làm mất hiệu lực của quá trình kiểm tra của bạn.
si618

@Codewerks: Logic nghiệp vụ có thể nằm trong DB.
Fantius

44

Tôi không thể tưởng tượng việc thiết kế một cơ sở dữ liệu mà không có khóa ngoại. Nếu không có chúng, cuối cùng bạn nhất định mắc lỗi và làm hỏng tính toàn vẹn của dữ liệu.

Chúng không bắt buộc , nói đúng ra, nhưng lợi ích là rất lớn.

Tôi khá chắc chắn rằng FogBugz không có các ràng buộc khóa ngoại trong cơ sở dữ liệu. Tôi rất muốn nghe cách nhóm Fog Creek Software cấu trúc mã của họ để đảm bảo rằng họ sẽ không bao giờ đưa ra sự mâu thuẫn.


43
Joel: "Cho đến nay chúng tôi chưa bao giờ gặp sự cố." Cho đến nay, tôi chưa bao giờ lái xe vào cột đèn. Nhưng tôi vẫn nghĩ rằng nên thắt dây an toàn ;-)
Tony Andrews

2
Có thể bạn không bao giờ đã thấy được vấn đề, nhưng có thể nó ở đó ... Phần lớn các cơ sở dữ liệu sử dụng một quy ước như id_xxx đó là giống hệt nhau mà ixXXX
FerranB

1
@Joel: Quy ước đặt tên thay cho việc thực thi các quy tắc? Cũng có thể loại bỏ loại trong khi bạn đang ở đó.
jcollum 17/09/09

8
@Eric: Bạn đang coi Fog Creek như một hình đại diện của phát triển phần mềm ở đây. Nếu bạn nói "Một công ty ở Thành phố New York không có khóa ngoại trong db của họ ..." tất cả chúng ta sẽ nói "Và?"
jcollum 17/09/09

3
Eric: FogBugz sử dụng quy ước đặt tên cho các khóa ngoại. Ví dụ ixBug được hiểu là chỉ mục vào khóa chính của Bug bảng. Cho đến nay chúng tôi chưa bao giờ gặp sự cố. - Joel Spolsky
Sam Saffron

40

Một lược đồ cơ sở dữ liệu không có ràng buộc FK giống như lái xe mà không có dây an toàn.

Một ngày nào đó, bạn sẽ hối hận. Không dành thêm ít thời gian cho các nguyên tắc cơ bản về thiết kế và tính toàn vẹn của dữ liệu là một cách chắc chắn để đảm bảo các vấn đề đau đầu sau này.

Bạn có chấp nhận đoạn mã cẩu thả đó trong ứng dụng của mình không? Điều đó đã truy cập trực tiếp vào các đối tượng thành viên và trực tiếp sửa đổi cấu trúc dữ liệu.

Tại sao bạn nghĩ rằng điều này đã được thực hiện khó khăn và thậm chí không thể chấp nhận được trong các ngôn ngữ hiện đại?


2
+1 cho sự tương đồng tốt giữa các mối quan hệ đóng gói và FK / PK.
jcollum 17/09/09

21

Đúng.

  1. Họ giữ cho bạn trung thực
  2. Họ giữ cho các nhà phát triển mới trung thực
  3. Bạn có thể làm ON DELETE CASCADE
  4. Chúng giúp bạn tạo ra các sơ đồ đẹp tự giải thích các liên kết giữa các bảng

1
trung thực nghĩa là gì?
dspacejs

Thành thật với quan niệm mà tôi đoán. Nó ngăn bạn gian lận dữ liệu bằng cách lập trình nhanh chóng và khập khiễng.
Oreste Viron

13

Giả sử một lập trình viên thực sự đang làm điều này theo đúng cách đã

Đưa ra một giả định như vậy đối với tôi dường như là một ý tưởng cực kỳ tồi; nói chung, phần mềm thường gặp nhiều lỗi.

Và đó thực sự là vấn đề. Các nhà phát triển không thể làm đúng mọi thứ, vì vậy việc đảm bảo cơ sở dữ liệu không thể chứa đầy dữ liệu xấu là Điều tốt.

Mặc dù trong một thế giới lý tưởng, các phép nối tự nhiên sẽ sử dụng các mối quan hệ (tức là các ràng buộc FK) hơn là khớp với các tên cột. Điều này sẽ làm cho FKs thậm chí còn hữu ích hơn.


2
Điểm tốt, sẽ rất tuyệt nếu bạn nối hai bảng với "BẬT [Mối quan hệ]" hoặc một số từ khóa khác và để db tìm ra những cột nào có liên quan. Có vẻ khá hợp lý thực sự.
jcollum 17/09/09

13

Cá nhân tôi ủng hộ các khóa ngoại vì nó chính thức hóa mối quan hệ giữa các bảng. Tôi nhận thấy rằng câu hỏi của bạn giả định rằng lập trình viên không giới thiệu dữ liệu sẽ vi phạm tính toàn vẹn tham chiếu, nhưng tôi đã thấy quá nhiều trường hợp vi phạm tính toàn vẹn tham chiếu của dữ liệu, mặc dù có ý định tốt nhất!

Các ràng buộc trước khóa ngoại (hay còn gọi là tính toàn vẹn tham chiếu khai báo hoặc DRI) đã dành rất nhiều thời gian để thực hiện các mối quan hệ này bằng cách sử dụng trình kích hoạt. Thực tế là chúng ta có thể chính thức hóa mối quan hệ bằng một ràng buộc khai báo là rất mạnh mẽ.

@John - Các cơ sở dữ liệu khác có thể tự động tạo chỉ mục cho khóa ngoại, nhưng SQL Server thì không. Trong SQL Server, các mối quan hệ khóa ngoại chỉ là các ràng buộc. Bạn phải xác định chỉ mục của mình trên các khóa ngoại một cách riêng biệt (điều này có thể có lợi.)

Chỉnh sửa: Tôi muốn nói thêm rằng, IMO, việc sử dụng các khóa ngoại để hỗ trợ BẬT XÓA hoặc BẬT CẬP NHẬT CASCADE không nhất thiết là một điều tốt. Trong thực tế, tôi nhận thấy rằng việc phân tầng khi xóa cần được xem xét cẩn thận dựa trên mối quan hệ của dữ liệu - ví dụ: bạn có cha-con tự nhiên ở đó điều này có thể OK hay bảng liên quan là một tập hợp các giá trị tra cứu. Sử dụng cập nhật theo tầng có nghĩa là bạn đang cho phép sửa đổi khóa chính của một bảng. Trong trường hợp đó, tôi có một bất đồng triết học chung là khóa chính của một bảng không được thay đổi. Các phím phải không đổi.


9

Nếu không có khóa ngoại thì làm cách nào để biết rằng hai bản ghi trong các bảng khác nhau có liên quan với nhau?

Tôi nghĩ những gì bạn đang đề cập đến là tính toàn vẹn tham chiếu, trong đó bản ghi con không được phép tạo mà không có bản ghi mẹ hiện có, v.v. Chúng thường được gọi là ràng buộc khóa ngoại - nhưng đừng nhầm lẫn với sự tồn tại của khóa ngoại trong nơi đầu tiên.


8

Có lợi ích gì khi không có khóa ngoại không? Trừ khi bạn đang sử dụng một cơ sở dữ liệu tồi tệ, còn không thì FK không khó để thiết lập. Vậy tại sao bạn lại có chính sách tránh chúng? Có một quy ước đặt tên nói rằng một cột tham chiếu đến cột khác, điều khác là biết cơ sở dữ liệu đang thực sự xác minh mối quan hệ đó cho bạn.


8

Tôi cho rằng bạn đang nói về các ràng buộc khóa ngoại được thực thi bởi cơ sở dữ liệu . Có thể bạn đã sử dụng khóa ngoại, chỉ là bạn chưa nói với cơ sở dữ liệu về nó.

Giả sử một lập trình viên đã thực sự làm điều này theo đúng cách, thì liệu chúng ta có thực sự cần khái niệm về khóa ngoại không?

Về mặt lý thuyết, không. Tuy nhiên, chưa bao giờ có một phần mềm nào không có lỗi.

Các lỗi trong mã ứng dụng thường không nguy hiểm - bạn xác định lỗi và sửa nó, sau đó ứng dụng chạy mượt mà trở lại. Nhưng nếu một lỗi cho phép dữ liệu bị gián đoạn xâm nhập vào cơ sở dữ liệu, thì bạn đang mắc kẹt với nó! Rất khó để khôi phục dữ liệu bị hỏng trong cơ sở dữ liệu.

Xem xét liệu một lỗi nhỏ trong FogBugz có cho phép ghi khóa ngoại bị hỏng trong cơ sở dữ liệu hay không. Có thể dễ dàng sửa lỗi và nhanh chóng đưa bản sửa lỗi cho khách hàng trong bản phát hành sửa lỗi. Tuy nhiên, làm thế nào để sửa dữ liệu bị hỏng trong hàng chục cơ sở dữ liệu? Mã đúng bây giờ có thể đột nhiên bị hỏng vì các giả định về tính toàn vẹn của khóa ngoại không còn giữ nữa.

Trong các ứng dụng web, bạn thường chỉ có một chương trình nói chuyện với cơ sở dữ liệu, vì vậy chỉ có một nơi mà lỗi có thể làm hỏng dữ liệu. Trong một ứng dụng doanh nghiệp có thể có một số ứng dụng độc lập nói chuyện với cùng một cơ sở dữ liệu (chưa kể những người làm việc trực tiếp với vỏ cơ sở dữ liệu). Không có cách nào để chắc chắn rằng tất cả các ứng dụng tuân theo cùng một giả định mà không có lỗi, luôn luôn và mãi mãi.

Nếu các ràng buộc được mã hóa trong cơ sở dữ liệu, thì điều tồi tệ nhất có thể xảy ra với lỗi là người dùng được hiển thị một thông báo lỗi xấu xí về một số ràng buộc SQL không được thỏa mãn. Điều này rất có lợi khi để dữ liệu bị gián đoạn vào cơ sở dữ liệu doanh nghiệp của bạn, nơi nó sẽ phá vỡ tất cả các ứng dụng của bạn hoặc chỉ dẫn đến tất cả các loại đầu ra sai hoặc sai lệch.

Ồ, và các ràng buộc khóa ngoại cũng cải thiện hiệu suất vì chúng được lập chỉ mục theo mặc định. Tôi không thể nghĩ ra bất kỳ lý do gì để không sử dụng các ràng buộc khóa ngoại.


7

FK rất quan trọng và phải luôn tồn tại trong lược đồ của bạn, trừ khi bạn là eBay .


2
liên kết đó thực sự cực kỳ hấp dẫn ... tôi thực sự muốn biết thêm chi tiết và tôi hơi sợ khi sử dụng ebay bây giờ. cho người khác: nhấp vào câu hỏi thứ 4 để xem anh ta nói gì về cấu trúc db của họ. Tuy nhiên, toàn bộ cuộc phỏng vấn rất đáng xem. cũng ...unibrow
ảm đạm.penguin

6

Tôi nghĩ rằng một số điều đơn lẻ tại một số thời điểm phải có trách nhiệm đảm bảo các mối quan hệ hợp lệ.

Ví dụ, Ruby on Rails không sử dụng khóa ngoại, nhưng nó tự xác nhận tất cả các mối quan hệ. Nếu bạn chỉ truy cập cơ sở dữ liệu của mình từ ứng dụng Ruby on Rails đó, thì điều này là tốt.

Tuy nhiên, nếu bạn có các ứng dụng khách khác đang ghi vào cơ sở dữ liệu, thì nếu không có khóa ngoại, họ cần thực hiện xác thực riêng của mình. Sau đó, bạn có hai bản sao của mã xác thực có nhiều khả năng khác nhau, mà bất kỳ lập trình viên nào cũng có thể nhận ra đó là lỗi chính.

Tại thời điểm đó, các khóa ngoại thực sự là cần thiết, vì chúng cho phép bạn chuyển trách nhiệm về một điểm duy nhất một lần nữa.


2
Nó giống như một củ hành tây. FK là lớp phòng thủ cuối cùng. Trừ khi đó là một cơ sở dữ liệu cục bộ được nhúng, các ứng dụng cố gắng thực hiện tính toàn vẹn của tham chiếu luôn là một ý tưởng tồi.
Fabricio Araujo

5

Các khóa ngoại cho phép ai đó chưa từng xem cơ sở dữ liệu của bạn trước đây xác định mối quan hệ giữa các bảng.

Mọi thứ có thể ổn bây giờ, nhưng hãy nghĩ điều gì sẽ xảy ra khi lập trình viên của bạn rời đi và người khác phải tiếp quản.

Các khóa ngoại sẽ cho phép họ hiểu cấu trúc cơ sở dữ liệu mà không cần tra cứu hàng nghìn dòng mã.


5

Theo như tôi biết, các khóa ngoại được sử dụng để hỗ trợ lập trình viên thao tác dữ liệu theo cách chính xác.

FK cho phép DBA bảo vệ tính toàn vẹn của dữ liệu khỏi sự lóng ngóng của người dùng khi lập trình viên không làm như vậy, và đôi khi để bảo vệ khỏi sự lóng ngóng của người lập trình.

Giả sử một lập trình viên đã thực sự làm điều này theo đúng cách, thì liệu chúng ta có thực sự cần khái niệm về khóa ngoại không?

Các lập trình viên rất bình thường và dễ sai lầm. FK mang tính chất khai báo khiến chúng khó bắt vít hơn.

Có bất kỳ cách sử dụng nào khác cho khóa ngoại không? Am i thiếu cái gì ở đây?

Mặc dù đây không phải là lý do tại sao chúng được tạo ra, FK cung cấp gợi ý đáng tin cậy mạnh mẽ cho các công cụ lập sơ đồ và để truy vấn các nhà xây dựng. Điều này được chuyển cho người dùng cuối, những người rất cần những gợi ý mạnh mẽ đáng tin cậy.


Đây là một câu trả lời tuyệt vời.
Dan Lugg

4

Chúng không hoàn toàn cần thiết, theo cách mà dây an toàn không hoàn toàn cần thiết. Nhưng chúng thực sự có thể giúp bạn tránh làm điều gì đó ngu ngốc làm rối tung cơ sở dữ liệu của bạn.

Việc gỡ lỗi ràng buộc FK sẽ tốt hơn nhiều so với việc phải tạo lại một lần xóa đã phá vỡ ứng dụng của bạn.


4

Chúng rất quan trọng, vì ứng dụng của bạn không phải là cách duy nhất dữ liệu có thể được thao tác trong cơ sở dữ liệu. Ứng dụng của bạn có thể xử lý tính toàn vẹn tham chiếu một cách trung thực như nó muốn, nhưng tất cả những gì nó cần là một bozo với các đặc quyền phù hợp đi kèm và đưa ra lệnh chèn, xóa hoặc cập nhật ở cấp cơ sở dữ liệu và tất cả việc thực thi toàn vẹn tham chiếu ứng dụng của bạn bị bỏ qua. Đưa các ràng buộc FK vào ở cấp cơ sở dữ liệu có nghĩa là, cấm bozo này chọn vô hiệu hóa ràng buộc FK trước khi ban hành lệnh của chúng, ràng buộc FK sẽ khiến câu lệnh chèn / cập nhật / xóa không thành công với vi phạm toàn vẹn tham chiếu.


3

Tôi nghĩ về nó về mặt chi phí / lợi ích ... Trong MySQL , thêm một ràng buộc là một dòng bổ sung duy nhất của DDL . Đó chỉ là một số từ khóa và một vài giây suy nghĩ. Đó là "chi phí" duy nhất theo tôi ...

Các công cụ yêu thích khóa nước ngoài. Khóa ngoại ngăn dữ liệu xấu (nghĩa là các hàng không có) có thể không ảnh hưởng đến logic kinh doanh hoặc chức năng và do đó sẽ không được chú ý và tích lũy. Nó cũng ngăn các nhà phát triển không quen với lược đồ triển khai toàn bộ khối công việc mà không nhận ra rằng họ đang thiếu một mối quan hệ. Có lẽ mọi thứ đều tuyệt vời trong phạm vi ứng dụng hiện tại của bạn, nhưng nếu bạn bỏ lỡ điều gì đó và một ngày nào đó có điều gì đó không mong muốn được thêm vào (hãy nghĩ đến báo cáo thú vị), bạn có thể phải dọn dẹp thủ công dữ liệu xấu đã tích tụ từ khi mới thành lập của lược đồ mà không có kiểm tra thực thi cơ sở dữ liệu.

Thời gian ít ỏi cần thiết để hệ thống hóa những gì đã có trong đầu bạn khi bạn sắp xếp mọi thứ lại với nhau có thể giúp bạn hoặc người khác phải trải qua một loạt các tháng hoặc năm đau buồn trên đường.

Câu hỏi:

Có bất kỳ cách sử dụng nào khác cho khóa ngoại không? Am i thiếu cái gì ở đây?

Nó được tải một chút. Chèn chú thích, thụt lề hoặc đặt tên biến thay cho "khóa ngoại" ... Nếu bạn đã hiểu hoàn toàn điều được đề cập, thì điều đó "không có ích gì" đối với bạn.


2

Giảm entropy. Giảm khả năng xảy ra các kịch bản hỗn loạn trong cơ sở dữ liệu. Chúng tôi gặp khó khăn vì nó đang xem xét tất cả các khả năng có thể, vì vậy, theo tôi, giảm entropy là chìa khóa để duy trì bất kỳ hệ thống nào.

Ví dụ, khi chúng ta đưa ra một giả định: mỗi đơn hàng có một khách hàng thì giả định đó phải được thực thi bởi một thứ gì đó . Trong cơ sở dữ liệu mà "cái gì đó" là khóa ngoại.

Tôi nghĩ điều này đáng để đánh đổi tốc độ phát triển. Chắc chắn, bạn có thể viết mã nhanh hơn khi tắt chúng và đây có thể là lý do tại sao một số người không sử dụng chúng. Cá nhân tôi đã giết một số giờ với NHibernate và một số ràng buộc khóa ngoại khiến tôi tức giận khi thực hiện một số thao tác. TUY NHIÊN, tôi biết vấn đề là gì nên nó ít có vấn đề hơn. Tôi đang sử dụng các công cụ bình thường và có các tài nguyên để giúp tôi giải quyết vấn đề này, thậm chí có thể có người trợ giúp!

Giải pháp thay thế là cho phép một lỗi xâm nhập vào hệ thống (và có đủ thời gian, nó sẽ xảy ra) khi khóa ngoại không được đặt và dữ liệu của bạn trở nên không nhất quán. Sau đó, bạn nhận được một báo cáo lỗi bất thường, điều tra và "OH". Cơ sở dữ liệu bị hỏng. Bây giờ điều đó sẽ mất bao lâu để sửa chữa?


1

Bạn có thể xem khóa ngoại như một ràng buộc,

  • Giúp duy trì tính toàn vẹn của dữ liệu
  • Hiển thị cách dữ liệu có liên quan với nhau (có thể giúp thực thi logic và quy tắc nghiệp vụ)
  • Nếu được sử dụng đúng cách, có thể giúp tăng hiệu quả mà dữ liệu được tìm nạp từ các bảng.

1

Chúng tôi hiện không sử dụng khóa ngoại. Và phần lớn chúng tôi không hối tiếc.

Điều đó nói lên rằng - chúng tôi có thể sẽ bắt đầu sử dụng chúng nhiều hơn trong tương lai gần vì một số lý do, cả hai đều vì những lý do tương tự:

  1. Sơ đồ hóa. Sẽ dễ dàng hơn rất nhiều để tạo ra một sơ đồ của cơ sở dữ liệu nếu có các mối quan hệ khóa ngoại được sử dụng đúng cách.

  2. Hỗ trợ công cụ. Việc xây dựng các mô hình dữ liệu bằng Visual Studio 2008 có thể được sử dụng cho LINQ to SQL dễ dàng hơn rất nhiều nếu có mối quan hệ khóa ngoại thích hợp.

Vì vậy, tôi đoán quan điểm của tôi là chúng tôi nhận thấy rằng nếu chúng tôi đang thực hiện nhiều công việc SQL thủ công (tạo truy vấn, chạy truy vấn, blahblahblah) thì khóa ngoại không nhất thiết phải cần thiết. Tuy nhiên, khi bạn bắt đầu sử dụng các công cụ, chúng sẽ trở nên hữu ích hơn rất nhiều.


1
Tôi làm việc trên các hệ thống không sử dụng chúng. Và tôi hối hận về điều đó thường xuyên. Tôi đã thấy nhiều trường hợp hơn mà tôi có thể đếm được dữ liệu không hợp lý mà lẽ ra đã bị ngăn chặn bởi các ràng buộc thích hợp.
đệ quy

Và đã làm việc với các khóa ngoại trong dự án hiện tại của chúng tôi gần sáu tháng, tôi hoàn toàn đồng ý với nhận xét này.
John Christensen

1

Điều tốt nhất về các ràng buộc khóa ngoại (và các ràng buộc nói chung, thực sự) là bạn có thể dựa vào chúng khi viết các truy vấn của mình. Rất nhiều truy vấn có thể trở nên phức tạp hơn rất nhiều nếu bạn không thể dựa vào mô hình dữ liệu giữ "true".

Trong mã, chúng ta thường chỉ nhận được một ngoại lệ ở đâu đó - nhưng trong SQL , chúng ta thường chỉ nhận được câu trả lời "sai".

Về lý thuyết, SQL Server có thể sử dụng các ràng buộc như một phần của kế hoạch truy vấn - nhưng ngoại trừ các ràng buộc kiểm tra để phân vùng, tôi không thể nói rằng tôi đã từng thực sự chứng kiến ​​điều đó.


Các ràng buộc về tính duy nhất chỉ ra tính tổng số cao được sử dụng bởi trình tối ưu hóa trong việc lựa chọn một cơ chế nối.
Peter Wone

1

Khóa ngoại chưa bao giờ được khai báo rõ ràng (bảng (cột) TÀI LIỆU THAM KHẢO NGOẠI KHÓA) được khai báo trong các dự án (ứng dụng kinh doanh và trang web mạng xã hội) mà tôi đã làm việc.

Nhưng luôn có một loại quy ước đặt tên cho các cột là khóa ngoại.

Nó giống như với chuẩn hóa cơ sở dữ liệu - bạn phải biết mình đang làm gì và hậu quả của việc đó là gì (chủ yếu là hiệu suất).

Tôi biết các ưu điểm của khóa ngoại (tính toàn vẹn dữ liệu, chỉ mục cho cột khóa ngoại, các công cụ nhận biết về lược đồ cơ sở dữ liệu), nhưng tôi cũng sợ việc sử dụng khóa ngoại như quy tắc chung.

Ngoài ra, các công cụ cơ sở dữ liệu khác nhau có thể phục vụ khóa ngoại theo một cách khác, điều này có thể dẫn đến các lỗi nhỏ trong quá trình di chuyển.

Xóa tất cả các đơn đặt hàng và hóa đơn của khách hàng đã xóa bằng ON DELETE CASCADE là ví dụ hoàn hảo về lược đồ cơ sở dữ liệu đẹp, nhưng được thiết kế sai.


0

Đúng. BẬT XÓA [HẠN CHẾ | CASCADE] giúp các nhà phát triển không mắc kẹt dữ liệu, giữ cho dữ liệu luôn sạch sẽ. Gần đây tôi đã tham gia một nhóm các nhà phát triển Rails, những người không tập trung vào các ràng buộc cơ sở dữ liệu như khóa ngoại.

May mắn thay, tôi đã tìm thấy những thứ sau: http://www.redhillonrails.org/foreign_key_associations.html - Trình cắm thêm RedHill on Ruby on Rails tạo khóa ngoại bằng cách sử dụng quy ước về kiểu cấu hình . Việc di chuyển với product_id sẽ tạo ra một khóa ngoại cho id trong bảng sản phẩm .

Hãy xem các plugin tuyệt vời khác tại RedHill , bao gồm cả việc di chuyển trong giao dịch.


0

Nếu bạn có kế hoạch tạo mã truy cập dữ liệu của mình, tức là Entity Framework hoặc bất kỳ ORM nào khác, bạn hoàn toàn mất khả năng tạo mô hình phân cấp mà không có khóa ngoại

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.