Ada dua tabel:
- Pengguna
- Alamat
Pengguna berisi referensi ke Alamat.
Alamat berisi kolom CreatedBy dan ModifiedBy, yang merujuk pada Pengguna.
Bagaimana cara mendesain database ini untuk menghindari ketergantungan siklik?
Ada dua tabel:
Pengguna berisi referensi ke Alamat.
Alamat berisi kolom CreatedBy dan ModifiedBy, yang merujuk pada Pengguna.
Bagaimana cara mendesain database ini untuk menghindari ketergantungan siklik?
Jawaban:
Alih-alih mencari tips dan trik (termasuk kendala yang ditangguhkan), saya sarankan Anda mendesain jalan keluar dari "kunci referensi" ini - jadi cobalah sesuatu seperti ini:
Fakta
(UserID) ada.(AddressID) dibuat oleh Pengguna(UserID) .(AddressID) dibuat pada Tanggal(DateCreated) .(AddressID) terakhir diubah oleh Pengguna(UserID) pada Tanggal(ModifiedOn) .(UserID) berada di Alamat(AddressID) sejak Tanggal(ValidFrom) .Kendala
Each Alamat dibuat oleh exactly one Pengguna . It is possible that more than one Alamat dibuat oleh the same Pengguna .
Each Alamat dibuat pada exactly one Tanggal . It is possible that more than one Alamat dibuat pada the same Tanggal .
For each and Tanggal Alamat , that Alamat diubah oleh at most one Pengguna pada that Tanggal .
For each and Tanggal Pengguna , that Pengguna berada di at most one Alamat sejak that Tanggal .
Logis

Sejauh menyangkut alamat wajib, verifikasi bahwa pada lapisan aplikasi dan bungkus pernyataan pemuatan menjadi transaksi - dengan cara itu Anda akan mendapatkan semua atau tidak sama sekali.
Anda tidak punya pilihan selain membuat ketergantungan siklik dalam 2 operasi seperti di bawah ini karena satu tabel tidak ada ketika Anda membuat yang pertama.
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;
Jika Anda ingin menghindari ketergantungan siklik. Maka Anda perlu menghapus satu batasan REFERENSI atau Anda dapat menambahkan referensi DELETE dan UPDATE CASCADE dalam satu cara. Anda juga bisa mengimplementasikan TRIGGER jika logika Anda agak rumit.