NoSQL vs Setup Drupal SQL Lainnya

14

Apa keuntungan menjalankan NoSQL (ex MongoDB) dari MySQL, PostGRE SQL atau MSSQL di Drupal? Apakah keuntungan diperoleh dari hanya menggunakan penyimpanan atau apakah beberapa konfigurasi Drupal perlu diubah?

Kevin
sumber
Ini adalah pertanyaan yang Károly Négyesi akan memberikan jawaban "berwibawa". Dia pasti tahu keuntungan menggunakan MongoDB dengan Drupal.
kiamlaluno
Baca pikiran saya .. sangat tertarik dengan pilihan lain jika ada manfaat yang substansial, dan tentu saja pro datang dengan kontra.
Kevin

Jawaban:

13

MongoDB dapat digunakan untuk menyimpan sebagian besar atau semua entitas Anda ke dalam penyimpanan yang cepat dan berorientasi dokumen. Jenis penyimpanan ini jauh lebih baik daripada penyimpanan berbasis SQL standar yang kami miliki di inti Drupal (yang didasarkan pada skema "satu tabel per bidang").

Dalam keadaan Drupal 7 saat ini, Anda akan memiliki:

  • Tabel dasar entitas yang disimpan di SQL (mis. Tabel pengguna, tabel simpul, dll.)
  • Semua bidang disimpan dalam SQL
  • Properti entitas dari tabel dasar mereka digandakan dalam MongoDB

Ini memungkinkan pencarian cepat pada entitas di MongoDB, dan kemampuan untuk menambahkan indeks kompleks yang tidak didukung oleh basis data SQL OpenSource (termasuk indeks lintas tabel). Pada saat yang sama, Anda tidak kehilangan interoperabilitas karena tabel dasar entitas masih disimpan dalam SQL dan dengan demikian dapat digabung dengan modul yang masih SQL-saja (seperti Flag).

Jenis kueri cepat ini tersedia berkat mekanisme EntityFieldQuery, cara untuk membangun kueri pada entitas, properti mereka, dan bidangnya secara abstrak. Implementasi default di core menerjemahkan query-query itu ke SQL, tetapi modul MongoDB memiliki implementasi fitur lengkap yang dapat memenuhi permintaan-permintaan dari MongoDB secara langsung.

Berkat backend EntityFieldQuery untuk Views , Anda dapat dengan mudah memanfaatkan kekuatan ini, dengan menggunakan alat yang Anda gunakan. Satu-satunya downside adalah bahwa hubungan tidak didukung (tetapi dalam praktiknya Anda jarang membutuhkannya - dan ini dapat diselesaikan dengan mendorong data tambahan ke objek entitas dan menambahkan mengeksposnya sebagai properti tambahan entitas).

Singkatnya, segera setelah kinerja kueri adalah masalah pada proyek Anda, yang terjadi segera setelah Anda memiliki dataset yang signifikan (katakanlah mulai dari sepersepuluh dari ribuan entitas pada jenis entitas tertentu), MongoDB adalah keuntungan bersih untuk kekurangan sangat sedikit. Sangat dianjurkan.

Damien Tournoud
sumber
Damien Tournoud: Jika Anda mengalami masalah kinerja hanya dengan sepersepuluh dari ribuan entri, maka mungkin ada masalah yang mendasari (konfigurasi DBMS, kueri yang ditulis dengan buruk, bisa berupa apa saja). Jika skema SQL yang mendasari cukup baik, Anda tidak perlu khawatir sebelum satu juta entri pada satu tabel (tetapi bidang dapat tumbuh cepat jika Anda mempertimbangkan revisi dan bidang multi-nilai mungkin).
Pierre
Maksud saya tepatnya: skema kami dinormalisasi, dan akibatnya memiliki kinerja permintaan yang sangat buruk. Untuk meningkatkan kinerja kueri, Anda perlu mendenormalisasi skema. Keuntungan utama menggunakan MongoDB dalam kasus kami adalah bahwa itu adalah semacam "mesin denormalisasi otomatis".
Damien Tournoud
Dan tentu saja, MongoDB sangat bagus di sini karena itu adalah database berorientasi dokumen. Menyimpan dokumen kompleks seperti entitas dalam penyimpanan SQL benar-benar bodoh. Ini adalah implementasi default kami, tetapi itu tidak berarti Anda harus menggunakannya :)
Damien Tournoud
@Pierre: Damien berbicara tentang beberapa ribu entitas , yang bisa menjadi hal yang sangat berbeda dari baris tabel. Misalnya, Anda bisa memiliki 10 bidang atau lebih pada entitas itu, maka Anda memiliki 10 tabel tambahan yang perlu ditanyakan dengan kueri terpisah setiap kali entitas tersebut dimuat. Dan MongoDB dapat mengganti tabel tambahan ini, bukan tabel basis entitas.
Berdir
2
Tidak ada modul yang mengharapkan bidang berada di MySQL. Satu-satunya cara untuk menanyakan bidang pada Drupal 7 adalah EntityFieldQuery. Buka bug di modul jika ia menanyakan tabel bidang secara langsung. Saya tidak tahu modul-modul itu saat ini.
Damien Tournoud
7

MongoDB dan sejenisnya dirancang untuk menyimpan data terstruktur (hierarkis) dengan cara yang relatif fleksibel.

Misalnya Drupal 7, saat menggunakan field_sql_storage, setiap bidang mendapatkan tabelnya sendiri. Ketika Anda melampirkan 10 bidang ke jenis konten, Anda berakhir dengan 10 tabel di database Anda. Saat Anda memuat simpul itu, field_sql_storageakan menjalankan kueri per bidang dan per simpul (atau beberapa simpul, saat menggunakan node_load_multiple).

Saat Anda menggunakan mongodb_field_storage , Anda dapat menyimpan semua bidang dari sebuah simpul dalam satu dokumen dan mendapatkan dengan satu permintaan.

Anda juga dapat menyimpan hal-hal lain seperti anjing penjaga, sesi, cache, blok di MongoDB .

Namun Anda masih membutuhkan MySQL, MongoDB tidak menggantinya (hanya untuk bagian tertentu).

Keuntungan lain adalah bahwa dengan MongoDB lebih mudah untuk skala, Anda dapat menambahkan banyak server ke cluster berbagi data di antara mereka.

Berdir
sumber
Hai Berdir! Apakah Anda tahu jika saya menjatuhkan MongoDB di proyect yang ada untuk menguji kinerja, apakah saya akan mengaktifkan & menonaktifkan modul tanpa konsekuensi? Saya ingin mencoba mongo, tetapi bagaimana jika itu tidak berhasil atau apa? Apakah aman untuk mencoba? (Saya tahu Anda tidak dapat menjaminnya tetapi saya ingin tahu apa yang terjadi dalam kebanyakan kasus)
Beto Aveiga
1
Yah, untuk permulaan, Anda tidak bisa begitu saja memasukkannya. Setiap bidang telah mengonfigurasi penyimpanan backend yang digunakannya, Anda harus mengubah / membuat ulang bidang Anda, menciptakan kembali pandangan Anda (karena mereka perlu menggunakan backend efq_views ), mungkin kueri Anda sendiri jika Anda menulis kueri langsung terhadap tabel data bidang. Mungkin akan lebih mudah untuk membuat kembali struktur yang sama di instalasi baru untuk perbandingan awal.
Berdir
Berdir terima kasih! Saya mencoba MongoDB beberapa hari yang lalu tetapi tidak ada peningkatan kinerja yang nyata, tetapi saya juga tidak menyadari hal-hal / perubahan yang Anda sampaikan sekarang. Saya pikir "MongoDB harus membuat perbedaan di situs yang lebih besar". Saya akan mencoba MongoDB lagi.
Beto Aveiga
5

Pro datang dengan kontra.

Drupal secara keseluruhan tidak dapat dialihkan ke MongoDb, jadi Anda harus mendukung dua database dan memastikan keduanya bekerja dengan baik.

Banyak modul tidak akan dapat bekerja dengan mongodb sehingga Anda akan kehilangan interoperabilitas.

Kecuali jika Anda memiliki kebutuhan mendesak (seperti bagian dari sistem Anda tidak mengatasi jumlah permintaan / atau jumlah data) saya tidak akan beralih. Dan bahkan ketika Anda mulai mendekati batas melihat melempar perangkat keras pada masalah atau penyetelan sebelum beralih.

Saya pikir saya telah menjawab ini sebelumnya, hampir ada duplikat pada SO

Jeremy French
sumber