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.