Ekibim, yabancı anahtar ilişkileri olan ilişkisel veritabanı varlıklarından korkuyor ve nedenini anlamıyorum


12

Ben nispeten üniversite dışında tazeyim, bu yüzden ilişkisel veritabanları ile aşinalık çoğu BCNF veya 3NF olmayan bir şey bir travesti olan benim veritabanları ders. Kesinlikle bu uç noktaların bir ucu, ama işteki ekibim gerçekten tam tersi görünüyor.

Mikro hizmet db şemalarımızda, varlıklar nadiren tek bir tablodan daha fazlasına sahiptir. Yaygın olarak başka bir tabloya normalleştireceğiniz her şey json sütununda saklanır. Daha sonra bu json'daki özelliklerden birinin sorgulanması gerektiği keşfedilirse, yeni bir sütun eklenir ve veriler her iki yerde de saklanır (evet, aynı tabloda iki farklı sütunda).

Birçok durumda bu json sütunlarının kesinlikle bir avantajı vardır. Bu verileri asla sorgulamanız gerekmiyorsa ve bu verilerde tek taraflı bir değişiklik yapmanız gerekmiyorsa (ki bu kesinlikle tahmin edemeyeceğiniz bir şeydir), bu kötü bir fikir değildir. Ayrıca, hizmetlerimizin çoğu ya sunucuyu görmez ya da ihtiyaç duydukları şey için müstehcen bir miktarda disk alanına sahip makinelerde barındırılır, bu nedenle veri çoğaltma büyük bir sorun değildir. (Genel olarak felsefeden kaçınmak istediğim bir şey olsa da)

Şu anda, kurallara sahip oldukları koşullara göre eşleşen bir hizmet oluşturuyoruz ve daha sonra kurallar doğru olduğunda bu kurallarla ilişkili bir dizi işlem gerçekleştiriyoruz (örneğin, tüm koşullar doğrudur). Bu hizmeti en kısa sürede oluşturan alt ekibim, şemadaki kurallardan uzak eylemleri ve koşulları normalleştirmenin önemli bir yararı olduğuna inanıyor. Açıkçası bu tablo, kural kimliği ile yabancı anahtar ilişkilerini korur. Bizim bakış açımızdan, sadece bir kez değerlendirilmemizi sağlayan koşullara ilişkin veri çoğaltmasını önleyebiliriz ve her bir kuralı çıkarmaya ve bellekte arama yapmaya gerek kalmadan ihtiyaç duyduğumuz koşul ve kuralları bulmamız kolaydır.

Bugün ana mühendislerimizden biriyle konuşurken beni bu şemadan uzaklaştırmaya çalıştı. Aslında ihtiyacımız olmadığını her şekilde tartışmaya çalışmak, gelecekte performans sorunlarına neden olacak ve sahip olduğumuz eski bir monolite tasarım travestisi atıfta bulunacaktır. Yaptığımız şeyi "eski yol" ve düz tabloları json ile "yeni yol" olarak adlandırdı. Atomisite istediğim yerlerde buna ihtiyacımız olmadığını ve sorgular yerine hafızada daha fazla şey yapmamız gerektiğini savundu. Bu, birçok hizmetimizin şimdi takip ettiği bir tasarım ilkesidir. Verilerimizin hacminin, sorgularımızı hızlı tutması gereken önemli ölçüde artacağını tahmin etmiyoruz. Tahmin ettiğimiz şey, kural değerlendirme ve eylemleri gerçekleştirmek için harcanan çok zaman.

İlişkisel olmayan veritabanlarının son yıllarda daha popüler hale geldiğini anlıyorum, ancak yabancı anahtar ilişkilerinin performans sonuçları hakkında aktif olarak bilgi ararken bile, davasını yapan çok fazla bilgi görmüyorum. Sanırım sorunlara neden olabilecek büyük işlemler yapmaya eğilimli olabilirler, ancak bu yabancı anahtarın kendisinden bağımsız bir sorun gibi görünüyor.

Bu benim saflığım mı? Yoksa bu benim ve alt ekibimin eksik olduğu bir şey mi var? Sorunumuzla ilgili ayrıntılı bilgi vermedim çünkü buna bir çözüm aramıyorum. Bunun daha büyük ekibimizde yaygın bir eğilim olduğu göz önüne alındığında, bununla bir şey olup olmadığını gerçekten merak ediyorum.


Başlığındaki sorunuzun cevabı "Şirketinizdeki eski monolit nedeniyle korkuyorlar" olacaktır. Ancak sorunuzun gövdesi tamamen farklı bir şey soruyor gibi görünüyor, yani "Yabancı anahtarlar performans sorunları getiriyor mu?"
Christian Hackl

2
Acaba "app" kodu inşa RDBMS yüzde ne
Caleth

Yaklaşımın iyi olup olmadığı, inşa ettiğiniz uygulamanın türüne, ihtiyaçlarına ve gidiş yönüne (gereksinimler, mimari kısıtlamalar) bağlıdır - burada gerçekten değerlendiremeyeceğimiz bir şey. NoSQL'e gelince - her şey muazzam yatay satılabilirliği desteklemek ve tüm uygulamaların RDBMS'nin katı kısıtlamalarını gerektirmediğinin tanınmasıyla ilgiliydi. Daha fazla bilgi için 3 cevap top kullanmak burada (derinlemesine 2. ve 3. go fazlası) bir başlangıç noktası olarak.
Filip Milovanović

2
Teknik olmayan bir tavsiye sunabilirsem: biraz tonlayın. Tasarım kararlarına katılmadığınız ve bunu minimal gerçek dünya deneyimi pozisyonunda yaptığınız iş hakkında çok fazla karar veriyorsunuz ("evet, aynı tabloda iki farklı sütunda", "tasarım travestisi") . Doğru ya da yanlış olduğunu söyleyemem çünkü projeyi görmedim, ancak sistemler bitmiş ürünün işlevsel olmasına rağmen kavramsal olarak saf olmayan bir dizi uzlaşma olma eğilimindedir. Kariyeriniz ilerledikçe ve bu kararları vermek işinizin bir parçası haline geldikçe bu daha açık hale gelecektir.
Blrfl

@Blrfl Mükemmel koymak
Robbie Dee

Yanıtlar:


8

Burada ekibinizin nereden geldiğini anlamak için anahtar kelime "mikro hizmetler" dir. İlk olarak, özellikle aşağıdaki bilgiler için bu kavramı okumaya değer:

  • Veriler nasıl saklanmalıdır?
  • Tasarım ilkeleri?
  • Ölçeklemek için nasıl tasarlanırlar?

Her şeyi yapmak için nispeten yeni bir yöntemde olduğu gibi (ve yazılım mimarisi söz konusu olduğunda 5-10 yıl nispeten yeni), ideallerin ve gerçekliğin biraz farklı olduğunu göreceksiniz.

İdeallerden biri, her mikro hizmetin kendi veri deposuna sahip olması gerektiğidir. NOT: Veri deposu dedim, veritabanı değil. Normal bir veritabanının aksine sadece bir arama motoru, blob depolama veya basit önbellekleme istediğiniz durumlar vardır. Kiminle konuştuğunuza bağlı olarak, bu ideal mikro hizmet örneği başına bir veri deposuna bile gidebilir!

Sonuç olarak, internet ölçeğine gitmekten bahsederken, ACID (Atomiklik, Tutarlılık, Yalıtım ve Dayanıklılık) işlemlerinin güvenliği ve aşinalığı, bir veritabanında milyonlarca kullanıcınız olduğunda ölçeklenmemesidir. NoSQL'in ortaya çıkmasıyla, paradigma BASE'e (Temelde Mevcut, Yumuşak durum, Sonunda tutarlılık) doğru kaymıştır. ( başvuru )

Verileri yönetme şeklinizin PH değerini değiştirmenin bir etkisi vardır:

  • Veritabanının sizin için halletmek için kullandığı şeyler şimdi kod içinde yönetilmelidir
  • Bir soruna daha fazla mikro hizmet örneği atarak ölçeklendirmek, sunucuya "sonsuz" kaynaklar eklemekten daha kolaydır
  • Artan karmaşıklık pahasına güvenilirliği artırırsınız

Ekibinizin ayrıntılarını veya çözümü elde etmek için ne kadar büyük bir niyetleri olduğunu cevaplayamıyorum, ancak tipik olarak bir ya hep ya hiç çözümünüz olması gerekmez. Burada oturup takımın doğru seçimleri yapıp yapmadığına karar vermeyeceğim. Size en azından nereden geldiğini anlayabilmeniz için size bir bağlam sağlıyorum.


+1 Harika şeyler - mikro hizmetlerin etrafında sadece veritabanlarını değiştirmenin bir örneği olmadığı anlamına gelen birçok incelik vardır.
Robbie Dee

@RobbieDee, kabul etti. Bu dünyada çok fazla karmaşıklık var ve herkes ayrıntılara katılmıyor.
Berin Loritsch

Cevap bu olmalı. Kendi veri deposuna sahip olan her bir mikro hizmetin biti gerçekten farklılaştırıcı faktördür. Veri depolama ihtiyaçlarınızda ve çözümlerinizde büyük bir değişiklik yapar ve ACID uyumlu bir veri deposu eskisi kadar faydalı değildir.
Greg Burghardt

7
Bu iyi bir cevap ve ben de iptal ettim. Sadece "internet ölçeği" olarak adlandırdığınız şeyin yalnızca en büyük şirketler için geçerli olduğunu ; kurumsal veritabanlarının ve web sitelerinin büyük çoğunluğu için (bunların% 95'ini söyleyebilirim), "geleneksel" normalleştirilmiş SQL veritabanları hala mükemmel bir şekilde uygulanabilir.
Robert Harvey

@RobertHarvey, yürekten katılıyorum. Hakkında yazdığım şeyleri belirten mikro hizmetler hakkında birden fazla makale okudum. Kendi projelerimizde uygun normalleştirme ve kısıtlamalara sahip bir SQL veritabanı kullanıyoruz. Safın kalbine zarar verir, ancak gerçek şu ki kullanıcı tabanımız oldukça küçüktür (yüzlerce veya kullanıcı) ve veritabanı bizim için bir performans sorunu olmamıştır.
Berin Loritsch

3

Tamam, projenin ana mühendisi olmadığından, bu proje için yönergelerini takip etmeniz gerekiyor.

Sistemin kendi tasarımınızla çalışmanızı ve evdeki prototipinizi denemenizi tavsiye ederim, böylece herhangi bir ödünleşmeyi anlayabilirsiniz. Bunu kendi eğitiminiz için yapın ve iş yerinde ancak çalışma örneklerini gösterebileceğiniz zaman belirtin.

Deneyimlerim, kısıtlamaların veritabanı performansında yavaşlamaya neden olduğu yönünde bir iddia olduğu yönünde. Ve evet, bu kısıtlamaları kontrol etmeniz gerekecek. Ancak, veritabanı tutarsız olduğunda çok daha büyük bir sorundur ve bu, telafi etmek için SQL ve daha fazla kod yazmanıza neden olur, genellikle sistemin karmaşıklığını artırır ve yavaşlatır.

3nf, uygun şekilde yapıldığında veritabanını daha hızlı hale getirecektir, çünkü daha az yedekli veri depolandığından daha fazla önbelleklenebilir. Ancak, şu anki işinizde, normalleştirilmiş bir veritabanı ile normalleştirilmemiş bir veritabanı arasındaki performans farkını gerçekten görecek kadar büyük bir veri kümesi olmayabilir.


+1 Harika bir fikir. Ve bir dev makine için hacimler çok büyükse, N cinsinden bir örnek genellikle çok iyi bilgiler verebilir.
Robbie Dee

2

Bence Referans Dürüstlüğünün kendisinden ziyade daha önce var olan aynı eski "travestiyi" yeniden yaratmaktan korkuyorlar.

Atomisite istediğim yerlerde buna ihtiyacımız olmadığını savundu ...

Atomikliğe ihtiyaç duyduğunuzda sağlam bir dava (diğer bir deyişle İşlevsel Olmayan Gereksinim) yapabiliyorsanız, bunu sağlamak için iyi ve sağlam bir karşı argümana ihtiyaçları olacaktır.

... sorgular yerine hafızada daha fazla şey yapmalıyız. Bu bir tasarım prensibi ... Verilerimizin hacminin önemli ölçüde artacağını tahmin etmiyoruz ...

Diyelim umut haklısın. Ben performans kalmak için "yeterince küçük" kalan verilere güvenerek riskli olduğunu öneriyoruz.

Ayrıca, bu Kurallardaki değişiklik oranı nedir? Ne kadar çok çoğaltma yaparsanız, aynı şeyi birden fazla yerde güncellemek için harcayacağınız daha fazla zaman (para olarak da bilinir).


1

RDBMS'lerin arkasındaki temel kavramlar 40 yaşın üzerindedir. O zamanlar depolama çok pahalıydı ve her türlü artıklık kaşlarını çattı. RDBMS'lerin arkasındaki kavramlar hala sağlam olsa da, performans için denormalizasyon (birleşmeleri azaltmak) fikri son yıllarda yaygın olarak kabul görmüştür.

Bu nedenle, belirli bir boyuttaki RDBMS için, genellikle mantıksal tasarımınıza (artıklık olmadan) ve fiziksel tasarımınıza (artıklık ile) sahip olursunuz.

Depolama alanının ucuz olduğu ve işlemcilerin her zamankinden daha hızlı olduğu günümüze kadar, bu tasarım baskılarının bazıları o kadar önemli değil. Nihayetinde işten çıkarma ve yetim kayıtlarını önemsediğinize karar verirsiniz . Bankacılık gibi bazı endüstriler için veri doğruluğu çok önemlidir, bu yüzden RDBMS'lerden nasıl uzaklaşacaklarını görmek zordur. Diğer endüstriler için, yeni oyuncular her zaman pazara giriyor, bu yüzden seçenekler sayısız.

Ekibinizin bir RDBMS'nin getirebileceği kısıtlamalardan rahatsız olup olmadığı konusunda - kim bilir? Kesinlikle genç geliştiriciler, önceki nesillerin geliştiricilerinin yaptığı RDBMS nousuna sahip değiller, ancak bu muhtemelen geliştirici teknolojilerinin ve veritabanı platformlarının çoğalmasıyla ilgilidir.

Bir geliştiricinin öğrenebileceği teknolojilerin sonu yoktur ve kariyeriniz için doğru punt yapmak zor olabilir. Elbette, geliştiricilerin tüm esnafların krikosu olduğu günler çoktan gitti - birinin öğrenebileceği çok fazla şey var.

Ama - eldeki soruya. Kendi kabulünüzle, veri hacimlerinin artmasını beklemezsiniz ve sistem iyi performans gösterir. Algılanabilir bir faydası olmayan şeyleri yeniden tasarlama fikrini satmanız oldukça zor olacaktır. Bir RDBMS yaklaşım nereye kavramının kanıtı yapabileceğini Belki eğer etmedi yarar, bu farklı bir hikaye olurdu.


1
bu neden reddedildi? bu dengeli bir cevaptır. pragmatizm +1
Dirk Boer

Pragmatizm iyidir, ama yine de dikkatli olmalısınız. Bir projenin başlangıcındaki performans adına verileri denormalize etmek, zamanından önce optimizasyondan kaynaklanır. Çalışan eski bir sistemi yeniden yapılandırmamak açıkçası iyi ve pragmatik bir seçimdir, ancak “her zaman tersini yaptık ve işe yarıyor” adına endüstri standartlarına kadar yeni bir sistem tasarlamayı reddetmek iyi bir argümandan uzak .
Vincent Savard

Bir projenin başlangıcındaki performans adına verileri denormalize etme ... İpucu: Yapmıyorsunuz :)
Robbie Dee

1
RDBMS'nin değeri disk verimliliğinden gelmez.
TehShrike

0

Hangi veritabanını kullandığınıza bağlıdır.

Geleneksel bir RDBMS'de haklısınız. Verilerin tekrarı bir iğrençliktir. Sütunlar ve json denklikleri kaçınılmaz olarak senkronizasyondan çıkacak çünkü onu uygulayacak hiçbir şey yok. Yabancı anahtar desteği iyi bilinir, ilişkileri tanımlamak ve uygulamak konusunda iyi bir iş çıkarır. Atomisite, verilerle neredeyse her şeyi yapmak için çok önemlidir.

Nosql türünde bir kurulumda, daha az açıktır. Kesin bir ilişki olmadığından, ilişkilerin uygulanması daha az önemli hale gelir. Bu tür json içeriği sütun dizini ile bu sistemlerde çok daha yaygındır, çünkü hiçbir ilişki senkronizasyondan çıkma olasılığı daha azdır. Atomisite tek tablo ile sınırlıdır, çünkü nosql böyle çalışır.

Hangisi daha iyi, aslında ne yaptığınıza ve neye ihtiyacınız olduğuna bağlıdır.

Ama iş arkadaşlarınız bir kargo tarikatındaymış gibi geliyor. Eski kötü şeyler tarafından ısırıldılar, bu yüzden şimdi işler yeni parlak şey olmalı. Birkaç yıl içinde, yeni parlak şey tarafından ısırıldıklarında, umarım SQL vs noSQL'in bir dizi ödünleşim olduğunu anlayacaklardır.

Ama yapmayacaklar. Umarım olsa.

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.