Saya melihat penulisan ulang aplikasi VB berbasis lokal (terpasang secara lokal) (faktur + inventaris) sebagai aplikasi Clojure berbasis web untuk pelanggan perusahaan kecil. Saya bermaksud ini ditawarkan sebagai aplikasi SaaS untuk pelanggan dalam perdagangan serupa.
Saya melihat opsi basis data: Pilihan saya adalah RDBMS: Postgresql / MySQL. Saya mungkin meningkatkan hingga 400 pengguna di tahun pertama, dengan biasanya 20-40 tampilan halaman / per hari per pengguna - sebagian besar untuk transaksi bukan tampilan statis. Setiap tampilan akan melibatkan pengambilan data dan pembaruan data. Kepatuhan ACID diperlukan (atau jadi saya pikir). Jadi volume transaksi tidak besar.
Ini akan menjadi no-brainer untuk memilih salah satu dari ini berdasarkan preferensi saya, tetapi untuk persyaratan yang satu ini, yang saya percaya adalah khas dari aplikasi SaaS: Skema akan berubah ketika saya menambah lebih banyak pelanggan / pengguna dan untuk setiap pelanggan mengubah persyaratan bisnis (saya akan menawarkan fleksibilitas terbatas hanya untuk memulainya). Karena saya bukan ahli DB, berdasarkan apa yang dapat saya pikirkan dan baca, saya dapat mengatasinya dalam beberapa cara:
- Memiliki desain skema RDBMS tradisional di MySQl / Postgresql dengan satu DB penyewa ganda. Dan tambahkan kolom "mengambang bebas" di setiap tabel untuk memungkinkan perubahan di masa mendatang karena saya menambahkan lebih banyak pelanggan atau perubahan untuk pelanggan yang sudah ada. Ini mungkin memiliki kerugian menyebarkan perubahan ke DB setiap kali perubahan kecil dibuat untuk Skema. Saya ingat pernah membaca bahwa dalam pembaruan skema Postgresql dapat dilakukan secara real time tanpa mengunci. Tetapi tidak yakin, seberapa menyakitkan atau seberapa praktis dalam kasus penggunaan ini. Dan juga, karena perubahan skema mungkin juga memperkenalkan perubahan SQL baru / kecil juga.
- Memiliki RDBMS, tetapi rancang skema basis data secara fleksibel: dengan dekat dengan entitas-atribut-nilai atau hanya sebagai penyimpan nilai-kunci. (Hari Kerja, FriendFeed misalnya)
- Simpan seluruh benda dalam memori sebagai objek dan simpan dalam file log secara berkala (mis. Edval, lmax)
- Gunakan DB NoSQL seperti MongoDB atau Redis. Tetapi berdasarkan apa yang bisa saya kumpulkan, mereka tidak cocok untuk kasus penggunaan ini dan tidak sepenuhnya sesuai ACID.
- Pergi untuk beberapa DBS NewSQL seperti VoltDb atau JustoneDb (berbasis cloud) yang mempertahankan perilaku yang sesuai dengan SQL dan ACID dan RDBMS "gen baru".
- Saya melihat neo4j (graphdb), tetapi tidak yakin apakah itu cocok dengan case-use ini
Dalam kasus penggunaan saya, lebih dari skalabilitas atau komputasi terdistribusi, saya melihat cara yang lebih baik untuk mencapai "Fleksibilitas dalam Skema + ACID + beberapa Kinerja yang masuk akal". Sebagian besar artikel yang saya dapat temukan di internet berbicara tentang fleksibilitas dalam skema sebagai penyebab mengarah pada kinerja (dalam kasus DB NoSQL) dan skalabilitas sambil meninggalkan sisi ACID / Transaksi.
Apakah ini merupakan "salah satu atau" kasus transaksi 'Skema fleksibilitas vs ACID' atau Apakah ada jalan keluar yang lebih baik?