İ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.