Alih-alih database saya hanya membuat serial data saya ke JSON, menyimpan dan memuatnya ke disk bila perlu. Semua manajemen data dibuat pada program itu sendiri, yang lebih cepat DAN lebih mudah daripada menggunakan query SQL. Untuk alasan itu saya tidak pernah mengerti mengapa database diperlukan sama sekali.
Mengapa seseorang harus menggunakan database dan bukannya hanya menyimpan data ke disk?
Jawaban:
Singkatnya, Anda mendapat manfaat dari beragam teknologi terkenal dan teruji yang dikembangkan selama bertahun-tahun oleh beragam orang yang sangat pintar.
Jika Anda khawatir database terlalu banyak, lihat SQLite.
sumber
Sementara saya setuju dengan semua yang dikatakan Robert, dia tidak memberi tahu Anda kapan Anda harus menggunakan database dan bukan hanya menyimpan data ke disk.
Jadi, ambil ini sebagai tambahan dari apa yang dikatakan Robert tentang skalabilitas, keandalan, toleransi kesalahan, dll.
Kapan menggunakan RDBMS, berikut adalah beberapa hal yang perlu dipertimbangkan:
Adapun kapan harus menggunakan NoSQL
Akhirnya, kapan harus menggunakan file
sumber
Satu hal yang tampaknya tidak ada yang disebutkan adalah pengindeksan catatan. Pendekatan Anda baik-baik saja saat ini, dan saya berasumsi bahwa Anda memiliki kumpulan data yang sangat kecil dan sangat sedikit orang yang mengaksesnya.
Ketika Anda menjadi lebih kompleks, Anda sebenarnya membuat database. Apa pun yang Anda ingin menyebutnya, database hanyalah satu set catatan yang disimpan ke disk. Apakah Anda sedang membuat file, atau MySQL , SQLite atau apa pun yang membuat file, keduanya adalah database.
Apa yang Anda lewatkan adalah fungsionalitas kompleks yang telah dibangun ke dalam sistem basis data untuk membuatnya lebih mudah digunakan.
Hal utama yang muncul di pikiran adalah pengindeksan. OK, jadi Anda dapat menyimpan 10 atau 20 atau bahkan 100 atau 1000 catatan dalam array berseri, atau string JSON dan tarik keluar dari file Anda dan lakukan iterasi dengan relatif cepat.
Sekarang, bayangkan Anda memiliki 10.000, 100.000, atau bahkan 1.000.000 catatan. Ketika seseorang mencoba masuk Anda harus membuka file yang sekarang beberapa ratus megabytes, muat ke dalam memori di program Anda, tarik keluar array informasi berukuran sama dan kemudian iterate 100-an ribu catatan hanya untuk temukan satu catatan yang ingin Anda akses.
Basis data yang tepat akan memungkinkan Anda untuk mengatur indeks pada bidang tertentu dalam catatan yang memungkinkan Anda untuk meminta basis data dan menerima respons dengan sangat cepat, bahkan dengan kumpulan data yang sangat besar. Gabungkan dengan sesuatu seperti Memcached , atau bahkan sistem cache buatan sendiri (misalnya, simpan hasil pencarian dalam tabel terpisah selama 10 menit dan muat hasilnya jika ada orang lain mencari hal yang sama segera setelah itu), dan Anda akan memiliki pertanyaan yang sangat cepat, sesuatu yang tidak akan Anda dapatkan dengan set data besar ketika Anda membaca / menulis ke file secara manual.
Hal lain yang secara longgar terkait dengan pengindeksan adalah transfer informasi. Seperti yang saya katakan di atas, ketika Anda punya file ratusan atau ribuan megabita Anda harus memuat semua informasi itu ke dalam memori, iterate secara manual (mungkin pada utas yang sama) dan kemudian memanipulasi data Anda.
Dengan sistem basis data, ia akan berjalan pada utasnya sendiri, atau bahkan pada servernya sendiri. Semua yang ditransmisikan antara program Anda dan server database adalah kueri SQL dan semua yang dikirimkan kembali adalah data yang ingin Anda akses. Anda tidak memuat seluruh dataset ke dalam memori - semua yang Anda kirim dan terima hanyalah sebagian kecil dari total data Anda.
sumber
Ketika Anda memiliki data sederhana, seperti daftar hal-hal seperti yang Anda jelaskan di komentar pertanyaan Anda, maka database SQL tidak akan memberi Anda banyak. Banyak orang masih menggunakannya, karena mereka tahu data mereka dapat menjadi lebih rumit dari waktu ke waktu, dan ada banyak perpustakaan yang membuat bekerja dengan sepele basis data.
Tetapi bahkan dengan daftar sederhana yang Anda muat, simpan dalam memori, kemudian tulis ketika dibutuhkan, dapat menderita sejumlah masalah:
Penghentian program yang tidak normal dapat kehilangan data, atau saat menulis data ke disk ada yang tidak beres, dan Anda dapat mematikan seluruh file. Anda bisa menggulung mekanisme Anda sendiri untuk menangani ini, tetapi database menangani ini untuk Anda menggunakan teknik yang sudah terbukti.
Jika data Anda mulai tumbuh terlalu besar dan memperbarui terlalu sering, membuat serialisasi semua data Anda dan menyimpan akan menjadi sumber daya yang besar dan memperlambat semuanya. Anda harus mulai bekerja bagaimana cara mempartisi hal-hal, sehingga tidak akan terlalu mahal. Database dioptimalkan untuk menyimpan hal-hal yang berubah ke disk dengan cara yang toleran terhadap kesalahan. Juga dirancang, sehingga Anda dapat dengan cepat memuat bit data yang Anda butuhkan pada waktu tertentu.
Juga, Anda tidak perlu menggunakan database SQL. Anda dapat menggunakan "database" NoSQL yang banyak dilakukan, cukup gunakan JSON untuk menyimpan data. Tetapi ini dilakukan dengan cara yang toleran terhadap kesalahan, dan dengan cara di mana data dapat secara cerdas dibagi, dipertanyakan, dan terbagi secara cerdas di banyak komputer.
Juga, beberapa orang mencampuradukkan berbagai hal. Mereka mungkin menggunakan penyimpanan data NoSQL seperti Redis untuk menyimpan informasi login. Kemudian gunakan basis data relasional untuk menyimpan data yang lebih kompleks di mana mereka perlu melakukan kueri yang lebih menarik.
sumber
Saya melihat banyak jawaban fokus pada masalah konkurensi dan reliabilitas. Database memberikan manfaat lain selain konkurensi, keandalan, dan kinerja. Mereka memungkinkan untuk tidak mengganggu bagaimana byte dan karakter ditampilkan dalam memori. Dengan kata lain, basis data memungkinkan pemrogram untuk memfokuskan dirinya pada "apa" dan bukan "bagaimana".
Salah satu jawaban menyebutkan pertanyaan. "Mengajukan pertanyaan pada SQL database" dengan baik dengan kompleksitas pertanyaan. Ketika kode berevolusi selama pengembangan, pertanyaan sederhana seperti "fetch all" dapat dengan mudah berkembang menjadi "fetch all di mana property1 sama dengan nilai ini dan kemudian urutkan berdasarkan property2" tanpa membuatnya menjadi perhatian programmer untuk mengoptimalkan struktur data untuk kueri tersebut. Kinerja sebagian besar kueri dapat dipercepat dengan membuat indeks untuk properti tertentu.
Manfaat lainnya adalah hubungan. Dengan kueri, lebih bersih untuk mereferensi-silang data dari set data yang berbeda kemudian memiliki loop bersarang. Misalnya mencari semua posting forum dari pengguna yang memiliki kurang dari 3 posting di sistem di mana pengguna dan posting adalah kumpulan data yang berbeda (atau tabel DB atau objek JSON) dapat dilakukan dengan satu permintaan tanpa mengorbankan keterbacaan.
Semua dalam semua, database SQL lebih baik daripada array sederhana jika volume data bisa besar (katakanlah lebih dari 1000 objek), akses data di bagian kode non-sepele dan berbeda akses ke subset data yang berbeda.
sumber
TLDR
Sepertinya Anda membuat keputusan teknis penyimpanan data jangka pendek yang valid untuk aplikasi Anda - Anda memilih untuk menulis alat manajemen penyimpanan data kustom.
Anda duduk di sebuah kontinum, dengan opsi untuk bergerak ke arah mana pun.
Dalam jangka panjang, Anda kemungkinan besar (hampir, tetapi tidak 100% pasti) menemukan diri Anda mengalami masalah, dan mungkin lebih baik untuk berubah menggunakan solusi penyimpanan data yang ada. Ada masalah kinerja yang spesifik, sangat umum, dapat diprediksi, dan Anda akan terpaksa mengatasinya, dan Anda lebih baik menggunakan alat yang ada daripada menggulirkan sendiri.
Kedengarannya seperti Anda telah menulis basis data tujuan khusus (kecil), dibangun ke dalam dan langsung digunakan oleh aplikasi Anda. Saya berasumsi Anda mengandalkan OS dan sistem file untuk mengelola penulisan dan pembacaan disk yang sebenarnya, dan memperlakukan kombinasi sebagai penyimpanan data.
Kapan melakukan apa yang Anda lakukan
Anda sedang duduk di sweet-spot untuk penyimpanan data. OS dan penyimpanan data sistem file sangat praktis, mudah diakses, dan lintas platform portabel. Kombinasi ini sudah ada sejak lama, sehingga Anda yakin akan didukung, dan menjalankan aplikasi Anda, di hampir semua konfigurasi penggunaan standar.
Ini juga merupakan kombinasi yang mudah untuk menulis kode - API cukup mudah dan sederhana, dan dibutuhkan beberapa baris kode untuk membuatnya berfungsi.
Secara umum, sangat ideal untuk melakukan apa yang telah Anda lakukan ketika:
Alternatif
Anda berada di kontinum pilihan, dan ada dua 'arah' yang bisa Anda tempuh dari sini, yang saya pikir sebagai 'turun' dan 'naik':
Turun
Ini adalah opsi yang paling tidak mungkin untuk diterapkan, tetapi ada di sini untuk kelengkapan:
Anda dapat, jika ingin, turun , yaitu memotong OS dan sistem file sekaligus dan benar-benar menulis dan membaca langsung dari disk. Pilihan ini biasanya hanya relevan dalam kasus-kasus di mana efisiensi ekstrem diperlukan - pikirkan, misalnya, perangkat pemutar MP3 minimal / kecil , tanpa RAM yang cukup untuk OS yang berfungsi penuh, atau sesuatu seperti Wayback Machine , yang membutuhkan massa yang sangat efisien operasi penulisan data (sebagian besar penyimpanan data menukar penulisan dengan lambat untuk pembacaan yang lebih cepat, karena itulah kasus penggunaan yang sangat umum untuk hampir semua aplikasi).
Naik
Ada beberapa sub-kategori di sini - ini tidak sepenuhnya eksklusif. Beberapa alat merentang keduanya, menyediakan beberapa fungsi di masing-masing, beberapa dapat sepenuhnya beralih dari bekerja dalam satu mode ke bekerja di yang lain, dan beberapa dapat berlapis di atas satu sama lain, menyediakan fungsionalitas yang berbeda ke berbagai bagian aplikasi Anda.
Menyimpan data yang lebih kuat
Anda mungkin perlu menyimpan volume data yang lebih tinggi dan lebih tinggi, sambil tetap mengandalkan aplikasi Anda sendiri untuk mengelola kompleksitas manipulasi data. Seluruh jajaran toko nilai kunci tersedia untuk Anda, dengan beragam dukungan untuk fungsi terkait. Alat NoSQL termasuk dalam kategori ini, serta yang lain.
Ini adalah jalur yang jelas untuk ditingkatkan ketika yang berikut menjelaskan aplikasi Anda:
Ada beberapa ruang gerak di sini - Anda dapat memaksakan konsistensi membaca yang lebih baik, untuk bacaan yang lebih lambat. Berbagai alat dan opsi menyediakan apis manipulasi data, pengindeksan, dan opsi lain, yang mungkin lebih atau kurang cocok untuk dengan mudah menulis aplikasi spesifik Anda. Jadi, jika poin di atas hampir sepenuhnya menggambarkan aplikasi Anda, Anda mungkin "cukup dekat" untuk bekerja dengan solusi penyimpanan data yang lebih kuat.
Contoh terkenal: CouchDB , MongoDB , Redis , solusi penyimpanan cloud seperti Microsoft Azure , Google App Data Store dan Amazon ECE.
Mesin manipulasi data yang lebih kompleks
Keluarga "SQL" aplikasi penyimpanan data, serta berbagai lainnya, lebih baik digambarkan sebagai alat manipulasi data, daripada mesin penyimpanan murni. Mereka menyediakan berbagai fungsi tambahan, di luar penyimpanan data, dan seringkali melampaui apa yang tersedia di sisi penyimpanan nilai-penting. Anda akan ingin mengambil jalan ini ketika:
Ini adalah cara berpikir yang lebih "tradisional" tentang basis data atau penyimpanan data, dan telah ada lebih lama - jadi ada banyak yang tersedia di sini, dan sering ada banyak kerumitan untuk dihadapi. Mungkin saja, meskipun butuh keahlian dan pengetahuan, dan membangun solusi sederhana / menghindari banyak kerumitan - Anda kemungkinan besar akan menggunakan alat dan perpustakaan pihak ketiga untuk mengelola sebagian besar untuk Anda.
Contoh terkenal adalah MySQL , SQL Server , Oracle's Database, dan DB2 .
Mengalihdayakan pekerjaan
Ada beberapa, alat pihak ketiga modern dan perpustakaan, yang menempatkan diri di antara alat penyimpanan data Anda dan aplikasi Anda, untuk membantu Anda mengelola kompleksitas.
Mereka awalnya mencoba untuk mengambil sebagian besar atau semua pekerjaan yang masuk ke dalam mengelola dan memanipulasi penyimpanan data, dan, idealnya, memungkinkan Anda untuk membuat transisi yang lancar ke kompleksitas hanya ketika dan jika diperlukan. Ini adalah bidang aktif kewirausahaan dan penelitian, dengan beberapa hasil terbaru yang segera dapat diakses dan digunakan.
Contoh terkenal adalah alat MVC ( Django , Yii ), Ruby on Rails , dan Datomic . Sulit untuk bersikap adil di sini karena ada lusinan alat dan perpustakaan yang bertindak sebagai pembungkus API dari berbagai penyimpanan data.
PS: jika Anda lebih suka video daripada teks, Anda mungkin ingin menonton beberapa video yang berhubungan dengan database Rich Hickey; ia melakukan pekerjaan dengan baik untuk menjelaskan sebagian besar pemikiran yang digunakan untuk memilih, merancang, dan menggunakan penyimpanan data.
sumber
Sebuah sistem file cocok dengan deskripsi dari basis data NoSQL, jadi saya katakan Anda harus mempertimbangkan untuk menggunakannya saat memutuskan bagaimana cara menyimpan data Anda dan tidak mengabaikannya begitu saja demi RDBMS, seperti beberapa jawaban yang sepertinya disarankan di sini.
Salah satu masalah dengan sistem file (dan NoSQL pada umumnya) adalah menangani hubungan antar data. Jika itu bukan pemblokir utama di sini, maka saya akan mengatakan lewati RDBMS untuk saat ini. Juga ingat sisi positif menggunakan sistem file sebagai penyimpanan:
( sumber )
sumber
Sistem file adalah jenis database. Mungkin bukan RDBMS seperti yang dibicarakan orang lain, tetapi tentu saja DB dalam arti yang paling ketat. Anda memberikan kunci (nama file) untuk mencari data (konten file), yang memiliki penyimpanan abstrak dan API yang digunakan oleh program Anda untuk berkomunikasi.
Jadi, Anda menggunakan Database. Posting lain dapat memperdebatkan tentang keutamaan berbagai jenis basis data ...
sumber
Basis data diperlukan jika Anda memiliki banyak proses (pengguna / server) yang memodifikasi data. Kemudian database berfungsi untuk mencegah mereka saling menimpa perubahan.
Anda juga membutuhkan database saat data Anda lebih besar dari memori. Saat ini dengan memori yang kami miliki, ini memang membuat penggunaan database di banyak aplikasi menjadi usang.
Pendekatan Anda jelas lebih baik daripada omong kosong "database di memori". Yang pada dasarnya adalah pendekatan Anda, tetapi dengan banyak overhead ditambahkan.
sumber
Anda harus selalu bertanya pada diri sendiri apakah aplikasi tertentu membutuhkan RDBMS. Terlalu banyak aplikasi dibangun dengan proses desain yang secara otomatis mengasumsikan semua alat dan kerangka kerja yang diperlukan di awal. Database relasional sangat umum dan banyak pengembang telah bekerja pada aplikasi yang sama seperti sebelumnya, sehingga mereka secara otomatis dimasukkan sebelum proyek dimulai. Banyak proyek bisa lolos dengan ini, jadi jangan menilai terlalu keras.
Anda memulai proyek Anda tanpa itu, dan itu berhasil. Lebih mudah bagi Anda untuk menjalankan dan menjalankan ini tanpa menunggu hingga Anda SQL. Tidak ada yang salah dengan itu.
Ketika proyek ini berkembang dan persyaratan menjadi lebih rumit, beberapa hal akan menjadi sulit untuk dibangun. Sampai Anda meneliti dan menguji metode alternatif, bagaimana Anda tahu mana yang lebih baik? Anda dapat bertanya pada Pemrogram dan menyaring melalui api dan 'itu tergantung' untuk menjawab pertanyaan ini. Setelah Anda mempelajarinya, Anda dapat mempertimbangkan berapa baris kode yang ingin Anda tulis dalam bahasa Anda untuk menangani beberapa manfaat dari database. Pada titik tertentu, Anda menciptakan kembali roda.
Mudah seringkali relatif. Ada beberapa kerangka kerja yang bisa membangun halaman web dan menghubungkan formulir ke tabel database tanpa mengharuskan pengguna untuk menulis kode apa pun. Saya kira jika Anda berjuang dengan mouse, ini bisa menjadi masalah. Semua orang tahu, ini tidak dapat diskalakan atau fleksibel karena Tuhan melarang Anda menggabungkan semuanya dengan GUI. Seorang non-programmer baru saja membuat prototipe; banyak YAGNI dapat ditemukan di sini.
Jika Anda lebih suka mempelajari ORM yang dimanipulasi oleh bahasa pilihan Anda alih-alih belajar SQL, coba saja, tetapi cobalah untuk menginstal, buat tabel dan tarik beberapa data dari database populer dengan SQL (Pilih * Dari; bukan hal yang membingungkan). Itu mudah dilakukan. Karena itulah seseorang menciptakannya. Sepertinya bukan investasi yang sangat besar untuk membuat keputusan yang tepat. Anda mungkin bisa melakukan tes kinerja juga.
sumber
Menyimpan data ke disk IS menulisnya ke database, terutama jika Anda meletakkan setiap objek dalam file sendiri dengan nama file menjadi kunci untuk merekam. Dan untuk meminimalkan waktu pencarian untuk membaca file, buat subdirektori berdasarkan beberapa karakter pertama dari kunci tersebut.
Misalnya kunci = ghostwriter akan masuk dalam g / ho / stwriter.json atau g / h / o / stwriter.json atau g / ho / ghostwriter.json atau g / h / o / ghostwriter.json. Pilih skema penamaan Anda berdasarkan distribusi kunci Anda. Jika mereka nomor urut maka 5/4/3 / 12345.json lebih baik daripada sebaliknya.
Itu adalah database dan jika ia melakukan semua yang Anda butuhkan, maka lakukan dengan cara itu. Sekarang ini akan disebut basis data NoSQL seperti GDBM, atau Berkeley db. Begitu banyak pilihan. Pertama cari tahu apa yang Anda butuhkan, kemudian bangun pustaka antarmuka untuk menangani detail, mungkin antarmuka get / set seperti memcached atau antarmuka CRUD, dan kemudian Anda akan dapat menukar pustaka jika Anda perlu mengubah format database untuk satu dengan karakteristik yang berbeda.
Perhatikan bahwa beberapa database SQL seperti PostgreSQL dan Apache Derby DB, akan memungkinkan Anda untuk melakukan query SQL di atas banyak format NoSQL termasuk database homegrown Anda sendiri. Tidak yakin tentang MyBatis tetapi mungkin serupa.
Hindari hype NoSQL. Baca tentang fitur, uji kinerja dan kemampuan, lalu pilih berdasarkan seberapa cocok dengan kebutuhan aplikasi Anda.
http://www.hdfgroup.org/HDF5/ adalah format datastore lain yang menarik dan banyak digunakan yang tidak sering dipertimbangkan orang.
sumber
Segera setelah data diperbarui secara bersamaan, pendekatan yang menggunakan basis data (bisa juga dalam basis data memori) kemungkinan akan lebih benar dan lebih berkinerja, sementara pada saat yang sama kode Anda tetap mudah, karena Anda tidak punya untuk khawatir tentang pembaruan bersamaan, transaksi, caching, I / O yang tidak sinkron, dan semua itu.
sumber
Anda memerlukan databse untuk menyimpan / mengambil QA seperti yang kami posting di sini! File sederhana tidak dapat mengatur data yang terkait dengan berbagai topik.
sumber