İlişkisel Olmayan Veritabanı Tasarımı [kapalı]


114

İlişkisel olmayan "nosql" veritabanları ile kullandığınız tasarım stratejilerini duymak istiyorum - yani, geleneksel ilişkisel tasarım veya SQL (Hypertable, CouchDB gibi) kullanmayan (çoğunlukla yeni) veri deposu sınıfı. SimpleDB, Google App Engine veri deposu, Voldemort, Cassandra, SQL Veri Hizmetleri vb.). Genellikle "anahtar / değer depoları" olarak da anılırlar ve temelde dev dağıtılmış kalıcı hash tabloları gibi davranırlar.

Özellikle, bu yeni veritabanları ile kavramsal veri tasarımındaki farklılıklar hakkında bilgi edinmek istiyorum . Hangisi daha kolay, hangisi daha zor, ne yapılamaz ki?

  • İlişkisel olmayan dünyada çok daha iyi çalışan alternatif tasarımlar buldunuz mu?

  • İmkansız görünen herhangi bir şeye başınızı vurdunuz mu?

  • Boşluğu herhangi bir tasarım modeliyle doldurdunuz mu, örneğin birinden diğerine çevirmek için?

  • Şu anda açık veri modelleri yapıyor musunuz (örneğin UML'de) veya bunları tamamen yarı yapılandırılmış / belge yönelimli veri blobları lehine mi attınız?

  • İlişkisel bütünlük, keyfi olarak karmaşık işlem desteği, tetikleyiciler vb. Gibi RDBMS'lerin sağladığı önemli ekstra hizmetlerden herhangi birini özlüyor musunuz?

Ben bir SQL ilişkisel DB geçmişinden geliyorum, bu yüzden normalleşme benim kanımda. Bununla birlikte, ilişkisel olmayan veritabanlarının basitlik ve ölçeklendirme avantajlarını elde ettiğimi ve içgüdülerim bana tasarım yeteneklerinde daha zengin bir örtüşme olması gerektiğini söylüyor. Ne yaptın?

Bilginize, burada benzer konularda StackOverflow tartışmaları var:


2
anahtar / değer veritabanları eski yeni şeyi kaydeder.
Christopher

1
Uber ile ilgilenen herkes için, burada NoSQL google grubunda devam eden uzun biçimli bir tartışma var: groups.google.com/group/nosql-discussion/browse_thread/thread/…
Ian Varley

4
Bilginize, bu konuyla ilgili uzun formlu bir rapor yazdım, burada: google.com/url?sa=D&q=http://ianvarley.com/UT/MR/… Yararlı katkılarınız için hepinize teşekkürler!
Ian Varley

Yanıtlar:


55

İlişkisel olmayan DBMS'nin veri modellerine göre çok farklı olduğunu ve bu nedenle kavramsal veri tasarımının da çok farklı olacağını göz önünde bulundurmanız gerektiğini düşünüyorum. Thread Olmayan İlişkisel Veritabanları Veri Tasarım ve NoSQL Google grubuna farklı paradigmalar böyle kategorize edilir:

  1. Bigtable benzeri sistemler (HBase, Hypertable, vb.)
  2. Anahtar-değer mağazaları (Tokyo, Voldemort vb.)
  3. Belge veritabanları (CouchDB, MongoDB, vb.)
  4. Grafik veritabanları (AllegroGraph, Neo4j, Susam, vb.)

Çoğunlukla grafik veritabanlarıyla ilgileniyorum ve bu paradigmayı kullanarak veri tasarımının zarafeti beni oraya getirdi, RDBMS'nin eksikliklerinden bıktım . Bu wiki sayfasına bir grafik veritabanı kullanarak birkaç veri tasarımı örneği koydum ve temel IMDB film / oyuncu / rol verilerinin nasıl modelleneceğine dair bir örnek de var.

Sunum slaytları (SlideShare) Grafik Veritabanları ve Büyük Ölçekli Bilgi Yönetimi Geleceği tarafından Marko Rodriguez de bir grafik veritabanı kullanarak veri tasarımı için çok güzel bir giriş içerir.

Belirli soruları bir graphdb bakış açısıyla cevaplamak:

Alternatif tasarım: Herhangi bir endişe duymadan veya hangi varlıkların bağlanabileceğini önceden tanımlamaya ihtiyaç duymadan birçok farklı varlık türü arasında ilişkiler eklemek.

Boşluğu doldurmak: Alanın kendisine bağlı olarak bunu her durum için farklı yapma eğilimindeyim, çünkü "tabloya dayalı bir grafik" ve benzerlerini istemiyorum. Bununla birlikte, RDBMS'den graphdb'ye otomatik çeviri hakkında bazı bilgiler burada .

Açık veri modelleri: Bunları her zaman yapıyorum (beyaz tahta stili) ve ardından modeli DB'de olduğu gibi kullanıyorum.

RDBMS dünyasından özledim: rapor oluşturmanın kolay yolları. Güncelleme: Belki bir grafik veritabanından raporlar oluşturmak o kadar da zor değildir , bkz . Neo4J Örnek Veritabanı için Rapor Oluşturma .


79

İlişkisel olmayan DB'lerle yeni başladım ve hala kafamı etrafına dolayıp en iyi modelin ne olacağını bulmaya çalışıyorum. Ve sadece CouchDB adına konuşabiliyorum.

Yine de bazı ön sonuçlara sahibim:

İlişkisel olmayan dünyada çok daha iyi çalışan alternatif tasarımlar buldunuz mu?

Tasarım odağı değişir: Belge modelinin tasarımı (DB tablolarına karşılık gelir) neredeyse önemsiz hale gelirken, her şey görünümlerin tasarlanmasına bağlıdır (sorgulara karşılık gelir).

Belge DB'si karmaşıklıkları değiştirir: SQL esnek olmayan verilere ve esnek sorgulara sahiptir, belge DB'leri bunun tam tersidir.

CouchDB modeli "JSON belgeleri" koleksiyonudur (temelde iç içe geçmiş karma tablolar). Her belgenin benzersiz bir kimliği vardır ve kimlik ile önemsiz bir şekilde alınabilir. Diğer herhangi bir sorgu için, eşleme / azaltma işlevlerinin adlandırılmış kümeleri olan "görünümler" yazarsınız. Görünümler, anahtar / değer çiftlerinin bir listesi olarak bir sonuç kümesi döndürür.

İşin püf noktası, bir SQL veritabanını sorguladığınız anlamda veritabanını sorgulamamanızdır: Görünüm işlevlerini çalıştırmanın sonuçları bir dizinde saklanır ve yalnızca dizin sorgulanabilir. ("Her şeyi al", "anahtarı al" veya "anahtar aralığını al" gibi.)

SQL dünyasındaki en yakın benzetme, yalnızca saklı yordamları kullanarak DB'yi sorgulayabilmenizdir - desteklemek istediğiniz her sorgu önceden tanımlanmış olmalıdır.

Belgelerin tasarımı son derece esnektir. Yalnızca iki kısıt buldum:

  • Bir birleştirmeye karşılık gelen hiçbir şey olmadığından, ilgili verileri aynı belgede bir arada tutun.
  • Her belge güncellemesi bir yeniden endekslemeyi tetiklediğinden, belgeleri çok sık güncellenecek kadar büyük yapmayın (yıl için tüm şirket satışlarını aynı belgeye koymak gibi).

Ancak her şey görünümlerin tasarlanmasına bağlıdır.

Bulduğum alternatif tasarımlar, CouchDB ile herhangi bir SQL veritabanından daha büyük iş emirlerinin depolama seviyesinden çok sistem seviyesinde olduğunu buldum. Bazı verileriniz varsa ve bunları bir web sayfasına sunmak istiyorsanız, toplam sistemin karmaşıklığı en az% 50 oranında azaltılır:

  • DB tabloları tasarlamak yok (küçük sorun)
  • ODBC / JDBC ara katmanı yok, http üzerinden tüm sorgular ve işlemler (orta düzey sorun)
  • JSON'dan basit DB'den nesneye eşleme, SQL'de aynı olanla karşılaştırıldığında neredeyse önemsiz (önemli!)
  • Belgelerinizi AJAX kullanarak tarayıcı tarafından doğrudan alınacak şekilde tasarlayabileceğiniz ve HTML olarak görüntülenmeden önce biraz JavaScript parlatma ekleyebileceğiniz için, potansiyel olarak tüm uygulama sunucusunu atlayabilirsiniz. (KOCAMAN!!)

Normal web uygulamaları için, belge / JSON tabanlı DB'ler büyük bir kazançtır ve daha az esnek sorguların ve veri doğrulama için bazı ekstra kodların dezavantajları, ödenmesi gereken küçük bir bedel gibi görünmektedir.

İmkansız görünen herhangi bir şeye başınızı vurdunuz mu?

Henüz değil. Bir veritabanını sorgulamanın bir yolu olarak eşleme / küçültme alışılmadık bir şeydir ve SQL yazmaktan çok daha fazla düşünmeyi gerektirir. Oldukça az sayıda ilkel vardır, bu nedenle ihtiyacınız olan sonuçları elde etmek, öncelikle anahtarları nasıl belirleyeceğiniz konusunda yaratıcı olmaktır.

Sorguların aynı anda iki veya daha fazla belgeye bakamaması konusunda bir sınırlama vardır - hiçbir birleştirme veya diğer türden çoklu belge ilişkileri, ancak şimdiye kadar hiçbir şey aşılamaz olmamıştır.

Örnek bir sınırlama olarak, sayımlar ve toplamlar kolaydır, ancak ortalamalar bir CouchDB görünümü / sorgusu ile hesaplanamaz. Düzeltme: Toplamı döndür ve ayrı ayrı say ve istemcinin ortalamasını hesapla.

Boşluğu herhangi bir tasarım modeliyle doldurdunuz mu, örneğin birinden diğerine çevirmek için?

Bunun mümkün olduğundan emin değilim. Daha çok, işlevsel bir stil programını nesne yönelimli bir stile çevirmek gibi tam bir yeniden tasarım. Genel olarak, SQL tablolarından çok daha az belge türü ve her belgede daha fazla veri vardır.

Bunu düşünmenin bir yolu, ekler ve genel sorgular için SQL'inize bakmaktır: Örneğin, bir müşteri sipariş verdiğinde hangi tablolar ve sütunlar güncellenir? Ve aylık satış raporları için hangileri? Bu bilgi muhtemelen aynı belgede yer almalıdır.

Yani: Müşteri kimliğini ve ürün kimliklerini içeren ve sorguları basitleştirmek için gereken çoğaltılmış alanlara sahip bir Sipariş belgesi. Bir belgedeki herhangi bir şey kolayca sorgulanabilir, örneğin Sipariş ve Müşteri arasında çapraz referans gerektiren her şey müşteri tarafından yapılmalıdır. Dolayısıyla, bölgeye göre satış raporu istiyorsanız, muhtemelen siparişe bir bölge kodu eklemelisiniz.

Şu anda açık veri modelleri yapıyor musunuz (örneğin UML'de)?

Maalesef, belge DB'lerinden önce hiç UML de yapmadım :)

Ama hangi alanların hangi belgelere ait olduğunu ve ne tür değerler içerdiğini söyleyen bir çeşit modele ihtiyacınız var. Hem daha sonra kendi referansınız için hem de DB'yi kullanan herkesin kuralları bildiğinden emin olmak için. Örneğin, bir metin alanında bir tarih depolarsanız artık bir hata almadığınızdan ve herkes istediği herhangi bir alanı ekleyip kaldırabileceğinden, boşluğu almak için hem doğrulama koduna hem de kurallara ihtiyacınız vardır. Özellikle dış kaynaklarla çalışıyorsanız.

RDBMS'lerin sağladığı önemli ekstra hizmetlerden herhangi birini özlüyor musunuz?

Hayır! Ama benim geçmişim web uygulaması geliştiricisi, veri tabanlarıyla sadece yapmamız gereken ölçüde ilgileniyoruz :)

Eskiden çalıştığım bir şirket, birden çok tedarikçinin SQL veritabanlarında çalışmak üzere tasarlanmış bir ürün (web uygulaması) yaptı ve "ekstra hizmetler" DB'den DB'ye o kadar farklı ki her DB için ayrı ayrı uygulanmaları gerekiyordu. Bu nedenle, işlevselliği RDBMS'den çıkarmak bizim için daha az işti. Bu, tam metin aramaya kadar genişledi.

Yani vazgeçiyorsam, ilk etapta asla sahip olmadığım bir şey. Açıkçası, deneyiminiz farklı olabilir.


Bir uyarı: Şu anda üzerinde çalıştığım şey, finansal veriler, hisse senedi fiyatları ve benzerleri için bir web uygulaması. Bu, bir belge DB'si için çok iyi bir eşleşme, benim bakış açıma göre bir DB'nin tüm avantajlarından (kalıcılık ve sorgular) herhangi bir güçlük çekmeden yararlanıyorum.

Ancak bu veriler birbirinden oldukça bağımsızdır, karmaşık ilişkisel sorgular yoktur. En son teklifleri kayan yazıya göre alın, hisse senedi ve tarih aralığına göre fiyat teklifleri alın, şirket meta bilgilerini alın, hepsi bu. Gördüğüm başka bir örnek de bir blog uygulamasıydı ve bloglar da çok karmaşık veritabanı şemaları ile karakterize edilmiyor.

Söylemeye çalıştığım şey, tanıdığım belge DB'lerinin tüm başarılı uygulamalarının, ilk etapta çok fazla ilişkisi olmayan verilerle yapıldığıydı: Belgeler (Google aramasında olduğu gibi), blog gönderileri, haber makaleleri, finansal veriler .

Belge modeline göre SQL ile daha iyi eşleşen veri kümeleri olmasını bekliyorum, bu yüzden SQL'in hayatta kalacağını düşünüyorum.

Ancak, verileri depolamanın ve almanın basit bir yolunu arayan bizler için - ve çoğumuzdan şüpheleniyorum - belge veritabanları (CouchDB'de olduğu gibi) bir nimettir.


9
Çok kullanışlı. Özellikle "SQL esnek olmayan verilere ve esnek sorgulara sahiptir, belge DB'leri tam tersidir" ve birleştirmelerin olmaması.
j_random_hacker

2
+1, bu çok anlayışlıydı.
Mas

2
O kadar doğru ki, mümkünse birden fazla oy ekleyeceğim.
Octavian A. Damiean

Bu, 2014'te hala son derece yararlıydı, 2010'dan beri öğrendiklerinizi ekleyebilirseniz veya başka bir yerde sahip olabileceğiniz bilgilere bağlantı verebilirseniz harika olurdu.
Maggie

11

Bunu aklımın arkasındaki CouchDB ile yanıtlıyorum, ancak çoğunun diğer DB'ler için de doğru olacağını varsayıyorum. CouchDB'yi kullanmaya baktık, ancak sonunda veri erişimimiz önceden bilinmediği ve sorun ölçeklenebilirlik olmadığı için buna karşı karar verdik.

Daha güçlü:

  • Kavramsal düzeyde yeniden düşünmeyi gerektirir, bu yüzden sadece farklı olduğu için 'daha zordur'. Veri erişim modellerinizi önceden bilmeniz gerektiğinden, otomatik çeviri uygulanamaz. En azından erişim desenini eklemeniz gerekir.
  • Tutarlılık veritabanı tarafından ele alınmaz, ancak uygulamada ele alınmalıdır. Daha az garanti, daha karmaşık bir uygulama pahasına daha kolay geçiş, yük devretme ve daha iyi ölçeklenebilirlik anlamına gelir. Bir uygulama, çatışmalar ve tutarsızlıklarla başa çıkmak zorundadır.
  • Belgeler (veya anahtar / değer) arasındaki bağlantıların uygulama düzeyinde de ele alınması gerekir.
  • SQL tipi veritabanları çok daha olgun IDE'lere sahiptir. Pek çok destek kitaplığı elde edersiniz (bu kitaplıkların katmanlanması işleri SQL için gerekenden çok daha karmaşık hale getirse de).

Daha kolay:

  • Veri erişim modellerinizi biliyorsanız daha hızlı.
  • Bir uygulama programcısı olarak size herhangi bir vaatte bulunulmadığından veritabanı için Taşıma / Yük devretme daha kolaydır. Nihayetinde tutarlılık elde etmenize rağmen. Muhtemelen. En sonunda. Bazen.
  • Bir anahtar / değerin anlaşılması, tablodaki bir satırdan çok daha kolaydır. Tüm (ağaç) ilişkiler zaten içindedir ve tam nesneler tanınabilir.

Modelleme yaklaşık olarak aynı olmalıdır, ancak bir belgeye ne koyduğunuza dikkat etmeniz gerekir: UML, hem OO modellemesi hem de zaten iki farklı canavar olan DB modellemesi için de kullanılabilir.

C # / Silverlight ile güzel bir şekilde entegre edilmiş iyi bir açık OO veritabanı görmek isterdim. Sadece seçimi daha da zorlaştırmak için. :)


1

Düz dosyalar uzun zamandır gizemli ve herhangi bir boyuttaki veri kümesi için pratik değildir. Ancak, daha fazla belleğe sahip daha hızlı bilgisayarlar, bir dosyayı belleğe yüklemeyi ve en azından makul ölçüde küçük n ve yerel, tek kullanıcılı uygulamalar için gerçek zamanlı olarak sıralamayı mümkün kılar.

Örneğin, genellikle 10.000 kayıtlık bir dosyayı okuyabilir VE yarım saniyeden daha kısa bir sürede bir alanda sıralayabilirsiniz, bu da kabul edilebilir bir yanıt süresi.

Elbette, düz bir dosya yerine bir veritabanı kullanmanın nedenleri vardır - ilişkisel işlemler, veri bütünlüğü, çok kullanıcılı yeteneği, uzaktan erişim, daha büyük kapasite, standardizasyon vb., Ancak artan bilgisayar hızı ve bellek kapasitesi bellek içi manipülasyona neden olmuştur. bazı durumlarda daha pratik veriler.


1

Gerçek hayatta gördüğüm ilişkisel veritabanları, iddianızın aksine, pek de normalize edilemiyor. Tasarımcılar sorulduğunda bana bunun çoğunlukla performanstan kaynaklandığını söylüyor. RDBM'ler birleştirme konusunda iyi değildir, bu nedenle tablolar normalleştirme açısından çok geniş olma eğilimindedir. Nesneye yönelik veritabanları bu konuda çok daha iyi olma eğilimindedir.

RDBM'lerin sorun yaşadığı bir başka nokta da geçmişe / zamana bağlı anahtarları kullanmaktır.


3
Stephan - haklısınız, gerçek dünya sistemleri genellikle normalleştirme departmanında eksiktir. Ancak RDBM'lerin "katılmada iyi olmadığını" söylemek doğru değildir; Çoğu ticari ürün (Oracle, MS SQL Server, vb. gibi) son derece gelişmiş sorgu iyileştiricilerine sahiptir ve uygulama kodunda aynı işlemlerin yapılabileceğinden çok daha hızlı bir şekilde çok çeşitli farklı fiziksel birleştirme algoritmalarını gerçekleştirebilir. (MySQL, anladığım kadarıyla bunun bir istisnasıdır). Tecrübelerime göre, erken denormalizasyon, diğer erken optimizasyon gibi, genellikle zayıf geliştiricilerin bir işaretidir.
Ian Varley

2
Bu düşünceye devam edersek: zayıf birleştirme, zayıf indeksleme ve istatistiklerin sonucudur. Optimize edicinin çalışacak hiçbir şeyi yoksa veya sahip olduğu bilgiler güncel değilse, kötü seçimler yapacaktır. Birçoğu bunu "zayıf katılım" ile karıştırıyor. Modern RDBM sistemleri, indeksleme ve istatistikleri ayarlarken beyninizi kullanma ihtiyacını maskeleyen kendi kendine ayarlamaya sahiptir . Ayrıca, insanlar mantıksal şemayı (beşinci normal biçim) ve fiziksel şemayı (sıklıkla üçüncü normale denormalize edilir) karıştırırlar. Sırf gördüğünüz DB'nin "geniş" olması, mantıksal olarak kötü tasarlandığı anlamına gelmez.
Godeke
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.