2011-10-19 32 views
8

Nó không phải là một câu hỏi cụ thể, tự hỏi chung hơn.Dilemma: Cascade delete hoặc Join delete

Khi bạn phải thực hiện xóa trên nhiều bảng trong mối quan hệ 1: M, tốt hơn là thực hiện ràng buộc FK với xóa tầng hoặc nối các bảng trong câu lệnh xóa.

Tôi đã có một dự án cũ có báo cáo xóa riêng biệt cho các bảng có liên quan và một vài lần một số báo cáo không được thực hiện và toàn vẹn dữ liệu bị xâm phạm. Tôi đã phải đưa ra quyết định giữa hai người, vì vậy tôi đã suy nghĩ một chút những gì sẽ là một giải pháp tốt hơn.

Ngoài ra còn có tùy chọn để thực hiện quy trình được lưu trữ hoặc giao dịch.

Vì vậy, tôi đang tìm ý kiến ​​hay lời khuyên ...?

Trả lời

4

Nếu cơ sở dữ liệu của bạn có RI được xác định phù hợp cho nó thì không nên có bất kỳ trường hợp nào về tính toàn vẹn dữ liệu bị xâm phạm. Tất cả các bảng có liên quan của bạn nên có RI báo cáo, có nghĩa là bạn không thể xóa cha mẹ trong khi vẫn có con.

Ngoài ra, nếu bạn có mã chỉ xóa một số hàng vào thời điểm đó thì mã hóa kém và thử nghiệm kém. Những loại hành động này phải là một giao dịch duy nhất. Đề xuất của bạn về việc sử dụng một thủ tục được lưu trữ là một cách tiếp cận tuyệt vời để giải quyết vấn đề đó và khá chuẩn.

Như đã được đề cập, trình kích hoạt tầng có nguy cơ xóa các hàng mà ai đó không định xóa. Hãy xem xét rằng đôi khi mọi người có thể truy cập dữ liệu của bạn từ một nơi nào đó bên ngoài ứng dụng của bạn, đặc biệt là khi khắc phục sự cố dữ liệu. Khi ai đó vô tình cố xóa nhầm cha mẹ và bị lỗi RI thì tốt. Khi họ vô tình cố gắng xóa cha mẹ sai và nó không chỉ xóa cha mẹ mà còn 20 trẻ em trong 5 bảng khác, đó là xấu.

Ngoài ra, các lần xóa tầng được ẩn đi. Nếu một nhà phát triển đang mã hóa một xóa cho cha mẹ thì họ nên biết rằng họ phải sử dụng các thủ tục xóa được lưu trữ để chăm sóc trẻ em.Có nhiều nhà phát triển không mã chống lại điều đó, gặp lỗi và sửa mã của anh ấy (hoặc nhận ra rằng anh ấy không thực sự muốn xóa tất cả) hơn là để nhà phát triển ném và xóa không ai nhận ra rằng nó giết chết trẻ em cho đến khi mã đã đi vào hoạt động.

IMO, tôi muốn các nhà phát triển của mình am hiểu về ứng dụng hơn là giúp họ dễ dàng không biết gì về nó.

7

Tôi muốn nói rằng an toàn hơn để sử dụng xóa tầng. Nếu bạn quyết định sử dụng kết nối, bạn phải nhớ sử dụng chúng mỗi khi bạn xóa bất cứ thứ gì từ bảng cha; và ngay cả khi bạn đủ kỷ luật để làm điều đó, bạn không thể chắc chắn về đồng nghiệp của mình hoặc những người sẽ hỗ trợ phần mềm của bạn trong tương lai. Ngoài ra, mã hóa kiến ​​thức như vậy về mối quan hệ bảng nhiều hơn một lần vi phạm nguyên tắc DRY.

Nếu bạn sử dụng xóa tầng, không ai phải nhớ bất cứ điều gì và các hàng con sẽ luôn bị xóa khi cần.

+0

Hoàn toàn. Câu trả lời tuyệt vời và đặt tốt. Tính toàn vẹn dữ liệu luôn thu hút được rất ít sự chú ý và thường bắt đầu xuất hiện một vài năm 'và thường kết thúc bóp nghẹt nhiều công ty - họ không thể đổi mới và thay đổi nữa do những quyết định tồi tệ về thu thập dữ liệu từ lâu. –

+0

Dường như có một số sự kỳ thị liên quan đến việc xóa tầng vì các tai nạn có thể xảy ra khi xóa dữ liệu theo cách thủ công. Cá nhân tôi đã có một vài kinh nghiệm xấu với nó, nhưng tôi vẫn đồng ý rằng đó là một cách an toàn hơn để duy trì tính toàn vẹn dữ liệu chặt chẽ. Mặt khác tôi vẫn cố gắng tránh sử dụng thác. –

4

Xóa tầng gây ra nhiều vấn đề và do đó cực kỳ nguy hiểm. Tôi sẽ không khuyên bạn nên sử dụng nó. Ở nơi đầu tiên, giả sử tôi cần xóa bản ghi có hàng triệu bản ghi con. Bạn có thể khóa cơ sở dữ liệu và làm cho nó không sử dụng được trong nhiều giờ. Tôi biết rất ít dbas, những người sẽ cho phép xóa tầng được sử dụng trong cơ sở dữ liệu của họ.

Tiếp theo, nó không giúp tính toàn vẹn dữ liệu nếu bạn đã xác định FK. Việc xóa các bản ghi con vẫn tồn tại sẽ không thành công, là một điều tốt. Tôi muốn khách hàng xóa thất bại nếu anh ta có đơn đặt hàng hiện tại chẳng hạn. Việc xóa tầng được sử dụng một cách không suy nghĩ (như thường trong kinh nghiệm của tôi) có thể khiến mọi thứ bị xóa mà bạn thực sự không muốn xóa.

0

Sử dụng cả hai!

Xóa bằng tay "Đã tham gia" thường tốt hơn để tránh các sự cố chết người và các vấn đề tranh chấp khác khi bạn có thể chia nhỏ các lần xóa thành các đơn vị công việc nhỏ hơn. Nếu bạn có tranh chấp, nó chắc chắn dễ dàng hơn để tìm ra nguyên nhân của cuộc xung đột.

Như đã nêu "Xóa tầng" hoàn toàn sẽ đảm bảo tính toàn vẹn tham chiếu.

Vì vậy, hãy sử dụng cả hai - thực hiện xóa rõ ràng "trẻ em" trong các sqls đã tham gia để tránh các sự cố chết người và các vấn đề về hiệu suất. Nhưng để lại "CASCADE DELETE" được kích hoạt để bắt bất cứ điều gì bạn đã bỏ lỡ. Vì không có trẻ em nào còn lại khi bạn đến để xóa cha mẹ, điều này sẽ không làm bạn mất bất cứ thứ gì, trừ khi bạn mắc sai lầm, trong trường hợp đó, chi phí đáng để duy trì tính toàn vẹn tham chiếu của bạn.

+0

Bất kỳ khoá ngoại nào đảm bảo tính toàn vẹn tham chiếu –

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