Saya mencoba mencari tahu padanan kunci asing dan indeks di database NoSQL KVP atau Dokumen. Karena tidak ada tabel penting (untuk menambahkan kunci yang menandai hubungan antara dua objek) saya benar-benar bingung tentang bagaimana Anda bisa mengambil data dengan cara yang akan berguna untuk halaman web normal.
Katakanlah saya memiliki pengguna, dan pengguna ini meninggalkan banyak komentar di seluruh situs. Satu-satunya cara yang dapat saya pikirkan untuk melacak komentar pengguna itu adalah dengan
- Sematkan mereka di objek pengguna (yang tampaknya sangat tidak berguna)
- Buat dan pertahankan
user_id:comments
nilai yang berisi daftar kunci setiap komentar [komentar: 34, komentar: 197, dll ...] sehingga saya dapat mengambilnya sesuai kebutuhan.
Namun, mengambil contoh kedua Anda akan segera menemui jalan buntu ketika Anda menggunakannya untuk melacak hal-hal lain seperti kunci yang disebut "active_comments" yang mungkin berisi 30 juta id di dalamnya sehingga memerlukan biaya TON untuk menanyakan setiap halaman hanya untuk mengetahui beberapa yang terbaru komentar aktif. Ini juga akan sangat rentan terhadap kondisi balapan karena banyak halaman mungkin mencoba memperbaruinya pada saat yang bersamaan.
Bagaimana cara melacak relasi seperti berikut dalam database NoSQL?
- Semua komentar pengguna
- Semua komentar aktif
- Semua posting diberi tag dengan [kata kunci]
- Semua siswa di klub - atau semua klub tempat siswa berada
Atau apakah saya memikirkan hal ini dengan tidak benar?
sumber
Jawaban:
Semua jawaban tentang cara menyimpan asosiasi banyak ke banyak dengan "cara NoSQL" direduksi menjadi hal yang sama: menyimpan data secara berlebihan.
Di NoSQL, Anda tidak mendesain database Anda berdasarkan hubungan antara entitas data. Anda mendesain database Anda berdasarkan kueri yang akan Anda jalankan terhadapnya. Gunakan kriteria yang sama yang akan Anda gunakan untuk mendenormalisasi database relasional: jika lebih penting bagi data untuk memiliki kohesi (pikirkan nilai dalam daftar yang dipisahkan koma dan bukan tabel yang dinormalisasi), lakukan seperti itu.
Tapi ini pasti mengoptimalkan satu jenis kueri (misalnya komentar oleh pengguna mana pun untuk artikel tertentu) dengan mengorbankan jenis kueri lain (komentar untuk artikel apa pun oleh pengguna tertentu). Jika aplikasi Anda memiliki kebutuhan agar kedua jenis kueri tersebut dioptimalkan secara sama, Anda tidak boleh melakukan denormalisasi. Dan juga, Anda tidak boleh menggunakan solusi NoSQL jika Anda perlu menggunakan data secara relasional.
Terdapat risiko denormalisasi dan redundansi bahwa kumpulan data yang berlebihan akan tidak sinkron satu sama lain. Ini disebut anomali . Ketika Anda menggunakan database relasional yang dinormalisasi, RDBMS dapat mencegah anomali. Dalam database yang didenormalisasi atau di NoSQL, Anda bertanggung jawab untuk menulis kode aplikasi untuk mencegah anomali.
Orang mungkin berpikir bahwa akan sangat bagus untuk database NoSQL untuk melakukan kerja keras mencegah anomali untuk Anda. Ada paradigma yang bisa melakukan ini - paradigma relasional.
sumber
Pendekatan couchDB menyarankan untuk mengeluarkan kelas barang yang tepat dalam fase peta dan meringkasnya dalam pengurangan .. Jadi Anda bisa memetakan semua komentar dan mengeluarkan
1
untuk pengguna tertentu dan kemudian mencetak hanya satu. Ini akan membutuhkan banyak penyimpanan disk untuk membangun tampilan persisten dari semua data yang dapat dilacak di couchDB. btw mereka juga memiliki halaman wiki ini tentang hubungan: http://wiki.apache.org/couchdb/EntityRelationship .Riak sebaliknya memiliki alat untuk membangun relasi. Itu adalah tautan. Anda dapat memasukkan alamat dokumen yang ditautkan (di sini komentar) ke dokumen 'root' (di sini dokumen pengguna). Ini memiliki satu trik. Jika didistribusikan, itu dapat diubah pada satu waktu di banyak lokasi. Ini akan menyebabkan konflik dan akibatnya pohon jam vektor besar: / ..tidak terlalu buruk, tidak terlalu baik.
Riak juga memiliki 'mekanisme' lain. Ini memiliki ruang nama kunci 2-lapisan, yang disebut ember dan kunci. Jadi, misalnya siswa, Jika kita memiliki klub A, B dan C dan siswa StudentX, StudentY Anda dapat mempertahankan ketentuan berikut:
dan untuk membaca relasi cukup cantumkan kunci dalam wadah yang diberikan. Apa yang salah dengan itu? Ini sangat lambat. Mencantumkan ember tidak pernah menjadi prioritas untuk riak. Ini menjadi lebih baik dan lebih baik lagi. btw. Anda tidak membuang-buang memori karena contoh ini
{true}
dapat ditautkan ke satu profil lengkap StudentX atau Y (di sini konflik tidak dimungkinkan).Seperti yang Anda lihat, NoSQL! = NoSQL. Anda perlu melihat implementasi spesifik dan mengujinya sendiri.
Disebutkan sebelumnya Column store terlihat cocok untuk relasi .. tapi itu semua tergantung pada kebutuhan A dan C dan P Anda;) Jika Anda tidak membutuhkan A dan Anda memiliki kurang dari Peta byte biarkan saja, lanjutkan dengan MySql atau Postgres.
semoga berhasil
sumber
user: userid: comments adalah pendekatan yang masuk akal - anggap saja itu setara dengan indeks kolom dalam SQL, dengan persyaratan tambahan bahwa Anda tidak dapat melakukan kueri pada kolom yang tidak terindeks.
Di sinilah Anda perlu memikirkan kebutuhan Anda. Daftar dengan 30 juta item bukannya tidak masuk akal karena lambat, tetapi karena tidak praktis untuk melakukan apa pun dengannya. Jika kebutuhan Anda yang sebenarnya adalah untuk menampilkan beberapa komentar terbaru, Anda lebih baik menyimpan daftar yang sangat pendek yang diperbarui setiap kali komentar ditambahkan - ingat bahwa NoSQL tidak memiliki persyaratan normalisasi. Kondisi balapan adalah masalah dengan daftar di penyimpanan nilai kunci dasar tetapi umumnya platform Anda mendukung daftar dengan benar, Anda dapat melakukan sesuatu dengan kunci, atau Anda tidak benar-benar peduli dengan pembaruan yang gagal.
Sama seperti untuk komentar pengguna - buat kata kunci indeks: posting
Lebih mirip - mungkin daftar klub sebagai properti siswa dan indeks di bidang itu untuk mendapatkan semua anggota klub
sumber
Kamu punya
Dalam database relasional, hal yang biasa dilakukan dalam relasi satu-ke-banyak adalah menormalkan data. Itu adalah hal yang sama yang akan Anda lakukan di database NoSQL juga. Cukup indeks bidang yang akan Anda ambil informasinya.
Misalnya, indeks penting untuk Anda adalah
Jika Anda menggunakan NosDB (Basis Data NoSQL berbasis .NET dengan dukungan SQL) kueri Anda akan seperti ini
Periksa semua jenis kueri yang didukung dari lembar contekan atau dokumentasinya SQL .
sumber