Saya tertarik untuk mendengar tentang strategi desain yang telah Anda gunakan dengan database "nosql" non-relasional - yaitu, kelas penyimpanan data (kebanyakan baru) yang tidak menggunakan desain relasional tradisional atau SQL (seperti Hypertable, CouchDB, SimpleDB, datastore Google App Engine, Voldemort, Cassandra, SQL Data Services, dll.). Mereka juga sering disebut sebagai "penyimpanan kunci / nilai", dan pada dasarnya mereka bertindak seperti tabel hash persisten terdistribusi raksasa.
Secara khusus, saya ingin belajar tentang perbedaan dalam desain data konseptual dengan database baru ini. Mana yang lebih mudah, mana yang lebih sulit, apa yang tidak bisa dilakukan sama sekali?
Sudahkah Anda menemukan desain alternatif yang bekerja jauh lebih baik di dunia non-relasional?
Sudahkah kepala Anda terbentur sesuatu yang tampaknya mustahil?
Sudahkah Anda menjembatani kesenjangan dengan pola desain apa pun, misalnya menerjemahkan dari satu pola ke pola lainnya?
Apakah Anda bahkan melakukan model data eksplisit sama sekali sekarang (misalnya dalam UML) atau apakah Anda telah membuangnya sepenuhnya untuk mendukung blob data semi-terstruktur / berorientasi dokumen?
Apakah Anda melewatkan salah satu layanan tambahan utama yang disediakan RDBMS, seperti integritas relasional, dukungan transaksi kompleks yang sewenang-wenang, pemicu, dll?
Saya berasal dari latar belakang DB relasional SQL, jadi normalisasi ada dalam darah saya. Yang mengatakan, saya mendapatkan keuntungan dari database non-relasional untuk kesederhanaan dan penskalaan, dan naluri saya memberi tahu saya bahwa harus ada tumpang tindih kemampuan desain yang lebih kaya. Apa yang telah kau lakukan?
FYI, ada diskusi StackOverflow tentang topik serupa di sini:
Jawaban:
Saya pikir Anda harus mempertimbangkan bahwa DBMS non-relasional sangat berbeda dalam hal model datanya dan oleh karena itu desain data konseptual juga akan sangat berbeda. Di utas Desain Data di Database Non-Relasional dari grup Google NOSQL , paradigma yang berbeda dikategorikan seperti ini:
Saya sebagian besar menyukai database grafik , dan keanggunan desain data menggunakan paradigma ini yang membawa saya ke sana, bosan dengan kekurangan RDBMS . Saya telah meletakkan beberapa contoh desain data menggunakan database grafik di halaman wiki ini dan ada contoh bagaimana memodelkan IMDB dasar film / aktor / peran juga.
Slide presentasi (slideshare) Database Grafik dan Masa Depan Manajemen Pengetahuan Skala Besar oleh Marko Rodriguez berisi pengantar yang sangat bagus untuk desain data menggunakan database grafik juga.
Menjawab pertanyaan spesifik dari sudut pandang graphdb:
Desain alternatif: menambahkan hubungan antara berbagai jenis entitas tanpa kekhawatiran atau kebutuhan untuk menentukan entitas mana yang dapat terhubung.
Menjembatani kesenjangan: Saya cenderung melakukan ini berbeda untuk setiap kasus, berdasarkan domain itu sendiri, karena saya tidak ingin "grafik berorientasi tabel" dan sejenisnya. Namun, berikut beberapa informasi tentang terjemahan otomatis dari RDBMS ke graphdb.
Model data eksplisit: Saya melakukan ini sepanjang waktu (gaya papan tulis), dan kemudian menggunakan model seperti yang ada di DB juga.
Miss from RDBMS world: cara mudah membuat laporan. Update: mungkin itu tidak bahwa sulit untuk membuat laporan dari database grafik, lihat Membuat Laporan untuk Neo4j Contoh database .
sumber
Saya baru saja mulai dengan DB non-relasional, dan saya masih mencoba memahami dan mencari tahu model terbaik apa yang akan saya buat. Dan saya hanya dapat berbicara untuk CouchDB.
Namun, saya memiliki beberapa kesimpulan awal:
Sudahkah Anda menemukan desain alternatif yang bekerja jauh lebih baik di dunia non-relasional?
Fokus desain bergeser: Desain model dokumen (sesuai dengan tabel DB) menjadi hampir tidak relevan, sementara semuanya bergantung pada desain tampilan (sesuai dengan kueri).
Jenis DB dokumen menukar kerumitan: SQL memiliki data yang tidak fleksibel dan permintaan yang fleksibel, DB dokumen adalah sebaliknya.
Model CouchDB adalah kumpulan "dokumen JSON" (pada dasarnya tabel hash bersarang). Setiap dokumen memiliki ID unik, dan bisa diambil dengan mudah menggunakan ID. Untuk kueri lainnya, Anda menulis "tampilan", yang dinamai kumpulan fungsi peta / pengurangan. Tampilan mengembalikan hasil yang ditetapkan sebagai daftar pasangan kunci / nilai.
Triknya adalah Anda tidak membuat kueri database dalam arti Anda membuat kueri database SQL: Hasil menjalankan fungsi tampilan disimpan dalam indeks, dan hanya indeks yang dapat ditanyai. (Seperti "get everything", "get key" atau "get key range".)
Analogi terdekat di dunia SQL adalah jika Anda hanya dapat melakukan kueri DB menggunakan prosedur tersimpan - setiap kueri yang ingin Anda dukung harus ditentukan sebelumnya.
Desain dokumen sangat fleksibel. Saya hanya menemukan dua kendala:
Tapi semuanya bergantung pada mendesain tampilan.
Desain alternatif yang saya temukan bahwa urutan kerja yang lebih baik dengan CouchDB daripada database SQL mana pun berada pada level sistem daripada level penyimpanan. Jika Anda memiliki beberapa data dan ingin menyajikannya ke halaman web, kompleksitas sistem total berkurang setidaknya 50%:
Untuk aplikasi web normal, DB berbasis dokumen / JSON adalah keuntungan besar, dan kekurangan dari kueri yang kurang fleksibel dan beberapa kode tambahan untuk validasi data tampaknya merupakan harga yang harus dibayar.
Sudahkah kepala Anda terbentur sesuatu yang tampaknya mustahil?
Belum. Map / reduce sebagai cara untuk membuat kueri database masih asing, dan membutuhkan lebih banyak pemikiran daripada menulis SQL. Ada sejumlah kecil primitif, jadi mendapatkan hasil yang Anda butuhkan pada dasarnya adalah pertanyaan tentang menjadi kreatif dengan cara Anda menentukan kuncinya.
Ada batasan di mana kueri tidak dapat melihat dua dokumen atau lebih pada saat yang sama - tidak ada gabungan atau jenis hubungan multi-dokumen lainnya, tetapi sejauh ini tidak ada yang tidak dapat diatasi.
Sebagai contoh batasan, penghitungan dan penjumlahan mudah tetapi rata-rata tidak dapat dihitung dengan tampilan / kueri CouchDB. Fix: Kembalikan jumlah dan hitung secara terpisah dan hitung rata-rata pada klien.
Sudahkah Anda menjembatani kesenjangan dengan pola desain apa pun, misalnya menerjemahkan dari satu pola ke pola lainnya?
Saya tidak yakin itu layak. Ini lebih merupakan desain ulang yang lengkap, seperti menerjemahkan program gaya fungsional ke gaya berorientasi objek. Secara umum, jenis dokumen jauh lebih sedikit daripada tabel SQL dan lebih banyak data di setiap dokumen.
Salah satu cara untuk memikirkannya adalah dengan melihat SQL Anda untuk penyisipan dan kueri umum: Tabel dan kolom mana yang diperbarui ketika pelanggan melakukan pemesanan, misalnya? Dan yang mana untuk laporan penjualan bulanan? Info itu mungkin harus masuk dalam dokumen yang sama.
Yaitu: Satu dokumen untuk Pesanan, berisi ID pelanggan dan ID produk, dengan bidang yang direplikasi seperlunya untuk menyederhanakan kueri. Apa pun di dalam dokumen dapat ditanyakan dengan mudah, apa pun yang membutuhkan referensi silang antara mengatakan Order dan Pelanggan harus dilakukan oleh klien. Jadi jika Anda ingin laporan penjualan menurut wilayah, Anda mungkin harus memasukkan kode wilayah ke dalam pesanan.
Apakah Anda bahkan melakukan model data eksplisit sama sekali sekarang (misalnya dalam UML)?
Maaf, tidak pernah melakukan banyak UML sebelum DB dokumen :)
Tetapi Anda memerlukan semacam model yang mengatakan bidang mana yang termasuk dalam dokumen mana dan jenis nilai apa yang dikandungnya. Baik untuk referensi Anda sendiri nanti dan untuk memastikan bahwa setiap orang yang menggunakan DB mengetahui konvensi. Karena Anda tidak lagi mendapatkan kesalahan jika Anda menyimpan tanggal di bidang teks, misalnya, dan siapa pun dapat menambah atau menghapus bidang apa pun yang mereka sukai, Anda memerlukan kode validasi dan konvensi untuk mengatasi kekosongan. Terutama jika Anda bekerja dengan sumber daya eksternal.
Apakah Anda melewatkan salah satu layanan tambahan utama yang disediakan RDBMS?
Nggak. Tapi latar belakang saya adalah pengembang aplikasi web, kami berurusan dengan database hanya sejauh yang kami harus :)
Perusahaan tempat saya bekerja membuat produk (webapp) yang dirancang untuk dijalankan di database SQL dari beberapa vendor, dan "layanan tambahan" sangat berbeda dari DB ke DB sehingga harus diimplementasikan secara terpisah untuk setiap DB. Jadi, lebih sedikit pekerjaan bagi kami untuk memindahkan fungsionalitas dari RDBMS. Ini bahkan meluas ke pencarian teks lengkap.
Jadi apa pun yang saya serahkan adalah sesuatu yang tidak pernah benar-benar saya miliki. Jelas sekali, pengalaman Anda mungkin berbeda.
Peringatan: Yang saya kerjakan sekarang adalah aplikasi web untuk data keuangan, harga saham, dan sejenisnya. Ini sangat cocok untuk DB dokumen, dari sudut pandang saya, saya mendapatkan semua manfaat dari DB (ketekunan dan kueri) tanpa kerumitan.
Tetapi data ini cukup independen satu sama lain, tidak ada kueri relasional yang kompleks. Dapatkan penawaran harga terbaru berdasarkan ticker, dapatkan penawaran harga berdasarkan ticker dan rentang tanggal, dapatkan info meta perusahaan, itu saja. Contoh lain yang saya lihat adalah aplikasi blog, dan blog juga tidak dicirikan oleh skema database yang sangat rumit.
Apa yang ingin saya katakan adalah bahwa semua aplikasi DB dokumen yang berhasil yang saya ketahui memiliki data yang tidak memiliki banyak keterkaitan di tempat pertama: Dokumen (seperti dalam pencarian Google), posting blog, artikel berita, data keuangan .
Saya berharap ada kumpulan data yang memetakan lebih baik ke SQL daripada ke model dokumen, jadi menurut saya SQL akan bertahan.
Tetapi bagi kita yang hanya menginginkan cara sederhana untuk menyimpan dan mengambil data - dan saya menduga ada banyak dari kita - database dokumen (seperti di CouchDB) adalah anugerah.
sumber
Saya menjawab ini dengan CouchDB di belakang pikiran saya, tetapi saya akan menganggap sebagian besar akan benar untuk DB lain juga. Kami melihat menggunakan CouchDB, tetapi akhirnya memutuskan untuk tidak melakukannya karena akses data kami tidak diketahui sebelumnya dan skalabilitas bukanlah masalahnya.
Lebih sulit:
Lebih mudah:
Pemodelannya harus hampir sama tetapi Anda harus berhati-hati tentang apa yang Anda masukkan ke dalam satu dokumen: UML juga dapat digunakan untuk pemodelan OO serta pemodelan DB, yang sudah merupakan dua binatang yang berbeda.
Saya ingin melihat database OO terbuka yang bagus terintegrasi dengan baik dengan C # / Silverlight. Hanya untuk membuat pilihan semakin sulit. :)
sumber
File datar telah lama dianggap misterius dan tidak praktis untuk kumpulan data dengan ukuran berapa pun. Namun, komputer yang lebih cepat dengan lebih banyak memori memungkinkan untuk memuat file ke dalam memori dan mengurutkannya secara real time, setidaknya untuk aplikasi pengguna tunggal dan lokal yang cukup kecil.
Misalnya, Anda biasanya dapat membaca file 10.000 catatan DAN mengurutkannya di bidang dalam waktu kurang dari setengah detik, waktu respons yang dapat diterima.
Tentu saja, ada alasan untuk menggunakan database daripada file datar - operasi relasional, integritas data, kemampuan multipengguna, akses jarak jauh, kapasitas lebih besar, standarisasi, dll., Tetapi peningkatan kecepatan komputer dan kapasitas memori telah membuat manipulasi dalam memori data lebih praktis dalam beberapa kasus.
sumber
Database relasional yang saya lihat dalam kehidupan nyata cenderung tidak dinormalisasi dengan baik sama sekali, bertentangan dengan klaim Anda. Ketika ditanya, para desainer memberi tahu saya bahwa itu sebagian besar karena kinerja. RDBM tidak pandai bergabung, jadi tabel cenderung terlalu lebar dari sudut pandang normalisasi. Database berorientasi objek cenderung lebih baik dalam hal ini.
Titik lain di mana RDBM mengalami masalah adalah menangani kunci yang bergantung pada sejarah / waktu.
sumber