Bir belgeyi vs ilişkisel vs grafik veritabanı ne zaman kullanmalısınız? [kapalı]


29

Tartışma amaçları için bir FourSquare senaryosu düşünelim.

senaryo

varlık sayısı:

  • Kullanıcılar
  • Yerler

İlişkiler:

  • Checkin'ler: kullanıcılar <-> yerler, çoktan çoğa yerler
  • Arkadaşlar: Kullanıcılar <-> Kullanıcılar, Çoktan Çok

Veri tabanı tasarımı

Bunların büyük olasılıkla hataları olacak, lütfen belirtin.

RDBMS

Tablolar:

  • Kullanıcılar
  • Yerler
  • Checkin (kavşak)
  • Arkadaşlar (kavşak)

Artıları:

  • CAP: tutarlılık, kullanılabilirlik

Eksileri:

  • CAP: bölüm toleransı, aka sharding
  • şemalar = esnek yapı
  • zayıf çoğaltma?

grafik

Nesneler:

  • Kullanıcılar
  • Yerler

kenarlar:

  • Arkadaşlar: Kullanıcı <-> Kullanıcı
  • Checkinleri: Kullanıcı -> Yerler
    • zaman damgası içeriyor

Artıları:

  • CAP: tutarlılık, kullanılabilirlik?
  • şema, kolayca değiştirilebilir nesneler ve kenarlar
  • grafik geçiş sorguları, örneğin:
    • kümeleme
      • arkadaş gruplarını bulma
      • benzer insanlar tarafından sevilen restoranları bulma
    • başka herhangi bir ortak / faydalı sorgu?

Eksileri:

  • CAP: bölüm toleransı?

Belge / Nesne

3 ayrı veritabanı?

  • Kullanıcılar
    • arkadaş listesi
  • Checkin'leriniz
    • Zaman damgası
    • kullanıcı
    • yer
  • Yerler

Artıları:

  • CAP: kullanılabilirlik, bölüm toleransı
  • şema, kolayca değiştirilebilir nesneler

Eksileri:

  • CAP: tutarlılık

Sorular

Kayıt için, MongoDB kullanarak sona erdiler. Yukarıdaki tüm bu soru işaretlerine ek olarak:

  1. Belge veritabanının nasıl uygulanacağından emin değilim.
  2. Belge veritabanları bölüm toleransını nasıl kazanır?
  3. Tek bir kullanıcının check-in'lerini almak için, işlemin tüm checkin'leri ayrıştırıp kullanıcı adı için meta verileri (map + filter) filtreleyeceğini varsayıyorum. Her kullanıcı için 1.000.000'den fazla belgeyi ayrıştırma performansı çok düşük olacaktır. Bunun doğru davranış olmadığını varsayıyorum?
  4. Başka hangi avantajlar var?

(1) İşletme dönemindeki 2 tablo arasındaki gerçekliği dile getirmeniz gerekir. Bunun nedeni paralel ilişkiler olabileceğidir. Örneğin, kullanıcılar <--> kullanıcıları 1 mm ilişki anlamına gelmez. 1'den fazla anlamına gelebilir. Örneğin: Bir kullanıcı başka bir kullanıcıyı sever ve kullanıcı başka bir kullanıcıdan nefret eder. Bunlar 2 ilişki. (2) İstediğiniz şeyi 'tam olarak' özetleyebilmeniz yardımcı olacaktır.
NoChance

@EmmadKareem: (1) Senaryoyu karmaşıklaştırmak istemiyorum. İlgilendiğim tek kullanıcı <-> kullanıcı ilişkisi, çoktan çoğa bağlantı sağlayan ortak bir arkadaşlıktır. (2) Yazının altında listelenen 4 soruyu cevaplamanızı istiyorum.
12'de

Yanıtlar:


13

Sorunuz bir sömestr kolej kursunun konusu olabilir. Yönetilebilir parçalara ayırmanız gerekir. Bu yüzden kısmi cevaplar vereceğim.

Hangi tür veritabanının kullanılacağına karar vermede ilk göze çarpan şeylerden biri, ne tür sorguları çalıştıracağınız ve hepsini veritabanı oluşturmadan önce bilip bilmeyeceğinizdir. SQL veritabanları, veritabanındaki tüm verilerde güçlü ve esnek sorguların avantajına sahiptir. Grafik veritabanları, onları grafik verileri için en iyi ve grafik olmayan veriler için gerçekten kötü yapan çok özel bir sorgulama özelliğine sahiptir (grafik veritabanları SQL veritabanlarındaki bileşenler olabilir). NoSQL veritabanları, verileri alma ve kullanma yetenekleri bakımından çok daha sınırlıdır.

Bir sonraki ACID özellikleri hakkında nasıl hissedeceğiniz: Atomiklik, Tutarlılık, İzolasyon ve Dayanıklılık. SQL veritabanları 4 için güçlü garantiler sunar. NoSQL veritabanları tipik olarak 4'ü vaat etmez ve yola çıktıkları yollar, çeşitli NoSQL veritabanı uygulamalarını farklılaştıran temel farklar arasındadır. Öte yandan, bir Bölüm karşısında Tutarlılık ve Kullanılabilirlik garanti etmek mümkün değildir (bkz. Brewer'in CAP iadesi ), bu nedenle, bir Bölüm karşısında tam Kullanılabilirlik konusunda ısrar ederseniz, SQL veritabanı yapılmayacaktır. Şahsen, genellikle% 0.0001 veri kaybının kabul edilemez olduğu ve genellikle veri kümeleri için endişelenmeme gerek kalmayacak kadar küçük olduğu verilerle çalıştığım için veri tabanındaki verilerin dayanıklılığı hakkında çok şey umursuyorum. yoğun SQL veritabanları lehine.

Çok pratik bir diğer husus ise sunucu kodunun kalitesi, veritabanı yöneticilerinin ve programcılarının mevcudiyeti, ortaya çıkan sorunlar için mevcut desteğin kalitesi, uygulamanızı veritabanına bağlamak için arayüz kütüphanelerinin kalitesi ve mevcudiyetidir. MySQL neredeyse 2 yıl civarında olmuştur, böceklerin büyük çoğunluğu çalışmıştır, çok yaygın bir şekilde kullanılmaktadır ve bu nedenle hem büyük destek hem de personelin müsaitliğine sahiptir ve gelecek 10 yıl boyunca desteklenmesi muhtemeldir. Riak hakkında hiçbir şey söyleyemezsin.

Google'ın NoSQL veritabanlarını pratik olarak icat etmesine rağmen, tüm dünya çapındaki ağın önbelleğe alınmış ve dizine alınmış bir sürümünü depolayabilmelerine rağmen, hala bazı şeyler için MySQL kullandıklarını unutmayın.


1
Çok şey sorduğumu farkettim, bu yüzden genel bir cevap iyi olurdu. Temel sorular şunlardır: (1) Mantıksal aralıkta sharping kullanarak mantıksal olarak sharding uygulayabiliyorsanız, neden varsayılan büyük gölgeleme için belge veritabanını kullanıyorsunuz? (2) Bir FourSquare senaryosunda kullanmak için bir döküman veri tabanını nasıl tasarlarsınız ve bazı yaygın kullanımları nasıl ele alır (kullanıcının checkin'lerini göster, kullanıcının arkadaşlarını göster, yerdeki kullanıcıların girişini göster)?
12'de 2

1
@William, Google üzerinden kolayca erişilebilen sorularınızı yanıtlayan düzinelerce makale var. Yalnızca Yığın Taşması üzerine bile birkaç kişi . Ödevini yap.
Eski Pro
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.