Tecrübelerime göre, geçmişte okuduğum birçok projenin veritabanında ilişki tanımları yoktu, sadece kaynak kodunda tanımladılar. Bu yüzden veritabanındaki tablolar ile kaynak kod arasındaki ilişkileri tanımlamanın avantajları / dezavantajları nelerdir? Ve daha geniş olan soru, çağlayan, tetikleyiciler, prosedürler gibi modern veritabanlarındaki diğer gelişmiş özellikler hakkında… Düşüncelerimde bazı noktalar var:
Veritabanında:
Tasarımdan doğru veriler. Geçersiz veriye neden olabilecek uygulama hatalarını önleyin.
Uygulama veri toplama bütünlüğünü kontrol etmek için daha fazla sorgu yapmak zorunda olduğu için veri eklerken / güncellerken uygulamaya gidiş dönüş ağını azaltın.
Kaynak kodda:
Daha esnek.
Birden çok veritabanına ölçeklenirken daha iyi, bazen ilişki çapraz veritabanı olabilir.
Veri bütünlüğü üzerinde daha fazla kontrol. Veritabanının, uygulama verileri her değiştirdiğinde kontrol etmesi gerekmez (karmaşıklık O (n) veya O (n log n) (?) Olabilir). Bunun yerine, başvuru için yetkilendirildi. Ve uygulamada veri bütünlüğünün ele alınmasının veritabanını kullanmaktan daha ayrıntılı hata mesajlarına yol açacağını düşünüyorum. Örn: bir API sunucusu oluşturduğunuzda, veritabanındaki ilişkileri tanımlarsanız ve bir şeyler ters giderse (başvurulan varlık olmadığı gibi), bir mesajla birlikte bir SQL İstisnası alırsınız. En basit yol, müşteriye "Dahili sunucu hatası" olduğunu ve müşterinin neyin yanlış gittiğini bilmemesidir. Veya sunucu, neyin yanlış olduğunu bulmak için mesajı çözümleyebilir, bu bence çirkin, hataya açık bir yoldur. Uygulamanın bunu yapmasına izin verirseniz,
Başka bir şey var mı?
Düzenleme: Kilian'ın işaret ettiği gibi, performans ve veri bütünlüğü konusundaki noktam çok yanlış yönlendirilmiş. Bu yüzden oradaki amacımı düzeltmek için düzenleme yaptım. Veritabanını işlemesine izin vermenin daha verimli ve sağlam bir yaklaşım olacağını tamamen anladım. Lütfen güncellenmiş soruyu kontrol edin ve bu konuda bazı düşünceler verin.
Düzenleme: herkese teşekkürler. Aldığım cevaplar, kısıtlamaların / ilişkilerin veritabanında tanımlanması gerektiğine işaret ediyor. :). Bir sorum daha var, bu sorunun kapsamı dışında olduğu için, ayrı bir soru olarak gönderdim: API sunucusu için veritabanı hatası işleyin . Lütfen bazı görüşlerinizi bırakın.