İki tablo vardır:
- kullanıcı
- Adres
Kullanıcı Adrese bir başvuru içeriyor.
Adres, Kullanıcıya referans olarak oluşturulan CreatedBy ve ModifiedBy sütunlarını içerir.
Döngüsel bağımlılığı önlemek için bu veritabanını nasıl tasarlayabilirim?
İki tablo vardır:
Kullanıcı Adrese bir başvuru içeriyor.
Adres, Kullanıcıya referans olarak oluşturulan CreatedBy ve ModifiedBy sütunlarını içerir.
Döngüsel bağımlılığı önlemek için bu veritabanını nasıl tasarlayabilirim?
Yanıtlar:
İpuçları ve püf noktaları aramak için (ertelenmiş kısıtlamalar dahil) Ben sadece bu "referans kilidi" çıkış yolu tasarlamanızı öneririz - bu yüzden böyle bir şey deneyin:
Gerçekler
(UserID) var.(AddressID) tarafından oluşturuldu .(UserID)(AddressID) oluşturulmuş tarihi(DateCreated) .(AddressID) son değiştiren edildi Kullanıcı(UserID) üzerine tarihi(ModifiedOn) .(UserID) de bulunduğu Adres(AddressID) beri tarihi(ValidFrom) .Kısıtlamalar
Each Adres exactly one Kullanıcı tarafından oluşturuldu . It is possible that more than one Adres the same Kullanıcı tarafından oluşturuldu .
Each Adres oluşturulmuş exactly one tarihi . It is possible that more than one Adres oluşturulmuş the same tarihi .
For each Adres and tarihi , that adres tarafından değiştirildi at most one Kullanıcı üzerine that tarihi .
For each Kullanıcı and tarihi , that Kullanım bulunduğu at most one Adres beri that tarihi .
Mantıklı

Zorunlu adres söz konusu olduğunda, uygulama katmanında bunu doğrulayın ve yükleme deyimlerini bir işleme sarın - böylece tüm ya da hiçbir şeyi alamayacaksınız.
Aşağıdaki gibi 2 işlemde döngüsel bağımlılık oluşturmaktan başka bir seçeneğiniz yoktur, çünkü ilkini oluşturduğunuzda bir tablo yoktur.
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;
Eğer döngüsel bağımlılıktan kaçınmak istiyorsanız. Daha sonra bir REFERENCES kısıtlamasını kaldırmanız veya bir şekilde bir DELETE ve UPDATE CASCADE referansı eklemeniz gerekir. Ayrıca mantığınız biraz karmaşıksa bir TRIGGER uygulayabilirsiniz.