26

Lợi thế của việc xác định khóa ngoài khi làm việc với khung MVC xử lý mối quan hệ là gì?lợi thế của việc xác định khóa ngoài là gì

Tôi đang sử dụng cơ sở dữ liệu quan hệ với khuôn khổ cho phép định nghĩa mô hình có quan hệ. Bởi vì các khóa ngoại được xác định thông qua các mô hình, có vẻ như các khóa ngoại là thừa. Khi nói đến việc quản lý cơ sở dữ liệu của một ứng dụng đang phát triển, việc chỉnh sửa/xóa các bảng đang sử dụng khóa ngoài là một rắc rối.

Có lợi thế nào khi sử dụng khóa ngoại mà tôi đang gửi bằng cách bỏ hoàn toàn việc sử dụng chúng?

+1

Các mối quan hệ khóa ngoài thực thi toàn vẹn dữ liệu ở một lớp dữ liệu do đó giảm dữ liệu xấu đi vào hệ thống; không thật sự lắm. Ví dụ: nếu bạn có bảng người có mối quan hệ FK với Bảng giới tính, nhà phát triển có thể chèn bản ghi vào người với giới tính là 'whocares'. Bây giờ, bạn có thể không quan tâm về điều này, nhưng nếu bạn xây dựng logic ra khỏi mục hợp lệ và chỉ mong đợi nam/nữ, sau đó tốt ... bạn sẽ có một vấn đề. Nếu bạn muốn đảo ngược kỹ sư DB để có được một ERD, thì bạn cũng có vấn đề. và giàn giáo và các công nghệ khác tiếp sức trên mức thiết kế này ... – xQbert

+1

Có liên quan cao: [Tại sao các khóa ngoại được sử dụng nhiều hơn trong lý thuyết hơn là trong thực tế?] (http://stackoverflow.com/questions/1876013/why-are-foreign –

+1

Chúng tôi có một kịch bản tương tự ở một nơi tôi từng làm việc: một ứng dụng không có khóa ngoài vì ORM đã xử lý tất cả các vấn đề như vậy, v.v ... Một ngày nọ khách hàng quan trọng đã phát hiện ra mất mát dữ liệu đáng kể mà cuối cùng đã được truy trở lại một lỗi trong ORM. Rất gây tổn hại cho mối quan hệ, đổ lỗi cho các nhà phát triển ORM không giúp đỡ. Chìa khóa nước ngoài đã được bổ sung rất sớm sau đó! – onedaywhen

Trả lời

31

Khóa ngoài có ràng buộc (trong một số công cụ DB) cung cấp cho bạn tính toàn vẹn dữ liệu ở mức thấp (mức cơ sở dữ liệu). Điều đó có nghĩa là bạn không thể tạo ra một bản ghi mà không hoàn thành mối quan hệ. Nó chỉ là một cách để an toàn hơn.

+3

Một ưu điểm khác là xếp DELETE. Ví dụ, giả sử bạn có bảng 'User' và bảng' Class'. Thay vì viết lại tất cả dữ liệu của Người dùng trong 'Lớp', bạn chỉ cần tham chiếu id của người dùng. Nhưng nếu người dùng đó bị xóa thì sao? Nếu bạn không bật tính năng xóa tầng, hàng trong bảng Lớp sẽ trỏ đến một Người dùng không tồn tại. Điều gì sẽ xảy ra nếu Id người dùng đó được thay thế bởi Người dùng hoàn toàn khác? Đó là khi mọi thứ trở nên tồi tệ. Cascading Delete sẽ xóa mọi bản ghi liên kết với người dùng đó. Điều này có vẻ không quan trọng, nhưng nếu 'Người dùng' được kết nối với nhiều bảng, điều này sẽ giúp ích rất nhiều. –

+0

Có bất kỳ chi phí nào cho chúng tôi không? – Ahmad

13

Nó cung cấp cho bạn tính toàn vẹn dữ liệu được thực thi ở cấp cơ sở dữ liệu. Điều này giúp bảo vệ chống lại lỗi có thể trong logic ứng dụng có thể gây ra dữ liệu không hợp lệ.

Nếu bất kỳ thao tác dữ liệu nào được thực hiện trực tiếp trong SQL bỏ qua logic ứng dụng của bạn, nó cũng bảo vệ chống lại dữ liệu xấu phá vỡ các ràng buộc đó.

Một lợi ích phụ khác là nó cho phép các công cụ tự động tạo sơ đồ cơ sở dữ liệu với các mối quan hệ được suy ra từ chính lược đồ đó. Bây giờ trong lý thuyết tất cả các sơ đồ nên được thực hiện trước khi cơ sở dữ liệu được tạo ra, nhưng khi cơ sở dữ liệu tiến hóa vượt ra ngoài hóa thân ban đầu của nó, các sơ đồ này thường không được cập nhật và khả năng tạo sơ đồ từ cơ sở dữ liệu hiện có hữu ích cho cả xem xét, cũng như giải thích cấu trúc cho các nhà phát triển mới tham gia dự án.

Có thể hữu ích khi vô hiệu hóa các FK trong khi cấu trúc cơ sở dữ liệu vẫn ở dạng thông lượng, nhưng chúng có khả năng bảo vệ tốt khi lược đồ được ổn định hơn.

11

Khóa ngoại đảm bảo một bản ghi phù hợp tồn tại trong bảng nước ngoài. Hãy tưởng tượng một bảng gọi là Books có một ràng buộc FK trên một bảng gọi là Authors. Mỗi cuốn sách được đảm bảo có một Author.

Bây giờ, bạn có thể làm một truy vấn như:

SELECT B.Title, A.Name FROM Books B 
INNER JOIN Authors A ON B.AuthorId = A.AuthorId; 

Nếu không có sự hạn chế FK, một thiếu Author hàng sẽ gây ra toàn bộ Book hàng để được giảm xuống, dẫn đến thiếu cuốn sách trong bộ dữ liệu của bạn.

Ngoài ra, với ràng buộc FK, cố gắng xóa tác giả được ít nhất một cuốn sách đề cập đến sẽ dẫn đến lỗi, thay vì làm hỏng cơ sở dữ liệu của bạn.

2

Lợi ích chính là tính toàn vẹn dữ liệu và xóa tầng. Bạn cũng có thể nhận được hiệu suất khi chúng được xác định và các trường đó được lập chỉ mục đúng cách. Ví dụ: bạn sẽ không thể tạo số điện thoại không thuộc về một liên hệ hoặc khi bạn xóa địa chỉ liên hệ, bạn có thể đặt số điện thoại đó để tự động xóa tất cả số điện thoại của họ. Có, bạn có thể tạo các kết nối đó trong giao diện người dùng hoặc tầng giữa của bạn, nhưng bạn vẫn sẽ kết thúc với trẻ mồ côi nếu ai đó chạy bản cập nhật trực tiếp đối với máy chủ bằng SQL thay vì giao diện người dùng của bạn. Phần "rắc rối" chỉ buộc bạn phải xem xét các kết nối đó trước khi bạn thực hiện thay đổi hàng loạt. FK đã cứu bacon của tôi nhiều lần.

5

Mặc dù chúng có thể là một nỗi đau khi thao tác dữ liệu phát triển/kiểm tra, chúng đã giúp tôi tiết kiệm rất nhiều rắc rối trong sản xuất.

Hãy coi chúng như một cách để duy trì tính toàn vẹn dữ liệu, đặc biệt là một biện pháp bảo vệ chống lại các hồ sơ mồ côi.

Ví dụ, nếu bạn đã có một cơ sở dữ liệu liên quan nhiều PhoneNumber hồ sơ để một Person, những gì xảy ra với PhoneNumber hồ sơ khi hồ sơ Person bị xóa vì lý do gì? Chúng sẽ vẫn tồn tại trong cơ sở dữ liệu, nhưng ID của số Person chúng có liên quan đến sẽ không còn tồn tại trong bảng Person liên quan và bạn có hồ sơ mồ côi.

Có, bạn có thể viết trình kích hoạt để xóa PhoneNumber bất cứ khi nào Person bị xóa, nhưng điều này có thể lộn xộn nếu bạn vô tình xóa Person và cần khôi phục.

Có, bạn có thể nhớ loại bỏ các bản ghi PhoneNumber theo cách thủ công, nhưng còn các nhà phát triển hoặc phương pháp khác bạn viết 9 tháng xuống dòng thì sao?

Bằng cách tạo khóa ngoài đảm bảo bất kỳ PhoneNumber nào có liên quan đến Person hiện tại, cả hai đều đảm bảo chống lại mối quan hệ này và cũng thêm 'đầu mối' vào cấu trúc dữ liệu dự định.

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