RDBMS için veritabanı modellerini incelerken, genellikle çok az veya hiç kısıtlama bulunmadığına şaşırdım (PK / FK dışında). Örneğin, yüzde genellikle bir tür sütununda saklanır int
( tinyint
daha uygun olurken ) ve CHECK
değeri 0..100 aralığına sınırlamak için herhangi bir kısıtlama yoktur . Benzer şekilde, SE.SE'de, kontrol kısıtlamalarını öneren cevaplar sıklıkla veritabanının kısıtlamalar için yanlış bir yer olduğunu öne süren yorumlar alır .
Kısıtlamaları uygulamama kararını sorduğumda, ekip üyeleri cevap veriyor:
Ya da bu özelliklerin kendi favori veritabanlarında bulunduğunu bile bilmiyorlar. Yalnızca ORM kullanan programcılardan anlaşılır, ancak belirli bir RDBMS ile 5+ yıllık bir deneyime sahip olduğunu iddia eden DBA'lardan çok daha az anlaşılabilir.
Veya bu kısıtlamaları uygulama düzeyinde uyguladıkları ve bu kuralları veritabanında çoğaltmaları, SSOT'u ihlal etmenin iyi bir fikir olmadığını göstermektedir.
Son zamanlarda, yabancı anahtarların bile kullanılmadığı daha fazla proje görüyorum. Benzer şekilde, SE.SE hakkında , kullanıcıların başvuru bütünlüğünü önemsemediğini ve uygulamanın onu idare etmesine izin vermediğini gösteren birkaç yorum gördüm .
Ekiplere FK kullanmama seçimleri hakkında sorular sorulduğunda, şunu söylüyorlar:
Örneğin, diğer tablolarda referans verilen bir öğeyi kaldırmak zorunda olduğunda PITA'dır.
NoSQL kayalar ve orada yabancı anahtar yoktur. Bu nedenle, RDBMS'de onlara ihtiyacımız yok.
Performans açısından büyük bir sorun değil (bağlam genellikle küçük veri kümeleri üzerinde çalışan küçük intranet web uygulamalarıdır, bu nedenle, aslında endeksler bile çok fazla önemli olmaz; verilen bir sorgunun performansının 1,5 saniyeden fazla geçmesi durumunda kimse umursamaz. ... ila 20 msn.)
Uygulamanın kendisine baktığımda, sistematik olarak iki modeli görüyorum:
Uygulama, verileri düzgün şekilde temizler ve veritabanına göndermeden önce kontrol eder. Örneğin
102
, uygulama aracılığıyla bir değeri yüzde olarak kaydetmenin bir yolu yoktur .Uygulama veritabanından gelen tüm verilerin tamamen geçerli olduğunu varsayar. Yani,
102
yüzde olarak gelirse, ya bir şey, bir yer çökecek ya da sadece kullanıcıya olduğu gibi gösterilecek ve garip durumlara yol açacaktır.Sorguların% 99'undan fazlası tek bir uygulama tarafından yapılsa da, zaman içinde komut dosyaları görünmeye başlar; gerektiğinde komut dosyaları el ile koştu veya cron işleri. Bazı veri işlemleri de veritabanının üzerinde el ile gerçekleştirilir. Hem komut dosyaları hem de manuel SQL sorguları, geçersiz değerler sağlama riskini yüksek tutar.
Ve işte sorum geliyor:
İlişkisel veritabanlarını kontrol kısıtlamaları olmadan ve sonunda yabancı anahtarlar olmadan bile modellemenin sebepleri nelerdir?
Buna değer, bu soru ve aldığım cevaplar (özellikle Thomas Kilian ile olan ilginç tartışma) veri tabanı kısıtlamaları konusundaki sonuçlarımla ilgili bir makale yazmamı sağladı .