Xác nhận quyền sở hữu MSDN là chính xác dựa trên việc sử dụng phụ thuộc (khóa ngoại). Hãy nghĩ đến những thứ tự như
- bảng Child (cascade xóa)
- bảng phụ huynh: chèn và/hoặc cập nhật và/hoặc xóa kỷ lục có nghĩa là bước cuối cùng của thác xóa.
- Bảng con: chèn hoặc cập nhật.
Vì chúng tôi nói về xóa tầng, chúng tôi phải đảm bảo rằng bằng cách xóa bản ghi gốc, cần xóa mọi bản ghi con liên quan đến cha mẹ trước khi chúng tôi xóa bản ghi gốc. Nếu chúng tôi không có hồ sơ trẻ em, không có xóa ở cấp độ trẻ em. Đó là tất cả.
Mặt khác, bạn có thể tiếp cận trường hợp của bạn theo nhiều cách khác nhau. Tôi nghĩ rằng một cuộc sống thực tế (gần như) kịch bản sẽ hữu ích hơn. Giả sử rằng bảng cha là phần chính của các đơn đặt hàng (orderID, clientID, vv) và bảng con là phần chi tiết (detailID, orderID, productOrServiceID, v.v.). Vì vậy, bạn nhận được một trật tự và bạn đã sau
bảng Chánh
orderID = 1 (auto increment)
...
bảng Child
detailID = 1 (auto increment)
orderID = 1
productOrServiceID = 342
and
detailID = 2
orderID = 1
productOrServiceID = 169
and
detailID = 3
orderID = 1
productOrServiceID = 307
Vì vậy, chúng tôi có một đơn hàng cho ba sản phẩm/dịch vụ. Bây giờ khách hàng của bạn muốn bạn chuyển sản phẩm hoặc dịch vụ thứ hai sang một đơn đặt hàng mới và phân phối nó sau này. Bạn có hai tùy chọn để thực hiện việc này.
Người đầu tiên (trực tiếp)
kết quả là bạn sẽ có
Chánh bảng
orderID = 1 (auto increment)
...
and
orderID = 2
...
bảng Child
detailID = 1 (auto increment)
orderID = 1
productOrServiceID = 342
and
detailID = 2
orderID = 2
productOrServiceID = 169
and
detailID = 3
orderID = 1
productOrServiceID = 307
thứ hai (gián tiếp)
Giữ một DataRow của sản phẩm/dịch vụ thứ hai từ bảng con như là một biến
Xóa hàng tương đối khỏi bảng con
Tạo đơn hàng mới (kỷ lục mẹ mới) mà được OrderID = 2
Chèn DataRow giữ trên bảng con bằng cách thay đổi OrderID trường từ 1 để 2
Kết quả là bạn sẽ có
bảng Chánh
orderID = 1 (auto increment)
...
and
orderID = 2
...
bảng Child
detailID = 1 (auto increment)
orderID = 1
productOrServiceID = 342
and
detailID = 3
orderID = 1
productOrServiceID = 307
and
detailID = 4
orderID = 2
productOrServiceID = 169
Lý do cho tùy chọn thứ hai, đó là theo cách thích hợp nhất cho nhiều ứng dụng, là cung cấp các chuỗi thô chi tiết cho từng bản ghi gốc. Tôi đã thấy các trường hợp mở rộng tùy chọn thứ hai bằng cách tạo lại tất cả các bản ghi chi tiết. Tôi nghĩ rằng đó là khá dễ dàng để tìm giải pháp nguồn mở liên quan đến trường hợp này và kiểm tra việc thực hiện.
Cuối cùng lời khuyên cá nhân của tôi là tránh thực hiện loại công cụ này với bộ dữ liệu trừ khi ứng dụng của bạn là người dùng đơn lẻ. Cơ sở dữ liệu có thể dễ dàng xử lý "vấn đề" này trong một chủ đề an toàn với giao dịch.
là máy chủ sql này? Hoặc tôi đã bỏ lỡ thẻ. Câu hỏi thú vị +1 – cctan
Đây là SqlServer 2008, nhưng tôi nghĩ nó khá độc lập DBMS! –
Tôi nghĩ rằng trẻ em thay đổi bố mẹ là một hoàn cảnh bất thường. –