Adakah yang bisa menjelaskan kepada saya keuntungan dan kerugian untuk database relasi seperti MySQL dibandingkan dengan database grafik seperti Neo4j?
Dalam SQL Anda memiliki banyak tabel dengan berbagai id yang menghubungkannya. Kemudian Anda harus bergabung untuk menghubungkan tabel. Dari perspektif seorang pemula, mengapa Anda mendesain database untuk meminta gabungan daripada memiliki koneksi eksplisit sebagai edge dari awal seperti dengan database grafik. Secara konseptual tidak akan masuk akal bagi seorang pemula. Mungkinkah ada alasan yang sangat teknis tetapi non-konseptual untuk ini?
sql
relational-database
graph-databases
pengguna782220
sumber
sumber
Jawaban:
Sebenarnya ada alasan konseptual di balik kedua gaya tersebut. Wikipedia tentang model relasional dan database grafik memberikan gambaran yang bagus tentang ini.
Perbedaan utama adalah bahwa dalam database grafik, relasinya disimpan pada level record individual, sedangkan dalam database relasional, strukturnya ditentukan pada level yang lebih tinggi (definisi tabel).
Ini memiliki konsekuensi penting:
Menyimpan semua hubungan di tingkat catatan individu hanya masuk akal jika akan ada banyak variasi dalam hubungan; jika tidak, Anda hanya menduplikasi hal yang sama berulang kali. Ini berarti bahwa basis data grafik sangat cocok untuk struktur yang tidak teratur dan kompleks. Namun di dunia nyata, kebanyakan database memerlukan struktur yang teratur dan relatif sederhana. Inilah mengapa database relasional mendominasi.
sumber
Perbedaan utama antara grafik dan database relasional adalah bahwa database relasional bekerja dengan himpunan sedangkan database grafik bekerja dengan jalur.
Ini memanifestasikan dirinya dengan cara yang tidak terduga dan tidak membantu bagi pengguna RDBMS. Misalnya ketika mencoba meniru operasi jalur (misalnya teman dari teman) dengan bergabung secara rekursif dalam database relasional, latensi kueri tumbuh secara tak terduga dan masif seperti halnya penggunaan memori, belum lagi menyiksa SQL untuk mengekspresikan jenis operasi tersebut. Lebih banyak data berarti lebih lambat dalam database berbasis set, bahkan jika Anda dapat menunda kesulitan melalui pengindeksan yang bijaksana.
Seperti yang diisyaratkan Dan1111, sebagian besar database grafik tidak mengalami rasa sakit gabungan seperti ini karena mereka mengekspresikan hubungan pada tingkat fundamental. Artinya, hubungan secara fisik ada pada disk dan diberi nama, diarahkan, dan dapat didekorasi sendiri dengan properti (ini disebut model grafik properti, lihat: https://github.com/tinkerpop/blueprints/wiki/Property-Graph -Model ). Ini berarti jika Anda memilih untuk, Anda dapat melihat hubungan pada disk dan melihat bagaimana mereka "menggabungkan" entitas. Oleh karena itu, hubungan adalah entitas kelas satu dalam database grafik dan secara semantik jauh lebih kuat daripada hubungan tersirat yang direifikasi pada waktu proses di penyimpanan relasional.
Jadi mengapa Anda harus peduli? Karena dua alasan:
MATCH (me)-[:FRIEND]->()-[:FRIEND]->(foaf) RETURN foaf
.sumber
Dan1111 telah memberikan jawaban yang ditandai sebagai benar. Beberapa poin tambahan perlu diperhatikan secara sepintas.
Pertama, di hampir setiap implementasi database grafik, record "disematkan" karena ada sejumlah penunjuk yang tidak diketahui yang menunjuk ke record di lokasinya saat ini. Artinya, rekaman tidak dapat diacak ke lokasi baru tanpa meninggalkan alamat penerusan di lokasi lama atau memecahkan sejumlah petunjuk yang tidak diketahui.
Secara teoritis, seseorang dapat mengocok semua catatan sekaligus dan mencari cara untuk menemukan dan memperbaiki semua petunjuk. Dalam praktiknya, ini adalah operasi yang bisa memakan waktu berminggu-minggu pada basis data grafik besar, selama waktu itu basis data harus tidak mengudara. Itu tidak mungkin.
Sebaliknya, dalam database relasional, record dapat di-reshuffle dalam skala yang cukup besar, dan satu-satunya hal yang harus dilakukan adalah membangun kembali indeks yang terpengaruh. Ini adalah operasi yang cukup besar, tetapi tidak sebesar yang setara untuk database grafik.
Hal kedua yang perlu diperhatikan adalah bahwa world wide web dapat dilihat sebagai database grafik raksasa. Halaman web berisi hyperlink, dan referensi hyperlink, antara lain, halaman web lainnya. Referensinya adalah melalui URL, yang berfungsi seperti pointer.
Saat halaman web dipindahkan ke URL yang berbeda tanpa meninggalkan alamat penerusan di URL lama, sejumlah hyperlink yang tidak diketahui akan rusak. Link yang rusak ini kemudian menimbulkan pesan "Error 404: halaman tidak ditemukan" yang mengganggu kesenangan banyak peselancar.
sumber
Dengan database relasional kita dapat membuat model dan query grafik dengan menggunakan kunci asing dan self-joins. Hanya karena RDBMS mengandung kata relasional tidak berarti bahwa mereka pandai menangani hubungan. Kata relasional dalam RDBMS berasal dari aljabar relasional dan bukan dari hubungan. Dalam RDBMS, hubungan itu sendiri tidak ada sebagai objek dalam dirinya sendiri. Ini perlu direpresentasikan secara eksplisit sebagai kunci asing atau secara implisit sebagai nilai dalam tabel tautan (saat menggunakan pendekatan pemodelan umum / universal). Tautan antar kumpulan data disimpan dalam data itu sendiri.
Semakin kita meningkatkan kedalaman pencarian dalam database relasional, semakin banyak self-join yang perlu kita lakukan dan semakin banyak performa query kita yang menderita. Semakin dalam kita masuk dalam hierarki kita, semakin banyak tabel yang perlu kita gabungkan dan semakin lambat kueri kita. Secara matematis biaya tumbuh secara eksponensial dalam database relasional. Dengan kata lain, semakin kompleks kueri dan hubungan kita, semakin kita mendapatkan keuntungan dari grafik versus database relasional. Kami tidak memiliki masalah kinerja dalam database grafik saat menavigasi grafik. Ini karena database grafik menyimpan hubungan sebagai objek terpisah. Namun, kinerja baca yang unggul menyebabkan penulisan yang lebih lambat.
Dalam situasi tertentu, lebih mudah mengubah model data dalam database grafik daripada di RDBMS, misalnya dalam RDBMS jika saya mengubah hubungan tabel dari 1: n ke m: n Saya perlu menerapkan DDL dengan potensi downtime.
Di sisi lain, RDBMS memiliki keunggulan di area lain, misalnya menggabungkan data atau melakukan kontrol versi timestamped pada data.
Saya membahas beberapa pro dan kontra lainnya dalam posting blog saya tentang database grafik untuk data warehousing
sumber
Sementara model relasional dapat dengan mudah merepresentasikan data yang terdapat dalam model grafik, kami menghadapi dua masalah signifikan dalam praktiknya:
Referensi: Database Generasi Berikutnya
sumber
Database grafik patut diselidiki untuk kasus penggunaan yang mereka kuasai, tetapi saya punya beberapa alasan untuk mempertanyakan beberapa pernyataan dalam tanggapan di atas. Khususnya:
Database relasional jauh lebih cepat ketika beroperasi pada sejumlah besar record (poin pertama dan1111)
Database grafik jauh lebih cepat daripada database relasional untuk data yang terhubung - kekuatan model yang mendasarinya. Konsekuensi dari ini adalah bahwa latensi kueri dalam database grafik sebanding dengan seberapa banyak grafik yang Anda pilih untuk dijelajahi dalam kueri, dan tidak sebanding dengan jumlah data yang disimpan, sehingga meredakan bom gabungan. (Poin pertama Jim Webber)
Dengan kata lain, semakin kompleks kueri dan hubungan kita, semakin kita mendapatkan keuntungan dari grafik versus database relasional. (Paragraf kedua Uli Bethke)
Meskipun pernyataan ini mungkin bermanfaat, saya belum menemukan cara untuk menyesuaikan kasus penggunaan khusus saya dengannya. Referensi: Database Grafik atau Database Relasional Ekstensi Tabel Umum: Membandingkan kinerja kueri grafik asiklik
sumber
Database Relasional jauh lebih efisien dalam menyimpan data tabel. Terlepas dari kata "relasional" dalam namanya, database relasional jauh kurang efektif dalam menyimpan atau mengekspresikan hubungan antara elemen data yang disimpan. Istilah 'relasional' dalam database relasional lebih berkaitan dengan kolom terkait di dalam tabel, tidak terkait informasi dalam tabel yang berbeda. Hubungan antar kolom ada untuk mendukung operasi set. Jadi ketika Database tumbuh dalam jutaan atau milyaran record, itu menjadi sangat lambat untuk mengambil data dari database relasional.
Tidak seperti database relasional, database grafik disusun seluruhnya di sekitar hubungan data. Database grafik memperlakukan hubungan bukan sebagai struktur skema tetapi sebagai data, seperti nilai lainnya. Sangat cepat untuk mengambil data dari database grafik. Dari sudut pandang database relasional, Anda dapat menganggap ini sebagai GABUNG yang terwujud sebelumnya pada saat penyisipan alih-alih menghitungnya untuk setiap kueri. Karena data terstruktur seluruhnya di sekitar hubungan data, kinerja kueri waktu nyata dapat dicapai tidak peduli seberapa besar atau terhubungnya kumpulan data tersebut. Database grafik membutuhkan lebih banyak ruang penyimpanan dibandingkan dengan database relasional.
sumber