Kapan Anda harus menggunakan basis data dokumen vs relasional vs grafik? [Tutup]

29

Untuk keperluan diskusi, mari pertimbangkan skenario FourSquare.

Skenario

Entitas:

  • Pengguna
  • Tempat

Hubungan:

  • Checkins: pengguna <-> tempat, banyak ke banyak
  • Teman: pengguna <-> pengguna, banyak ke banyak

Desain Basis Data

Ini kemungkinan besar akan memiliki kesalahan, harap tunjukkan.

RDBMS

Tabel:

  • Pengguna
  • Tempat
  • Checkins (persimpangan)
  • Teman (persimpangan)

Pro:

  • CAP: konsistensi, ketersediaan

Cons:

  • CAP: toleransi partisi, alias sharding
  • skema = struktur tidak fleksibel
  • replikasi yang buruk?

Grafik

Benda:

  • Pengguna
  • Tempat

Tepi:

  • Teman: Pengguna <-> Pengguna
  • Checkins: Pengguna -> Places
    • mengandung cap waktu

Pro:

  • CAP: konsistensi, ketersediaan?
  • schemaless, objek dan ujungnya mudah berubah
  • kueri grafik lintasan, misalnya:
    • pengelompokan
      • menemukan kelompok teman
      • menemukan restoran yang disukai oleh orang yang sama
    • ada pertanyaan umum / berguna lainnya?

Cons:

  • CAP: toleransi partisi?

Dokumen / Objek

3 database terpisah?

  • Pengguna
    • Daftar teman
  • Checkins
    • cap waktu
    • pengguna
    • tempat
  • Tempat

Pro:

  • CAP: ketersediaan, toleransi partisi
  • schemaless, benda yang mudah berubah

Cons:

  • CAP: konsistensi

Pertanyaan

Sebagai catatan, mereka akhirnya menggunakan MongoDB. Selain semua tanda tanya di atas:

  1. Saya tidak yakin bagaimana menerapkan basis data dokumen.
  2. Bagaimana database dokumen mendapatkan toleransi partisi?
  3. Untuk mendapatkan checkin pengguna tunggal, saya menganggap operasi akan menguraikan semua checkin dan memfilter metadata untuk nama pengguna (peta + filter). Kinerja parsing 1.000.000+ dokumen untuk setiap pengguna akan sangat buruk. Saya menganggap ini bukan perilaku yang benar?
  4. Apa pro / kontra lain yang ada?
wting
sumber
(1) Anda perlu menjabarkan hubungan antara 2 tabel dalam jangka waktu bisnis. Ini karena mungkin ada hubungan paralel. Misalnya, pengguna <--> pengguna tidak menyiratkan hubungan 1 mm. Ini bisa berarti lebih dari 1. Misalnya: Pengguna menyukai pengguna lain dan pengguna membenci pengguna lain. Ini adalah 2 hubungan. (2) Ini akan membantu jika Anda dapat meringkas apa yang Anda inginkan 'tepatnya'.
NoChance
@EmmadKareem: (1) Saya tidak ingin menyulitkan skenario. Satu-satunya pengguna <-> hubungan pengguna yang saya minati adalah persahabatan timbal balik, yang merupakan koneksi banyak ke banyak. (2) Saya ingin 4 pertanyaan yang tercantum di bagian bawah posting dijawab.
mulai

Jawaban:

13

Pertanyaan Anda bisa menjadi topik kuliah selama satu semester. Anda perlu memecahnya menjadi potongan-potongan yang bisa dikelola. Karena itu, saya hanya akan membuang beberapa jawaban parsial.

Salah satu hal pertama yang harus dilihat dalam menentukan jenis database yang akan digunakan adalah jenis pertanyaan apa yang akan Anda jalankan dan apakah Anda akan mengetahui semuanya sebelum membuat database. Database SQL memiliki keunggulan kueri yang kuat dan fleksibel di semua data dalam database. Database grafik memiliki kemampuan permintaan yang sangat khusus yang membuatnya terbaik untuk data grafik dan sangat buruk untuk data non-grafik (meskipun database grafik dapat menjadi komponen dalam database SQL). Basis data NoSQL jauh lebih terbatas dalam kemampuannya untuk mengambil dan mengoperasikan data.

Berikutnya adalah bagaimana perasaan Anda tentang properti ACID: Atomicity, Consistency, Isolasi, dan Durability. Basis data SQL memberikan jaminan kuat tentang semua 4. Basis data NoSQL biasanya tidak menjanjikan semua 4, dan cara mereka berangkat adalah di antara perbedaan utama yang membedakan berbagai implementasi basis data NoSQL. Di sisi lain, tidak mungkin untuk menjamin Konsistensi dan Ketersediaan dalam menghadapi Partisi (lihat Thor Brewer's thorem ), jadi tidak ada database SQL yang akan dilakukan jika Anda bersikeras Ketersediaan penuh dalam menghadapi Partisi. Secara pribadi, saya sangat peduli tentang Daya tahan data dalam database, karena saya biasanya bekerja dengan data di mana bahkan kehilangan 0,0001% data tidak dapat diterima, dan kumpulan data cukup kecil sehingga saya tidak perlu khawatir tentang partisi, jadi saya sangat mendukung database SQL.

Pertimbangan lain yang sangat praktis adalah kualitas kode server, ketersediaan administrator database dan programer, kualitas dukungan yang tersedia untuk masalah yang muncul, kualitas dan ketersediaan pustaka antarmuka untuk menghubungkan aplikasi Anda ke database, dan sebagainya. MySQL telah ada selama hampir 2 dekade, memiliki sebagian besar bug bekerja, sangat banyak digunakan dan memiliki dukungan yang baik dan ketersediaan personel yang besar, dan kemungkinan akan didukung selama 10 tahun ke depan. Anda tidak dapat mengatakan hal-hal itu tentang Riak.

Perhatikan bahwa walaupun Google secara praktis menemukan basis data NoSQL sehingga mereka dapat menyimpan versi yang di-cache dan diindeks dari seluruh web, mereka masih menggunakan MySQL untuk beberapa hal.

Pro tua
sumber
1
Saya sadar saya banyak bertanya, jadi jawaban umum akan baik-baik saja. Pertanyaan intinya adalah: (1) Mengapa menggunakan basis data dokumen untuk sharding yang hebat ketika Anda dapat mengimplementasikan sharding secara horizontal dalam logika menggunakan range sharding? (2) Bagaimana Anda mendesain database dokumen untuk digunakan dalam skenario FourSquare dan bagaimana ia menangani beberapa kegunaan umum (tunjukkan checkin pengguna, tunjukkan teman pengguna, tunjukkan tempat pengguna saat ini check in)?
mulai
1
@ William, ada lusinan artikel yang menjawab pertanyaan Anda yang mudah diakses melalui Google. Bahkan beberapa di Stack Overflow saja. Kerjakan pekerjaan rumah Anda.
Old Pro