Apa itu NoSQL? Database untuk masa depan skala cloud

Salah satu pilihan paling mendasar yang harus dibuat saat mengembangkan aplikasi adalah apakah akan menggunakan database SQL atau NoSQL untuk menyimpan data. Database SQL konvensional (yaitu relasional) adalah produk evolusi teknologi selama beberapa dekade, praktik yang baik, dan pengujian stres dunia nyata. Mereka dirancang untuk transaksi yang andal dan pertanyaan ad hoc, yang menjadi kebutuhan pokok aplikasi bisnis. Namun mereka juga terbebani dengan batasan — seperti skema kaku — yang membuatnya kurang cocok untuk jenis aplikasi lain.

Basis data NoSQL muncul sebagai tanggapan atas batasan tersebut. Sistem NoSQL menyimpan dan mengelola data dengan cara yang memungkinkan kecepatan operasional tinggi dan fleksibilitas tinggi di pihak pengembang. Banyak yang dikembangkan oleh perusahaan seperti Google, Amazon, Yahoo, dan Facebook yang mencari cara yang lebih baik untuk menyimpan konten atau memproses data untuk situs web besar. Tidak seperti database SQL, banyak database NoSQL dapat diskalakan secara horizontal di ratusan atau ribuan server.

Keuntungan NoSQL tidak datang tanpa biaya. Sistem NoSQL umumnya tidak memberikan tingkat konsistensi data yang sama dengan database SQL. Faktanya, sementara database SQL secara tradisional mengorbankan kinerja dan skalabilitas untuk properti ACID di balik transaksi yang dapat diandalkan, database NoSQL sebagian besar telah membuang jaminan ACID tersebut untuk kecepatan dan skalabilitas.

Singkatnya, database SQL dan NoSQL menawarkan pengorbanan yang berbeda. Sementara mereka dapat bersaing dalam konteks yang spesifik proyek-seperti, yang untuk memilih untuk ini aplikasi atau yang aplikasi mereka saling melengkapi dalam gambaran yang lebih besar. Masing-masing cocok untuk kasus penggunaan yang berbeda. Keputusannya bukanlah tentang salah satu / atau karena ini adalah pertanyaan tentang alat mana yang tepat untuk pekerjaan itu.

NoSQL vs. SQL

Perbedaan mendasar antara SQL dan NoSQL tidak terlalu rumit. Masing-masing memiliki filosofi yang berbeda tentang bagaimana data harus disimpan dan diambil.

Dengan database SQL, semua data memiliki struktur yang melekat. Database konvensional seperti Microsoft SQL Server, MySQL, atau Oracle Database menggunakan skema — definisi formal tentang bagaimana data yang dimasukkan ke dalam database akan disusun. Misalnya, kolom tertentu dalam tabel mungkin dibatasi hanya untuk bilangan bulat. Akibatnya, data yang terekam di kolom akan mengalami normalisasi yang tinggi. Skema kaku database SQL juga membuatnya relatif mudah untuk melakukan agregasi pada data, misalnya melalui JOIN.

Dengan NoSQL, data dapat disimpan dalam mode tanpa skema atau bentuk bebas. Data apa pun dapat disimpan dalam catatan apa pun. Di antara database NoSQL, Anda akan menemukan empat model umum untuk menyimpan data, yang mengarah ke empat jenis umum sistem NoSQL:

  1. Database dokumen (misalnya CouchDB, MongoDB). Data yang disisipkan disimpan dalam bentuk struktur JSON bentuk bebas atau "dokumen", di mana datanya dapat berupa apa saja, mulai dari bilangan bulat, string, hingga teks bentuk bebas. Tidak ada kebutuhan yang melekat untuk menentukan bidang apa, jika ada, dokumen akan berisi.
  2. Penyimpanan nilai kunci (misalnya Redis, Riak). Nilai bentuk bebas — dari bilangan bulat atau string sederhana hingga dokumen JSON yang kompleks — diakses dalam database melalui kunci.
  3. Penyimpanan kolom lebar (misalnya HBase, Cassandra). Data disimpan dalam kolom, bukan baris seperti dalam sistem SQL konvensional. Sejumlah kolom (dan oleh karena itu banyak tipe data yang berbeda) dapat dikelompokkan atau digabungkan sesuai kebutuhan untuk kueri atau tampilan data.
  4. Database grafik (misalnya Neo4j). Data direpresentasikan sebagai jaringan atau grafik entitas dan hubungannya, dengan setiap node dalam grafik berupa potongan data bentuk bebas.

Penyimpanan data tanpa skema berguna dalam skenario berikut:

  1. Anda menginginkan akses cepat ke data, dan Anda lebih mementingkan kecepatan dan kesederhanaan akses daripada transaksi atau konsistensi yang dapat diandalkan.
  2. Anda menyimpan data dalam jumlah besar, dan Anda tidak ingin mengunci diri Anda ke dalam skema, karena mengubah skema nanti bisa lambat dan menyakitkan.
  3. Anda mengambil data tidak terstruktur dari satu atau beberapa sumber yang memproduksinya, dan Anda ingin menyimpan data dalam bentuk aslinya untuk fleksibilitas maksimum.
  4. Anda ingin menyimpan data dalam struktur hierarki, tetapi Anda ingin hierarki tersebut dijelaskan oleh datanya sendiri, bukan skema eksternal. NoSQL memungkinkan data menjadi referensi mandiri biasa dengan cara yang lebih kompleks untuk ditiru oleh database SQL.

Membuat kueri database NoSQL

Bahasa Kueri Terstruktur yang digunakan oleh database tradisional menyediakan cara yang seragam untuk berkomunikasi dengan server saat menyimpan dan mengambil data. Sintaks SQL sangat terstandarisasi, jadi meskipun database individu dapat menangani operasi tertentu secara berbeda (misalnya, fungsi jendela), dasarnya tetap sama.

Sebaliknya, setiap database NoSQL cenderung memiliki sintaksnya sendiri untuk membuat kueri dan mengelola data. CouchDB, misalnya, menggunakan permintaan dalam bentuk JSON, dikirim melalui HTTP, untuk membuat atau mengambil dokumen dari database-nya. MongoDB mengirim objek JSON melalui protokol biner, melalui antarmuka baris perintah atau pustaka bahasa.

Beberapa produk NoSQL dapat menggunakan sintaks seperti SQL untuk bekerja dengan data, tetapi hanya sampai batas tertentu. Misalnya, Apache Cassandra, database penyimpanan kolom, memiliki bahasa mirip SQL-nya sendiri, Cassandra Query Language atau CQL. Beberapa sintaks CQL langsung dari buku pedoman SQL, seperti kata kunci SELECT atau INSERT. Tetapi tidak ada cara untuk melakukan JOIN atau subquery di Cassandra, dan dengan demikian kata kunci terkait tidak ada di CQL.

Arsitektur tanpa berbagi

Pilihan desain yang umum untuk sistem NoSQL adalah arsitektur "tanpa-bersama". Dalam desain shared-nothing, setiap node server dalam cluster beroperasi secara independen dari setiap node lainnya. Sistem tidak harus mendapatkan konsensus dari setiap node untuk mengembalikan sepotong data ke klien. Kueri cepat karena dapat dikembalikan dari node mana pun yang paling dekat atau paling nyaman.

Keuntungan lain dari shared-nothing adalah ketahanan dan skala-out. Menskalakan cluster semudah memutar node baru di cluster dan menunggu mereka untuk disinkronkan dengan yang lain. Jika node NoSQL turun, server lain di cluster akan terus berjalan. Semua data tetap tersedia, meskipun lebih sedikit node yang tersedia untuk melayani permintaan.

Perhatikan bahwa desain tanpa berbagi tidak eksklusif untuk database NoSQL. Banyak sistem SQL konvensional dapat diatur dengan cara yang tidak digunakan bersama, meskipun itu biasanya melibatkan pengorbanan konsistensi di seluruh cluster untuk kinerja.

Batasan NoSQL

Jika NoSQL memberikan begitu banyak kebebasan dan fleksibilitas, mengapa tidak meninggalkan SQL sepenuhnya? Jawaban sederhananya: Banyak aplikasi masih membutuhkan jenis kendala, konsistensi, dan pengamanan yang disediakan oleh database SQL. Dalam kasus tersebut, beberapa "keuntungan" dari NoSQL dapat berubah menjadi kerugian. Batasan lain berasal dari fakta bahwa sistem NoSQL relatif baru. 

Tidak ada skema

Bahkan jika Anda mengambil data bentuk bebas, Anda hampir selalu perlu memaksakan batasan padanya untuk membuatnya berguna. Dengan NoSQL, menerapkan batasan melibatkan pengalihan tanggung jawab dari database ke pengembang aplikasi. Misalnya, pengembang dapat menerapkan struktur melalui sistem pemetaan relasional objek, atau ORM. Tetapi jika Anda ingin skema hidup dengan datanya sendiri , NoSQL biasanya tidak melakukannya.

Beberapa solusi NoSQL menyediakan pengetikan data opsional dan mekanisme validasi data. Apache Cassandra, misalnya, memiliki banyak tipe data asli yang mengingatkan pada yang ditemukan di SQL konvensional.

Konsistensi akhirnya

Sistem NoSQL memperdagangkan konsistensi yang kuat atau langsung untuk ketersediaan dan kinerja yang lebih baik. Basis data konvensional memastikan bahwa operasi bersifat atomic (semua bagian transaksi berhasil, atau tidak ada), konsisten (semua pengguna memiliki tampilan data yang sama), terisolasi (transaksi tidak bersaing), dan tahan lama (setelah selesai, mereka akan tetap bertahan kegagalan server).

Keempat properti ini, secara kolektif disebut sebagai ACID, ditangani secara berbeda di sebagian besar sistem NoSQL. Alih-alih konsistensi langsung di seluruh kluster, Anda akhirnya memiliki konsistensi, karena waktu yang dibutuhkan untuk menyalin pembaruan ke node lain di kluster. Data yang dimasukkan ke dalam cluster pada akhirnya tersedia di mana saja, tetapi Anda tidak dapat menjamin kapan.

Semantik transaksi, yang dalam sistem SQL menjamin bahwa semua langkah dalam transaksi (misalnya menjalankan penjualan dan mengurangi inventaris) sudah selesai atau dibatalkan, biasanya tidak tersedia di NoSQL. Untuk sistem apa pun yang memerlukan "satu sumber kebenaran", seperti bank, pendekatan NoSQL tidak akan berfungsi dengan baik. Anda tidak ingin saldo bank Anda berbeda tergantung pada ATM mana yang Anda tuju; Anda ingin hal itu dilaporkan sebagai hal yang sama di mana-mana.

Beberapa database NoSQL memiliki mekanisme parsial untuk mengatasi hal ini. Misalnya, MongoDB memiliki jaminan konsistensi untuk operasi individu, tetapi tidak untuk database secara keseluruhan. Microsoft Azure CosmosDB memungkinkan Anda memilih tingkat konsistensi per permintaan, sehingga Anda dapat memilih perilaku yang sesuai dengan kasus penggunaan Anda. Tetapi dengan NoSQL, harapkan konsistensi akhirnya sebagai perilaku default.

Penguncian NoSQL

Kebanyakan sistem NoSQL secara konseptual serupa, tetapi diimplementasikan dengan sangat berbeda. Masing-masing cenderung memiliki metafora dan mekanisme tersendiri tentang bagaimana data dipertanyakan dan dikelola.

Salah satu efek sampingnya adalah kemungkinan tingginya tingkat penggabungan antara logika aplikasi dan database. Ini tidak terlalu buruk jika Anda memilih sistem NoSQL dan mematuhinya, tetapi itu bisa menjadi batu sandungan jika Anda mengubah sistem di jalan.

Jika Anda bermigrasi dari, misalnya, MongoDB ke CouchDB (atau sebaliknya), Anda harus melakukan lebih dari sekadar memigrasi data. Anda juga harus menavigasi perbedaan dalam akses data dan metafora terprogram — dengan kata lain, Anda harus menulis ulang bagian aplikasi Anda yang mengakses database.

Keterampilan NoSQL

Kelemahan lain dari NoSQL adalah relatif kurangnya keahlian. Di mana pasar untuk bakat SQL konvensional masih cukup besar, pasar untuk keterampilan NoSQL baru lahir.

Sebagai referensi, Indeed.com melaporkan bahwa hingga akhir tahun 2017, volume daftar pekerjaan untuk database SQL konvensional — MySQL, Microsoft SQL Server, Oracle Database, dan sebagainya — tetap lebih tinggi selama tiga tahun terakhir dibandingkan volume pekerjaan untuk MongoDB, Couchbase, dan Cassandra. Permintaan akan keahlian NoSQL terus meningkat, tetapi masih sebagian kecil dari pasar untuk SQL konvensional.

Menggabungkan SQL dan NoSQL

Kami dapat mengharapkan beberapa perbedaan antara sistem SQL dan NoSQL menghilang seiring waktu. Sudah banyak database SQL sekarang menerima dokumen JSON sebagai tipe data asli, dan dapat melakukan kueri terhadap data tersebut. Beberapa bahkan memiliki cara asli untuk menerapkan batasan pada data JSON, sehingga ditangani dengan ketelitian yang sama seperti data baris-dan-kolom konvensional.

Di sisi lain, database NoSQL tidak hanya menambahkan bahasa kueri seperti SQL, tetapi kemampuan lain dari database SQL tradisional. Misalnya, setidaknya dua database dokumen - MarkLogic dan RavenDB - berjanji untuk mematuhi ACID.

Di sana-sini ada tanda-tanda bahwa database generasi mendatang akan mengangkangi paradigma dan menawarkan fungsionalitas NoSQL dan SQL. Azure Cosmos DB Microsoft, misalnya, menggunakan serangkaian primitif di bawah tenda untuk mereproduksi perilaku kedua jenis sistem secara bergantian. Google Cloud Spanner adalah database SQL yang menggabungkan konsistensi yang kuat dengan skalabilitas horizontal sistem NoSQL.

Namun, SQL murni dan sistem NoSQL murni akan memiliki tempatnya selama bertahun-tahun yang akan datang. Lihat NoSQL untuk akses cepat dan sangat skalabel ke data bentuk bebas. Ini hadir dengan beberapa biaya, seperti konsistensi pembacaan dan pengamanan lain yang umum untuk database SQL. Tetapi untuk banyak aplikasi, pengamanan tersebut mungkin layak untuk diperdagangkan untuk apa yang ditawarkan NoSQL.