2009-03-01 30 views
18

thể trùng lặp:
What’s wrong with foreign keys?Tôi có nên sử dụng khóa ngoài không?

tôi sử dụng MS SQL Server với một cơ sở dữ liệu lớn khoảng 4 GB dữ liệu.

Tôi tìm kiếm trên web lý do tại sao tôi nên sử dụng khóa ngoại. bây giờ tôi chỉ lập chỉ mục các phím được sử dụng để nối các bảng. Hiệu suất là tất cả tốt, dataintegrety là không có vấn đề.

Tôi có nên sử dụng khóa ngoại không? Tôi sẽ nhận được hiệu suất nhiều hơn với các phím nước ngoài?

Trả lời

5

Khóa ngoài chủ yếu là công cụ để thực thi tính toàn vẹn của cơ sở dữ liệu, không liên quan đến tốc độ thực thi.

Nếu bạn đã tối ưu hóa thiết kế chỉ mục của mình, thì có thể bạn đã cài đặt các chỉ mục này, ít nhất là các chỉ mục không phải duy nhất. Vì vậy, tôi sẽ không mong đợi bất kỳ thay đổi hiệu suất nào chỉ từ việc cài đặt các khóa ngoại (thậm chí không nhất thiết phải liên quan đến chỉ mục.)

Tôi rất nghi ngờ về sự tự tin của bạn về tối ưu hóa thiết kế của bạn bạn chưa có khái niệm này đóng đinh.

Đọc tài liệu dành cho Khóa ngoại có mục đích hiểu những gì họ thực hiện để thực thi tính toàn vẹn (điều đáng biết trong mọi trường hợp.) Sau đó, xem điều đó không trả lời câu hỏi của bạn hoàn toàn hơn.

+1

"không liên quan đến tốc độ thực hiện" là không hoàn toàn chính xác cho chèn (Tôi biết bạn biết nhưng Tuấn có thể không) – SquareCog

+0

Thx - Tôi điền câu trả lời một chút, trong một thời trang nên kết thúc cùng một vị trí. – dkretz

+0

lý lẽ tốt về chèn. tôi có cái nhìn tốt về cấu trúc. như tôi đã nói tích hợp là không có vấn đề. tôi cần tốc độ thô. –

13

Chìa khóa nước ngoài không thực sự cải thiện hiệu suất, trên thực tế chúng phải chịu một hình phạt hiệu suất nhỏ trên tất cả các hoạt động ghi, để đảm bảo rằng ràng buộc được tuân theo.

Lý do tại sao bạn muốn sử dụng chúng là để ngăn chặn các hoạt động ghi phá hoại. Nếu bạn không có chúng, mã lỗi hoặc câu lệnh sql xấu có thể xóa các hàng được mong đợi ở đó.

1

Phím ngoài đảm bảo tính toàn vẹn dữ liệu tốt hơn, hiệu suất, hơi chậm hơn khi xóa/chèn/cập nhật.
Trong công ty cuối cùng của chúng tôi, chúng tôi quyết định giữ nguyên toàn vẹn/kết nối trong BL, vì nó làm cho những thay đổi trong BL đơn giản hơn (nghĩ hàng trăm triệu bản ghi). Nếu bạn có một ứng dụng nhỏ, tôi không thấy lý do tại sao không làm điều đó trong lớp dữ liệu (db)

+0

BL hiện những gì đứng cho? – usefulBee

+1

Lớp doanh nghiệp, Lớp dữ liệu xử lý mã nói trực tiếp với db. BL lấy dữ liệu đó và triển khai các quy tắc nghiệp vụ bằng cách sử dụng dữ liệu đó và gửi nó đến giao diện người dùng. Đó là một cách hơi cũ để xem xét một phần mềm nhiều tầng. Hôm nay chúng tôi có hơn ba tầng/lớp và chúng tôi có hệ thống phân phối rộng rãi để bổ sung vào điều này. –

+0

Bằng cách nói, "chúng tôi quyết định giữ nguyên toàn vẹn/kết nối trong BL", bạn có đang đề cập đến phương pháp tiếp cận Mã đầu tiên hay không? – usefulBee

4

Điều gì đã không được đề cập trong câu hỏi cũ hơn mà SquareCog liên kết trước đó - có, các ràng buộc khóa ngoại có thể là một nỗi đau khi làm sạch dữ liệu, cập nhật hàng loạt, tạo dữ liệu thử nghiệm hoặc bất kỳ loại hoạt động nào mà bạn bỏ qua chuỗi thứ bình thường. Nhưng - bạn luôn có thể bỏ các ràng buộc khóa ngoài trước khi thực hiện một việc như thế này, và sau đó tạo lại chúng sau này (nếu bạn có các đối tượng cơ sở dữ liệu của bạn được viết đúng cách, điều này hầu như không làm việc thêm).

Tôi từng là người lười biếng, nhưng đã đến xung quanh tùy thuộc vào các ràng buộc chính của nước ngoài. Vẫn còn những tình huống mà bạn không thể có chúng - như trong các mối quan hệ xuyên cơ sở dữ liệu.

3

Có một tính năng/ràng buộc mà Khóa ngoại mang lại cho hệ thống của bạn mà hiện chưa được đề cập đến. Đó là cam kết/giao dịch logic (đó là những gì tôi gọi nó anyway). Với Foreign Keys được kích hoạt, tất cả các hàng cho một bản cập nhật, trong tất cả các bảng bị ảnh hưởng cần phải có cho cam kết làm việc (không ném một lỗi SQL mà các ràng buộc khóa ngoại đã bị vi phạm).

Nếu bạn có nội dung mã, hoạt động và "phát nhanh và lỏng", với các giao dịch/giao dịch. Sau đó, bạn có thể ở trong một số biện pháp khắc phục, để có được những thứ làm việc với FK trong lược đồ.

Ngoài ra, ít nhất Oracle cũng cho phép bạn vô hiệu hóa các ràng buộc (không chỉ thả/xóa). Vì vậy, bạn có thể bật/tắt chúng dễ dàng. Tiện dụng, khi bạn muốn thực hiện một số hoạt động hàng loạt, hoặc bằng cách vượt qua các ràng buộc, hoặc thực hiện một số "phẫu thuật" trên dữ liệu có trạng thái trung gian sẽ thất bại trong các ràng buộc.

+0

Cả hai đều được đề cập trong liên kết tôi đã đăng, nhưng Tôi sẽ bầu cho bạn. "Cam kết giao dịch/giao dịch" được chính thức gọi là bảo đảm ACID ("C" là nhất quán, như trong, sau khi một giao dịch kết thúc dữ liệu phù hợp với các ràng buộc đã khai báo). – SquareCog

1

Khóa ngoài cũng giúp giữ cho cơ sở dữ liệu của bạn luôn sạch sẽ, vì bạn có thể có cơ sở dữ liệu thực hiện thả xuống tầng.

9

Tính toàn vẹn có thể không phải là vấn đề ngày nay, nhưng đó là thái độ chính xác khiến nó trở thành vấn đề vào ngày mai hoặc hai tuần kể từ bây giờ.

4

Trong MySQL bạn có thể vô hiệu hóa chính của nước ngoài với SET FOREIGN_KEY_CHECKS=0

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