SQL Server içinde NoSQL


28

Bu soru SQL ve NoSQL arasındaki farkla ilgili değildir. Şu anda bana gerçekten mantıklı gelmeyen bir şey için bazı sebepler aradım (belki de anlayış veya takdir eksikliğimden dolayı).

MVC5, önce Entity framework 6 kodunu ve SQL Server 2008'i kullanarak sıfırdan yeni bir projeye başladık. Mimar veritabanı şemasını gözden geçirdiğinde, tüm yabancı anahtarların ve bu gibi diğer kısıtlamaların “iş mantığı” olduğu için kaldırılması gerektiği ve başvuru kodunun iş katmanında uygulanmalıdır.

Benim fikrim, yabancı anahtarların veri / referans bütünlüğünün bir parçası olduğu ve iş mantığını gerçekten taklit etmediğidir. İş mantığını, referansların neyin / ne zaman / nasıl / niçin uygulandığını kontrol eden süreç ve doğrulama olarak görüyorum. Eşsiz kısıtlamaların tartışmasız iş süreçleri olduğunu anlayabiliyorum, ama benim için bu sadece mantığı tamamlıyor ve bütünlüğün bir parçasını oluşturuyor.

İkinci bir argüman ise verilere NoSQL yaklaşımı benimsemektir. Bunu gerçekten sıradışı ve sıradışı buldum: SQL-Server 2008'in kullanımı, raporlama ihtiyacı, terabaytlara ölçeklenemeyen veriler ve Mongo, Raven, vb. Gibi teknolojilere yönelik dikkat eksikliği.

Daha önce böyle bir senaryo ile karşılaşan var mı? Neden birileri referans verileri için tasarlanmış ve yabancı anahtar istemeyecek bir SQL Server'da bir NoSQL yaklaşımı benimsemelidir?


21
Sistem mimarı ile onun tavsiyesinin gerekçesi hakkında konuşun. Özel durumunuz için geçerli olan çok iyi bir sebebi var (uygulamanızın tam olarak neyi içerdiğini bilmeden mutlaka tahmin edemeyeceğimiz bir sebep) veya sadece beceriksiz.
Arseni Mourzenko

23
Benzer şekilde uygulanmış birçok veritabanı gördüm: FK yok, CHECK kısıtlama yok - bunlar her seferinde veritabanı mimarisi, referans bütünlüğü vb. Hakkında hiçbir şey bilmeyen, tecrübesiz kodlayıcılar tarafından tasarlanan veritabanlarıydı. Ancak, bununla tartışmanız önemlidir. İş arkadaşınız, beceriksiz olduğunu varsaymak yerine.
Arseni Mourzenko

5
Biraz kafam karıştı; Entity framework (önce kod) kullanarak bahsettiğinizden bahsedersiniz ... bu, Nesneleri (C # anlamında) yarattığınızı ve sonra Entity çerçevesinin veritabanı eşdeğerlerini oluşturmaya devam etmesine izin vermediği anlamına gelir; bu durumda FK'nin eklenmesi / kaldırılması vs. Entity Framework'ü zaptetmeye çalışmanın bir egzersizi (Mark Twain'in şarkı söylemesi için bir domuzu öğretmeye çalışmak konusundaki teklifine benziyor mu?)
Foon

2
Kendilerini "mimar" olarak nitelendiren, ancak daha büyük sistemlerin kodlanmasında veya sürdürülmesinde deneyim sahibi olmayan çok fazla insan var.
Doktor Brown

2
İlgili: thedailywtf.com/articles/The-Mythical-Business-Layer . "Bunu düşünüyorsanız, bir yazılım uygulamasındaki hemen hemen her kod satırı iş mantığıdır." Bu veritabanına uzanır. "Ancak bu kadar önemli - eğer öyle olmasa da - bir uygulamanın kodunun neredeyse hepsinin iş mantığı olacağını aklınızda bulundurmanız yeterli. Orada zaten yeterli araç var; başvurunuzun genel bir katmana ihtiyacı yok " (benimkinin vurgusu). Bunu öneren kişi muhtemelen veritabanını böyle bir genel katmana dönüştürmeye çalışıyordur. Kısacası, büyük olasılıkla buzzwords gerçekliğin üstüne koyuyorlar.
jpmc26

Yanıtlar:


74

Veri tabanı şemasını gözden geçirirken, bu iş mantığı olduğu için tüm yabancı anahtarların ve bu gibi diğer kısıtlamaların kaldırılması gerektiğini ve iş katmanında uygulanması gerektiğini belirtti.

O zaman bir aptal, ve kod üssünüzden bazı alıntılar bir gün Daily WTF'de sona eriyor . Onun yaklaşımının bir anlam ifade etmediği konusunda haklısın ve açıkçası onun da açıklaması yok.

Ona referans bütünlüğü kısıtlamalarının "iş mantığı" olmadığını; onlar konum kendi yerleşik doğrulama ile bir doğruluk standardı. İş mantığı, verilerle ne yaptığınızla ilgilidir; bütünlük , verilerin kendisinin bozulmamasını sağlamakla ilgilidir. Ve bu işe yaramazsa ... iyi o sorumlu. Ya onun planı ile devam edebilir ve hasarı biraz hafifletmeye çalışabilir ya da çalışmak için daha iyi bir yer aramaya başlayabilirsiniz. (Ya da her ikisi de.)


17
Mimarın bunu yapmasının nedenini (aklı başında) bir sebep bulmaya çalışan biraz daha diplomatik bir cevabım vardı. Ayık yansıma yerine, bunun yerine bu cevapla uçağa biniyorum.
Blrfl

7
Vay vay, kötü mimarlık girişimleri başka bir yerde çalışmak için bir nedendir? Kahretsin, bu manzaraya girsem hiçbir yerde çalışmaya devam edemezdim.
Kzqai

5
@ Kzqai ayrıca mimariyi temelde yanlış anlayan bir mimar var. Bu, 595 sayılı direktif gibi duyulmaya başlar ve evet, eğer biri beni bir tahta parçasına vida koymak için çekiç kullanmaya zorlamak isterse, beni bir şeyler yapmak için araçları kötüye kullanmaya zorlamayan birini bulurum.

4
Referans bütünlüğü , veritabanı teorisindeki ana konudur, gerçek dünyada onu destekleyen tüm veritabanlarından bahsetmiyorum. Açıkçası Andy'nin iş arkadaşı analizinde haklı, akademik ve profesyonel dünyanın geri kalanı% 100 yanlış. Günlük WTF'den bahsettiğiniz için bonus puanları .

2
@AndyClark Bundan vazgeçmelisin. Sebebi şu ki, şirketinizin çekirdeğindeki nükleer bir bomba. Dışkı maddesinin ventilatöre çarpması sadece an meselesidir. Bu olduğunda, 72 saatlik bir vardiyada çalıştığınız için şanslısınız, bir iş aradığınız en kötü durum senaryosu ... geliriniz olduğunda iş aramak için daha iyi.
Saat

2

Yabancı anahtar oluşturmak için bir nedenim olmadı.

- Joel Spolsky

Battaniye açıklamaları bir yana, özgünlük veya yabancı anahtar kısıtlamaları kullanmamayı seçmenin meşru ve güçlü nedenleri olduğunu kabul etmeye değer. Çoğu böyle bir şey gitmek:

  • Performans.Atomik işlemlerle bütünlük kontrolü yapmak ücretsiz değildir. Ve sık sık, veritabanı mimarisinin ölçeklenmesi en zor kısmıdır. Muhtemelen kontrolleri uygulama mantığınızda zaten yaptınız ve ikinci bir performansa ulaşmayı tercih etmediniz.
  • İhtiyaç eksikliği. Belki de verileriniz kirli ve bu konuda sorun yok. Bu ne yaptığınıza çok bağlıdır.

Ayrıca bakınız Yabancı anahtarların nesi var?


Ancak bunlar, sorunuzdaki nedenlerle eşleşmiyor.

Bu iş mantığıdır ve iş katmanında uygulanmalıdır.

Bu sebep biraz garip. Benzersizlik ve diğer bütünlük kısıtlamaları, bir ACID veritabanının alanıdır. Uygulama kodunuz, SQLServer'ın atomik ve bütünlük garantilerine yaklaşamıyor. Güçlü bir veri bütünlüğüne ihtiyacınız varsa, veritabanını yok saymanız aptallık olur.

İkinci bir argüman, NoSQL yaklaşımını veri depolama alanlarına uyarlamak istedikleri ve bu tür kısıtlamaları yerine koymak istemedikleridir.

İkinci sebep, gerçekten bir sebep değil; bu bir sonuçtur. Kısıtlamaların doğruluk ve performans arasında bir denge olduğu doğru olsa da, NoSQL veritabanları ikincisine karşı önyargılıdır.


Belki de sistem mimarınız bu meşru sebepleri aklınızda tutar ve siz de karıştınız. Ya da belki o patlayan bir aptal.

Her durumda, geçerli benzersiz ve yabancı anahtar kısıtlamaları kullanmaktan kaçınmak evrensel da ) sebepler vardır.

Not Eğer yabancı anahtarlar istemediğinize karar verirseniz, ilişkisel bir veritabanı kullanmak hala tamamdır. Genelleme olarak, ilişkisel veritabanları NoSQL benzerlerinden daha olgunlaşmıştır. Tek bir düğüm olarak, daha da hızlı olabilirler ve bunların üzerine bir NoSQL soyutlaması oluşturulabilir .


12
Joel'in bir aptal olmadığını söylemeye cüret ediyorum, ancak bir podcast'te açıklayıcı olmayan bir cevap, herhangi bir açıklama yapmadan, IMHO, herhangi bir salaktan daha az açıklamaya değer.
Martin Ba

11
Joel bir elektronik tablo çalışanı değil, veri tabanı çalışan bir adam, bu yüzden standart ilişkisel veritabanı uygulamalarına ilişkin cehaleti sanırım, şaşırtıcı değil ... Asla alınma, Joel. :-)
Eric King,

3
Joel'in bağlam içi gerçek teklifi, LINQ gibi teknolojiler, yabancı bir anahtarın kurulmasında sıkıntı yaratacak bir nedendir. Joel bir veritabanı yöneticisi değil ve blogunu araştırmaktan ve uzun süredir okur olmaktan, ondan konu hakkında konuşurken veya veri tabanlarını optimize etme, veri modelleri tasarlama vb. Konularında tavsiyelerde bulunmaya çalışıyorum. ama o şimdi değil, hiç olmadı - ya da iddia edildi! - Veri tabanları veya veri modelleme alanında uzman. Einstein'ı bileşik ilgi alanından - veya bu konuda sandviçlerden bahsetmek gibi. (XKCD referansı, rica ederim.) :)
BrianH

4
Joel Spolsky, güçlü ve tartışmalı görüşlere sahip olduğu ile bilinir. Bkz. FogBugz özel bir dilde yazılmış ; Bağımlılık enjeksiyonu çok karmaşık (btw, bu kapanmadan önce Stackoverflow'un en tartışmalı cevabıydı ) ; XML veritabanları yavaş ; vb.
BlueRaja - Danny Pflughoeft 30.05.2015

2
@BlueRaja: Umm ... XML veri tabanları vardır özellikle ilişkisel veri tabanlarına kıyasla, yavaş. Ne zamandan beri bu tartışmalı mı yoksa bir fikir mi?
Mason Wheeler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.