Apakah menggunakan server database masuk akal jika aplikasi hanya melakukan sesuatu secara lokal?

41

Saya telah melihat beberapa aplikasi yang pada dasarnya adalah perangkat lunak aplikasi yang berjalan secara lokal ke sistem (sehingga mereka tidak banyak berkomunikasi melalui jaringan). Aplikasi ini tampaknya bergantung pada server database untuk menyimpan datanya.

Contoh aplikasi adalah Amarok (pemutar musik populer di Linux). Saya tidak tahu apakah mereka masih melakukan ini, tetapi saya ingat ada waktu di mana menginstal Amarok berarti Anda harus menginstal server MySQL dan menjalankannya di latar belakang setiap saat.

Apa keuntungan menggunakan server untuk penyimpanan lokal dibandingkan dengan menggunakan solusi SQL tertanam yang lebih kecil seperti sqlite? Saya berbicara tentang perangkat lunak aplikasi secara umum, belum tentu amarok (itu hanya contoh). Apakah ada situasi di mana menggunakan server database masuk akal dibandingkan dengan database tertanam?

9a3eedi
sumber
4
Memiliki database mungkin sangat penting. Memiliki database dalam proses atau database proses terpisah adalah pilihan / detail implementasi.
9000
2
Aku mengerti itu. Pertanyaannya lebih lanjut tentang mengapa Anda memilih database proses yang terpisah (seperti server mysql) daripada database dalam-proses (seperti SQLite) untuk aplikasi lokal.
9a3eedi

Jawaban:

29

SQLite menawarkan ikhtisar yang bagus tentang kapan harus menggunakannya atau tidak vs alternatif:

https://www.sqlite.org/whentouse.html

Baris ringkasan ini menangkap kasus penggunaan SQLite dengan sangat baik dalam pengalaman saya:

SQLite tidak bersaing dengan database klien / server. SQLite bersaing dengan fopen ().

Artikel ini membahas panjang lebar tentang hal ini. Ini juga memiliki bagian berjudul "Situasi Di Mana Seorang Klien / Server RDBMS Dapat Bekerja Lebih Baik". Singkatnya, mereka adalah:

  • Aplikasi Klien / Server : beberapa pengguna melalui jaringan.
  • Situs Web bervolume tinggi : menulis intensif atau membaca cukup intensif sehingga membutuhkan sharding.
  • Kumpulan data sangat besar : lebih besar dari yang dapat disimpan dalam satu disk.
  • High Concurrency : khususnya penulisan bersamaan.
Denis de Bernardy
sumber
@ 9a3eedi: sebenarnya, di antara empat titik itu tidak ada yang menggambarkan skenario dengan server database lengkap dalam kombinasi dengan penyimpanan lokal (terutama dua yang pertama adalah kebalikan dari itu) - jadi maukah Anda menjelaskan kepada kami mengapa Anda memilih ini menjawab, meskipun tidak cocok dengan pertanyaan awal Anda? Ngomong-ngomong, saya memberikan jawaban ini downvote tepat untuk alasan itu.
Doc Brown
@DocBrown: Kasus khusus di mana Anda harus menggunakan RDBMS klien / server adalah [lihat jawaban]; untuk semua yang lain SQLite berfungsi dengan baik. Saya tidak yakin apa yang tidak jelas di sana, jadi silakan mengedit jawabannya jika Anda yakin itu diperlukan.
Denis de Bernardy
Pertanyaan aslinya adalah tentang kasus-kasus tertentu di mana basis data ac / s masuk akal jika aplikasi hanya melakukan hal-hal secara lokal (mengutip dari judul), atau menggunakan server untuk penyimpanan lokal (mengutip dari teks pertanyaan). Keempat skenario di atas adalah kebalikan dari itu (dua yang pertama) atau sangat tidak mungkin atau tidak biasa sebagai skenario "lokal" (yang kedua). Jadi apa yang Anda tulis tidak salah, tetapi tidak sesuai dengan pertanyaan.
Doc Brown
@DocBrown - dan jawaban singkatnya adalah: tidak masuk akal kecuali Anda berurusan dengan set data yang terlalu besar atau membutuhkan penulisan bersamaan. (Atau, untuk alasan yang jelas, membutuhkan sesuatu yang SQLite tidak tawarkan.) Sekali lagi, jangan ragu untuk mengedit jawaban jika hal itu tidak jelas bagi Anda.
Denis de Bernardy
Nah, jika Anda benar-benar berpikir bahwa daftar itu sudah lengkap (jadi berikan pernyataan tersembunyi bahwa untuk skenario lokal penggunaan server C / S DB tidak masuk akal), maka saya tidak setuju, dan saya tidak berpikir saya dapat meningkatkan jawaban Anda dengan menambahkan beberapa klarifikasi.
Doc Brown
28

Bahkan untuk sistem tunggal dengan satu pengguna, server database "nyata" masuk akal:

  1. Ini menggunakan bahasa yang dikenal ( SQL ). SQLite memang menggunakan SQL, tetapi beberapa database yang disematkan (mis. Database objek , NoSQL ) tidak menggunakan SQL. Mereka cenderung memiliki kurva belajar yang lebih tinggi karena mereka kurang umum.
  2. Ini memberikan integritas referensial, kendala, pemicu, dll. Bahwa produk seperti SQLite mungkin tidak menyediakan atau setidaknya menyediakan tidak secara penuh.
  3. Dengan menargetkan basis data jaringan yang benar-benar multi-pengguna, ACID , aplikasi memiliki opsi untuk bekerja dalam skenario satu pengguna / stasiun kerja tunggal, atau sebagai aplikasi multi-pengguna, yang dihosting menggunakan basis kode yang sama .
  4. Pengguna memiliki kemampuan untuk memeriksa data offline menggunakan alat standar (misalnya SQL Developer, MySQL Workbench, SQL Server Management Studio), memuat atau mencadangkan data menggunakan alat tersebut, dll. Meskipun dimungkinkan untuk melakukannya dengan banyak basis data tertanam dari berbagai jenis, orang mungkin lebih akrab dengan alat-alat itu dari dunia basis data C / S.

Kelemahan utama adalah perlu menginstal dan memelihara perangkat lunak server database, yang agak rumit untuk pengguna nonteknis (dan bahkan banyak pengguna teknis). Sistem operasi seperti Linux membuat ini lebih mudah: Saya memiliki PostgreSQL dan MySQL yang berjalan di sistem Linux saya. Saya telah menginstal aplikasi yang menghubungkan mereka dengan sedikit atau tanpa interaksi di pihak saya.

Doc Brown
sumber
9
Sebenarnya, ada satu sistem basis data (yaitu Sybase SQL Anywhere) dengan dukungan SQL penuh, integritas referensial, ACID, prosedur tersimpan, yang tidak memerlukan pengaturan server atau instalasi sebagai layanan ketika dijalankan dalam konfigurasi lokal (meskipun dapat pengaturan untuk lingkungan multi-pengguna). Saya tidak tahu sistem database lain dengan properti ini, jika ada yang tahu, saya akan tertarik.
Doc Brown
3
@DocBrown IIRC MS SQLServer Compact memberi Anda ini karena ia hadir sebagai dll, meskipun LocalDB mungkin merupakan pilihan yang lebih baik - tidak memerlukan instalasi sebagai layanan meskipun memerlukan hak admin.
gbjbaanb
5
Untuk menambah diskusi validitas kelemahan - selain dari SQLite yang dengan anehnya telah disebutkan dalam jawaban, sejumlah database non-SQL dan sistem seperti database, misalnya OrientDB, Solr, dan lainnya, telah mendedikasikan dukungan penyematan .
mikołak
14
SQLite memang memberikan integritas referensial (meskipun perlu dihidupkan) dan kendala dasar. Ini juga jauh lebih cepat daripada kebanyakan server jika digunakan dengan benar. Kerugian utama dibandingkan dengan server adalah bahwa itu adalah penulis tunggal.
Jan Hudec
2
@DocBrown: Basis data tertanam Firebird menyediakan dukungan SQL penuh, termasuk integritas referensial, jaminan ACID, procs dan pemicu tersimpan. Itu tidak digunakan untuk mendukung beberapa koneksi konkuren ke database tertanam, dan saya tidak yakin apakah batasan itu masih ada atau tidak, tetapi seluruh set fitur SQL ada di sana.
Mason Wheeler
21

Saya pikir itu ada hubungannya dengan inersia.

Amarok didasarkan pada XMMS yang berasal dari tahun 1997. Untuk harus memiliki kemampuan database yang baik Anda harus menggunakan server, karena itu jauh lebih kuat daripada solusi berbasis file, yang sama sekali tidak memiliki kemampuan database yang baik.

Yang akan datang dan mendapatkan popularitas dari database embedded lokal yang bagus seperti SQLlite adalah sesuatu yang cukup baru.

Pieter B
sumber
Dari apa yang saya ingat, AmaroK 1 (yang mungkin didasarkan pada XMMS) tidak bergantung pada server database. Itu Amarok 2, yang dirilis dengan KDE4 yang memperkenalkan ketergantungan, dan pada saat itu saya merasa sangat aneh bahwa mereka akan meminta saya untuk menginstal MySQL dan tetap menjalankannya di latar belakang
9a3eedi
10

Fitur diskriminatif yang paling penting adalah konkurensi .

Jika Anda hanya memiliki satu aplikasi yang berjalan dalam satu contoh untuk pengguna, solusi tertanam (apakah sqlite atau penyimpanan objek) biasanya OK.

Namun jika Anda memiliki beberapa instance yang perlu memanipulasi database secara bersamaan, Anda harus memiliki server untuk menyinkronkannya. SQLite hanya memungkinkan satu penulisan pada satu waktu, di seluruh basis data, dan begitu juga sebagian besar solusi tertanam lainnya. Dan jika Anda bahkan memiliki beberapa aplikasi, Anda cenderung memerlukan spesifikasi kendala yang lebih terperinci yang umumnya tidak diizinkan oleh solusi tertanam.

Jan Hudec
sumber
5

Banyak jawaban lain berbicara tentang konkurensi sebagai keuntungan, tetapi juga karena db berjalan sebagai server, basis data dapat menjalankan tugas tanpa perlu menjalankan aplikasi. Ini bisa berupa pemeliharaan, pencadangan, sinkronisasi dengan server lain atau tugas terjadwal lainnya.

Jika Anda merasa aplikasi Anda bisa berubah menjadi aplikasi klien / server, Anda mungkin ingin memulai dengan menggunakan RDBMS dari awal alih-alih memindahkannya nanti.

Saya tidak tahu apakah contoh yang diberikan mengambil keuntungan dari ini atau tidak.

JeffO
sumber
2

Kecuali Anda menjalankan sistem tertanam dengan memori dan cpu rendah, saya tidak berpikir bahwa menjalankan server di latar belakang akan membahayakan Anda.

Menjalankan server basis data secara lokal tidak masalah. Basis data dimaksudkan untuk mengakses dan memanipulasi data. Akses jaringan merupakan nilai tambah, yang mungkin atau mungkin tidak diperlukan. Ada beberapa alat teknik dan ilmiah yang melakukan ini.

Katakanlah Anda menggunakan data, pada aplikasi lokal. Mengapa Anda tidak menggunakan database? sebagai lawan dari apa?

cauchy
sumber
Jika saya menyebarkan aplikasi ke pengguna normal (katakanlah pemutar musik seperti AmaroK), saya akan berpikir bahwa memiliki mereka menginstal server MySQL dan menjalankannya di latar belakang adalah sedikit terlalu banyak persyaratan sistem dan akan menjadi sesuatu yang pengguna akan tidak suka. Tapi saya rasa itu tergantung pada aplikasinya. Ini bertentangan dengan menggunakan sesuatu seperti SQLite.
9a3eedi
2

Itu tergantung pada abstraksi data Anda dan keseluruhan ruang aplikasi, persyaratan manajemen akses, investasi yang Anda rencanakan pada pemeliharaan data, urgensi prototipe yang diperlukan, di mana Anda berada dalam kurva pembelajaran, dll.

Jika Anda ingin memastikan basis data yang terintegrasi erat dengan aplikasi yang tidak memerlukan akses dari aplikasi lain, buat pulau-pulau dari basis data yang tertanam. Implementasi Mozilla Firefox Web Storage dengan SQLite dapat diberikan sebagai contoh.

Jika Anda membutuhkan efisiensi yang lebih besar dengan data yang terbatas, pemilihan desain In-Memory Database lebih disukai.

Di sisi lain, jika Anda memiliki banyak aplikasi yang menjalankan beberapa kueri pada data yang sama, dan itu membutuhkan penataan penyimpanan data yang lebih baik untuk mengoptimalkan kinerja, diperlukan DBMS terpusat. Saya benar-benar akan lebih suka untuk penelitian ilmiah, ketika itu membutuhkan sejumlah besar data dan di mana waktu respons kueri akan memengaruhi pengalaman pengguna secara keseluruhan secara drastis.

Untuk kasus Amarok, saya kira itu adalah pilihan DBMS open-source pada saat itu, sebelum mereka memilih jalur database tertanam.

Jika ada definisi sistem khusus di tangan Anda, akan lebih mudah untuk kontra dan pro.

V / r, Umut

Umut Kahramankaptan
sumber