Có hai bảng:
- Người sử dụng
- Địa chỉ
Người dùng chứa một tham chiếu đến Địa chỉ.
Địa chỉ chứa các cột createdBy và ModifiedBy, tham chiếu đến Người dùng.
Làm cách nào để thiết kế cơ sở dữ liệu này để tránh phụ thuộc theo chu kỳ?
Có hai bảng:
Người dùng chứa một tham chiếu đến Địa chỉ.
Địa chỉ chứa các cột createdBy và ModifiedBy, tham chiếu đến Người dùng.
Làm cách nào để thiết kế cơ sở dữ liệu này để tránh phụ thuộc theo chu kỳ?
Câu trả lời:
Thay vì tìm kiếm các mẹo và thủ thuật (bao gồm các ràng buộc hoãn lại) tôi sẽ đề nghị bạn chỉ cần thiết kế theo cách của bạn khỏi "khóa tham chiếu" này - vì vậy hãy thử một cái gì đó như thế này:
Sự kiện
(UserID) tồn tại.(AddressID) được tạo bởi người dùng(UserID) .(AddressID) đã được tạo vào ngày(DateCreated) .(AddressID) được sửa đổi lần cuối bởi Người dùng(UserID) vào Ngày(ModifiedOn) .(UserID) cư trú tại Địa chỉ(AddressID) kể từ Ngày(ValidFrom) .Những ràng buộc
Each Địa chỉ được tạo bởi người exactly one dùng . It is possible that more than one Địa chỉ được tạo bởi người the same dùng .
Each Địa chỉ đã được tạo vào exactly one ngày . It is possible that more than one Địa chỉ đã được tạo vào the same ngày .
For each Địa chỉ and Ngày , that Địa chỉ đã được sửa đổi bởi at most one Người dùng vào that Ngày .
For each and Ngày người dùng , người that dùng cư trú at most one Địa chỉ kể từ that ngày .
Hợp lý

Theo như địa chỉ bắt buộc có liên quan, hãy xác minh rằng trên lớp ứng dụng và bọc các câu lệnh tải vào một giao dịch - theo cách đó bạn sẽ nhận được tất cả hoặc không có gì.
Bạn không có lựa chọn nào khác ngoài việc tạo ra sự phụ thuộc theo chu kỳ trong 2 thao tác như dưới đây vì một bảng không tồn tại khi bạn tạo bảng đầu tiên.
CREATE TABLE A (A_ID INT PRIMARY KEY, B_FK INT);
CREATE TABLE B (B_ID INT PRIMARY KEY, A_FK INT REFERENCES A(A_ID));
ALTER TABLE A ADD B_FK INT;
Nếu bạn muốn tránh phụ thuộc theo chu kỳ. Sau đó, bạn cần xóa một ràng buộc TÀI LIỆU THAM KHẢO hoặc bạn có thể thêm một tham chiếu XÓA và CẬP NHẬT CASCADE theo một cách. Bạn cũng có thể triển khai TRIGGER nếu logic của bạn hơi phức tạp.