2010-11-19 29 views
5

Có một bảng gọi là người. có personid và contactid.quyết định thiết kế cho DELETE SQL

nếu một người bị xóa thì tôi muốn xóa người đó khỏi db cũng như và những người liên hệ có liên quan cho người đó.

Thực tiễn tốt hơn là thực hiện quy trình DELETES trong ONE Store hay lớp doanh nghiệp của tôi trước tiên gọi pContactDelete và sau đó gọi pPersonDelete ???????

nhờ Niall

+0

Chỉ là một gợi ý, nhưng đây là thứ có thể cần 'UNDO' tại một số điểm (nghĩa là khôi phục một người vào hệ thống của bạn). Bạn đã xem xét việc có một lá cờ 'hoạt động' trên người của bạn và làm một cách hợp lý, chứ không phải là một sự xóa bỏ vật lý? – Paddy

Trả lời

12

Giả sử bạn đang sử dụng MS SQL Server:

Bạn có lẽ nên sử dụng ON DELETE CASCADE trên chính nước ngoài của bạn.

ALTER TABLE Contact 
ADD CONSTRAINT FK_PersonContact FOREIGN KEY (PersonId) 
REFERENCES Person(PersonId) ON DELETE CASCADE 

Điều này sẽ đảm bảo rằng hàng liên hệ bị xóa khi hàng người bị xóa. Đó là một ràng buộc luôn được thực thi bởi cơ sở dữ liệu.

Bạn cũng có thể đặt điều này trong SQL Management Studio trong hộp thoại Quan hệ khóa ngoại, phần INSERT và UPDATE Specification, Delete Rule -> set to Cascade.

Chỉ cần đảm bảo rằng nếu một nơi nào đó bạn lưu trữ các đối tượng Contact trong lớp doanh nghiệp của mình, bạn cũng làm mới bộ nhớ cache của mình.

1

bạn có thể xác định hiệu ứng xếp tầng trên khóa tham chiếu

1

Bất kỳ phương pháp nào bạn thực hiện, dữ liệu phải ở trạng thái nhất quán. Nó sẽ đơn giản hơn nếu bạn thực hiện các thao tác trên cả hai bảng trong cùng một thủ tục lưu sẵn. Nếu bạn đặt nó vào doanh nghiệp của bạn, tôi nghĩ bạn nên sử dụng giao dịch, để nếu các liên hệ của bạn không bị xóa, bạn có thể khôi phục xóa người.

1

Nếu perchance bạn đang sử dụng Oracle, bạn có một vài tùy chọn.

  1. Thiết lập khóa ngoài giữa bảng PERSON và CONTACT để xóa thác.

  2. Tạo trình kích hoạt BẬT DELETE và thực hiện xóa ở đó. Tùy chọn này cũng cung cấp cho bạn cơ hội tạo bất kỳ mục nhập kiểm tra cần thiết nào hoặc ghi vào bất kỳ tệp nhật ký nào, v.v., có thể cần thiết khi có điều gì đó bị xóa.

Chia sẻ và thưởng thức.

+0

+1 không giới hạn đối với Oracle, vì nhiều RDBMS hỗ trợ ON DELETE CASCADE cho khóa ngoài và ON DELETE gây ra – fredt

0

Cách tiếp cận của tôi đối với vấn đề đó là KHÔNG sử dụng ràng buộc xóa tầng là nguyên tắc chung. Xóa tầng có thể có các hiệu ứng kỳ lạ khi có các tham chiếu tuần hoàn. Trong một môi trường sản xuất, nó được khuyến khích để xử lý việc xóa tài liệu tham khảo trẻ em thông qua một thủ tục được lưu trữ. Bạn không cần phải thực hiện cuộc gọi này từ lớp Doanh nghiệp miễn là bạn không thực hiện bất kỳ xác thực đáng kể nào trước khi xóa địa chỉ liên hệ

+0

Tôi có một trí tưởng tượng tồi tệ đến mức không thể thấy được tình huống có thể có tham chiếu tuần hoàn khóa ngoài với các lần xóa tầng. Tôi nghĩ rằng Xóa <-> Đặt Null (hoặc Đặt Mặc định) là phổ biến hơn. –

+0

Hi Arto, Để giúp trí tưởng tượng của bạn giả sử bảng Master "SalesMan" và bảng con là "Đặt hàng". Bảng thứ tự chứa "PrimarySalesManId" và "SecondarySalesManId". Bây giờ nếu bạn muốn xóa một bản ghi từ bảng chính và với việc xóa tầng trên, làm thế nào để bạn mong muốn xóa để làm việc? Nó có giúp được không? – Hunter

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