praktik terbaik untuk desain basis data NoSQL

34

Saya baru saja mulai menggunakan database berbasis dokumen NoSQL (MongoDB) dan saya ingin tahu tentang praktik terbaik untuk merancang database.

Saya kira arsitekturnya harus berbeda dari database relasional? Haruskah saya tetap mencari database yang dinormalisasi?

Misalnya saya punya use case tertentu;

Saya memiliki pengguna dengan riwayat sewa (array alamat) haruskah array itu menjadi array pada pengguna atau sebagai koleksi terpisah dengan kunci bersama?

Tom Squires
sumber
Jangan gunakan kunci asing
dukeofgaming
Jangan gunakan SQL :-). Serius, apakah "NoSQL" memberi tahu Anda hal lain tentang teknologi ini?
Saya pikir utas ini harus di situs Database Stack Exchange. Di sana Anda dapat menemukan bantuan lebih lanjut tentang masalah ini.
Luis Arriojas

Jawaban:

23

Pendekatan yang sesuai untuk desain database NoSQL adalah DDD ( Domain Driven Design ). Untuk beberapa orang yang terbiasa merancang RDBMS, NoSql terlihat seperti Sql anti-pola dan lebih masuk akal bila dipertimbangkan dalam lingkup DDD.

Bergantung pada penggunaan alamat, Anda dapat mendefinisikannya sebagai objek nilai di dalam model / entitas riwayat sewa Anda.

Di sini Anda adalah beberapa referensi yang dapat menghapus pemikiran tentang desain dengan NoSQL:

EL Yusubov
sumber
19

TL; DR

Normalisasi dalam RDBMS memungkinkan Anda untuk memanfaatkan kekuatan paradigma relasional.

Denormalisasi di NoSQL memungkinkan Anda untuk memanfaatkan kekuatan paradigma NoSQL.

Jawaban panjang

RDBMS bagus karena memungkinkan Anda memodelkan entitas terstruktur yang unik (bisa berubah atau tidak) dan hubungannya satu sama lain. Ini berarti sangat mudah untuk bekerja pada level entitas, memperbarui propertinya, memasukkan yang lain, menghapus satu, dll. Tetapi juga bagus untuk menggabungkannya secara dinamis, seekor anjing dengan pemiliknya, seekor anjing dengan rumah tempat tinggalnya, dll. RDBMS memberi Anda alat untuk memfasilitasi semua ini. Itu akan bergabung untuk Anda, itu akan menangani perubahan atom di seluruh entitas untuk Anda, dll.

Basis data NoSQL bagus karena memungkinkan Anda memodelkan agregat semi / tidak terstruktur dan entitas dinamis. Ini artinya sangat mudah untuk memodelkan entitas yang terus berubah, entitas yang tidak semuanya memiliki atribut dan agregat hierarkis yang sama.

Untuk memodelkan NoSql, Anda harus berpikir dalam hal hierarki dan agregat, bukan entitas dan hubungan. Jadi Anda tidak punya orang, alamat rental, dan hubungan di antara mereka. Anda memiliki catatan rental yang mengumpulkan untuk setiap orang apa alamat rental yang mereka miliki.

Anda perlu bertanya, data apa yang perlu saya ubah bersama. Data apa yang secara logis mengelompokkan data lainnya. Dalam kasus Anda seseorang terdengar seperti agregat yang baik. Apa titik masuk logis menuju sisa data.

Katakanlah NoSQL, simpan benda yang memiliki benda lain yang memiliki benda sendiri. Kembalikan seluruh hierarki semuanya. Biarkan saya mengubahnya sesuka saya, sekarang ganti seluruh hierarki barang dengan yang saya ubah. Cukup banyak itu memberi Anda. Mengapa ini bermanfaat? Jika yang Anda miliki adalah hierarki hal-hal yang Anda selalu berinteraksi dengan secara keseluruhan. Atau jika Anda perlu skala besar-besaran.

Semua hal lain yang diberikan RDBMS kepada Anda, Anda harus mengimplementasikan secara manual dalam kode dan skema Anda. Anda harus bergabung dalam kode jika Anda memerlukan agregat agregat. Anda harus menguraikan jika Anda hanya membutuhkan sebagian dari agregat. Anda harus memeriksa keunikan sendiri jika Anda tidak ingin duplikat. Anda harus menerapkan logika transaksional Anda sendiri ketika bekerja lintas agregat, dll.

Jadi memiliki satu meja besar dengan semua yang Anda butuhkan adalah cara untuk masuk ke NoSql. Karena atomisitas dijamin pada tingkat itu saja, dan kinerja juga. Mencari tahu hubungan Anda lebih awal adalah penting. Inilah yang disebut denasionalisasi.

Di RDBMS, denormalisasi secara efektif melumpuhkan DB Anda menjadi NoSQL. Jadi biasanya Anda menginginkan yang sebaliknya, yaitu normalisasi. Jika tidak, Anda harus menggunakan NoSQL DB sebagai gantinya. Kecuali Anda membutuhkan keduanya.

Didier A.
sumber