Desain Database Non-Relasional [ditutup]

114

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:

Ian Varley
sumber
2
database kunci / nilai hal baru yang lama.
Christopher
1
Bagi siapa pun yang tertarik, ada diskusi panjang yang terjadi di grup Google NoSQL, di sini: groups.google.com/group/nosql-discussion/browse_thread/thread/…
Ian Varley
4
FYI, saya telah menulis laporan panjang tentang topik ini, di sini: google.com/url?sa=D&q=http://ianvarley.com/UT/MR/… Terima kasih kepada Anda semua atas masukan Anda yang bermanfaat!
Ian Varley

Jawaban:

55

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:

  1. Sistem seperti Bigtable (HBase, Hypertable, dll)
  2. Toko bernilai kunci (Tokyo, Voldemort, dll)
  3. Database dokumen (CouchDB, MongoDB, dll)
  4. Database grafik (AllegroGraph, Neo4j, Sesame, dll)

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 .

nawroth
sumber
79

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:

  • Simpan data terkait bersama dalam dokumen yang sama, karena tidak ada yang terkait dengan gabungan.
  • Jangan membuat dokumen terlalu besar sehingga terlalu sering diperbarui (seperti memasukkan semua penjualan perusahaan untuk tahun ini dalam dokumen yang sama), karena setiap pembaruan dokumen memicu pengindeksan ulang.

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%:

  • tidak merancang tabel DB (masalah kecil)
  • tidak ada lapisan perantara ODBC / JDBC, semua pertanyaan dan transaksi melalui http (masalah sedang)
  • pemetaan DB-to-object sederhana dari JSON, yang hampir sepele dibandingkan dengan yang sama di SQL (penting!)
  • Anda berpotensi melewatkan seluruh server aplikasi, karena Anda dapat merancang dokumen Anda untuk diambil langsung oleh browser menggunakan AJAX dan menambahkan sedikit pemolesan JavaScript sebelum ditampilkan sebagai HTML. (BESAR !!)

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.

jg-faustus.dll
sumber
9
Sangat berguna. Terutama "SQL memiliki data yang tidak fleksibel dan kueri yang fleksibel, DB dokumen adalah sebaliknya" dan tidak adanya gabungan.
j_random_hacker
2
+1, ini sangat berwawasan.
Mas
2
Benar sekali, saya akan memilihnya lebih dari sekali jika memungkinkan.
Oktavianus A. Damiean
Ini masih sangat berguna di tahun 2014, akan sangat bagus jika Anda dapat menambahkan apa yang telah Anda pelajari sejak 2010 atau menautkan ke info yang mungkin Anda miliki di tempat lain.
Maggie
11

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:

  • Mengambil pemikiran ulang pada tataran konseptual sehingga 'lebih sulit' karena hanya berbeda. Karena Anda harus mengetahui pola akses data Anda sebelumnya, tidak ada terjemahan otomatis yang dapat diterapkan. Anda perlu menambahkan pola akses setidaknya.
  • Konsistensi tidak ditangani oleh database tetapi harus ditangani dalam aplikasi. Lebih sedikit jaminan berarti migrasi lebih mudah, fail-over, dan skalabilitas yang lebih baik dengan biaya aplikasi yang lebih rumit. Aplikasi harus berurusan dengan konflik dan inkonsistensi.
  • Tautan yang dokumen silang (atau kunci / nilai) harus ditangani pada tingkat aplikasi juga.
  • Jenis database SQL memiliki IDE yang jauh lebih matang. Anda mendapatkan banyak pustaka dukungan (meskipun pelapisan pustaka tersebut membuat segalanya jauh lebih kompleks daripada yang dibutuhkan untuk SQL).

Lebih mudah:

  • Lebih cepat jika Anda mengetahui pola akses data Anda.
  • Migrasi / Kegagalan lebih mudah untuk database karena tidak ada janji yang dibuat untuk Anda sebagai pemrogram aplikasi. Meskipun Anda akhirnya mendapatkan konsistensi. Mungkin. Akhirnya. Beberapa waktu.
  • Satu kunci / nilai jauh lebih mudah dipahami daripada satu baris dari tabel. Semua relasi (pohon) sudah ada, dan objek lengkap dapat dikenali.

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. :)

Rutger Nijlunsing
sumber
1

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.

xpda
sumber
1

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.

Stephan Eggermont
sumber
3
Stephan - Anda benar bahwa sistem dunia nyata sering kali kekurangan di departemen normalisasi. Tetapi tidaklah akurat untuk mengatakan bahwa RDBM "tidak pandai bergabung"; sebagian besar produk komersial (seperti Oracle, MS SQL Server, dll) memiliki pengoptimal kueri yang sangat canggih dan dapat melakukan berbagai macam algoritme gabungan fisik yang berbeda, jauh lebih cepat daripada operasi yang sama dapat dilakukan dalam kode aplikasi. (MySQL adalah pengecualian untuk ini, dari apa yang saya pahami). Menurut pengalaman saya, denormalisasi dini, seperti pengoptimalan prematur lainnya, sering kali merupakan tanda pengembang yang buruk.
Ian Varley
2
Melanjutkan pemikiran ini: gabungan yang buruk adalah hasil dari pengindeksan dan statistik yang buruk. Jika pengoptimal tidak memiliki apa pun untuk dikerjakan, atau informasi tentang apa yang dimilikinya sudah usang, itu akan membuat pilihan yang buruk. Banyak yang salah mengira ini sebagai "bergabung dengan buruk". Sistem RDBM modern memiliki penyetelan sendiri yang menutupi kebutuhan untuk menggunakan otak Anda saat menyiapkan pengindeksan dan statistik. Juga, orang mengacaukan skema logis (bentuk normal kelima) dan skema fisik (sering dinormalisasi menjadi normal ketiga). Hanya karena DB yang Anda lihat "lebar" tidak berarti ia dirancang dengan buruk secara logis.
Godeke