Apa itu NoSQL? Pangkalan data untuk masa depan skala awan

Salah satu pilihan yang paling mendasar untuk dibuat ketika mengembangkan aplikasi adalah apakah menggunakan pangkalan data SQL atau NoSQL untuk menyimpan data. Pangkalan data SQL konvensional (iaitu hubungan) adalah produk evolusi teknologi, amalan baik, dan ujian tekanan dunia nyata selama puluhan tahun. Mereka direka untuk transaksi yang boleh dipercayai dan pertanyaan ad hoc, asas aplikasi perniagaan. Tetapi mereka juga dibebani dengan sekatan - seperti skema kaku - yang menjadikannya kurang sesuai untuk jenis aplikasi lain.

Pangkalan data NoSQL muncul sebagai tindak balas terhadap batasan tersebut. Sistem NoSQL menyimpan dan mengurus data dengan cara yang memungkinkan kelajuan operasi yang tinggi dan fleksibiliti yang tinggi dari pihak pembangun. Banyak yang dikembangkan oleh syarikat seperti Google, Amazon, Yahoo, dan Facebook yang mencari cara yang lebih baik untuk menyimpan kandungan atau memproses data untuk laman web besar-besaran. Tidak seperti pangkalan data SQL, banyak pangkalan data NoSQL dapat diskalakan secara mendatar di ratusan atau ribuan pelayan.

Kelebihan NoSQL tidak datang tanpa kos. Sistem NoSQL umumnya tidak memberikan tahap konsistensi data yang sama dengan pangkalan data SQL. Sebenarnya, sementara pangkalan data SQL secara tradisional mengorbankan prestasi dan skalabilitas untuk sifat ACID di sebalik transaksi yang boleh dipercayai, pangkalan data NoSQL telah sebahagian besarnya membuang jaminan ACID tersebut untuk kelajuan dan skalabiliti.

Ringkasnya, pangkalan data SQL dan NoSQL menawarkan pertukaran yang berbeza. Walaupun mereka boleh bersaing dalam konteks khusus projek-seperti dalam, yang untuk memilih untuk ini permohonan atau bahawa aplikasi mereka saling melengkapi dalam gambar yang lebih besar. Masing-masing sesuai untuk kes penggunaan yang berbeza. Keputusan ini tidak banyak masalah sama ada / atau kerana persoalan alat mana yang sesuai untuk pekerjaan itu.

NoSQL vs SQL

Perbezaan asas antara SQL dan NoSQL tidak begitu rumit. Masing-masing mempunyai falsafah yang berbeza tentang bagaimana data harus disimpan dan diambil.

Dengan pangkalan data SQL, semua data mempunyai struktur yang wujud. Pangkalan data konvensional seperti Microsoft SQL Server, MySQL, atau Oracle Database menggunakan skema - definisi formal tentang bagaimana data yang dimasukkan ke dalam pangkalan data akan disusun. Sebagai contoh, lajur tertentu dalam jadual boleh dibatasi hanya untuk bilangan bulat. Akibatnya, data yang tercatat di lajur akan mempunyai tahap normalisasi yang tinggi. Skema tegar pangkalan data SQL juga menjadikannya agak mudah untuk melakukan agregasi pada data, misalnya dengan cara BERSAMA.

Dengan NoSQL, data dapat disimpan dalam bentuk tanpa skema atau bentuk bebas. Segala data boleh disimpan dalam rekod apa pun. Di antara pangkalan data NoSQL, anda akan menemui empat model umum untuk menyimpan data, yang membawa kepada empat jenis sistem NoSQL biasa:

  1. Pangkalan data dokumen (contohnya CouchDB, MongoDB). Data yang dimasukkan disimpan dalam bentuk struktur JSON bentuk bebas atau "dokumen", di mana data boleh berupa bilangan bulat hingga rentetan hingga teks bentuk bebas. Tidak ada keperluan yang jelas untuk menentukan bidang apa, jika ada, dokumen akan mengandungi.
  2. Kedai nilai utama (contohnya Redis, Riak). Nilai bentuk bebas - dari bilangan bulat atau rentetan sederhana hingga dokumen JSON kompleks - diakses dalam pangkalan data dengan menggunakan kunci.
  3. Kedai lajur yang luas (contohnya HBase, Cassandra). Data disimpan dalam lajur dan bukannya baris seperti dalam sistem SQL konvensional. Sebilangan lajur (dan oleh itu banyak jenis data yang berlainan) dapat dikelompokkan atau digabungkan seperti yang diperlukan untuk pertanyaan atau paparan data.
  4. Pangkalan data grafik (contohnya Neo4j). Data dilambangkan sebagai rangkaian atau grafik entiti dan hubungannya, dengan setiap simpul dalam grafik adalah sekumpulan data berbentuk bebas.

Penyimpanan data tanpa skema berguna dalam senario berikut:

  1. Anda mahukan akses cepat ke data, dan anda lebih mementingkan kelajuan dan kesederhanaan akses daripada transaksi atau konsistensi yang boleh dipercayai.
  2. Anda menyimpan sejumlah besar data, dan anda tidak mahu mengurung diri anda ke dalam skema, kerana menukar skema kemudian mungkin lambat dan menyakitkan.
  3. Anda mengambil data tidak berstruktur dari satu atau lebih sumber yang menghasilkannya, dan anda ingin menyimpan data tersebut dalam bentuk aslinya untuk fleksibiliti maksimum.
  4. Anda mahu menyimpan data dalam struktur hierarki, tetapi anda mahu hirarki tersebut dijelaskan oleh data itu sendiri, bukan skema luaran. NoSQL membolehkan data menjadi rujukan diri secara santai dengan cara yang lebih kompleks untuk dicontohi oleh pangkalan data SQL.

Meminta pangkalan data NoSQL

Bahasa Pertanyaan Berstruktur yang digunakan oleh pangkalan data tradisional menyediakan cara yang seragam untuk berkomunikasi dengan pelayan ketika menyimpan dan mengambil data. Sintaks SQL sangat standard, jadi sementara pangkalan data individu dapat menangani operasi tertentu secara berbeza (misalnya, fungsi tetingkap), asasnya tetap sama.

Sebaliknya, setiap pangkalan data NoSQL cenderung mempunyai sintaks sendiri untuk membuat pertanyaan dan mengurus data. CouchDB, misalnya, menggunakan permintaan dalam bentuk JSON, yang dikirim melalui HTTP, untuk membuat atau mengambil dokumen dari pangkalan data. MongoDB menghantar objek JSON melalui protokol binari, melalui antara muka baris perintah atau perpustakaan bahasa.

Beberapa produk NoSQL dapat menggunakan sintaks seperti SQL untuk bekerja dengan data, tetapi hanya pada tahap yang terhad. Sebagai contoh, Apache Cassandra, pangkalan data kedai lajur, mempunyai bahasa seperti SQL sendiri, Bahasa Pertanyaan Cassandra atau CQL. Sebilangan sintaks CQL langsung keluar dari buku main SQL, seperti kata kunci SELECT atau INSERT. Tetapi tidak ada cara untuk melakukan JOIN atau subkueri di Cassandra, dan dengan itu kata kunci yang berkaitan tidak ada dalam CQL.

Senibina tanpa apa-apa

Pilihan reka bentuk yang biasa dilakukan oleh sistem NoSQL adalah seni bina "shared-nothing". Dalam reka bentuk bersama-sama, setiap nod pelayan di kluster beroperasi secara bebas daripada setiap nod yang lain. Sistem tidak perlu mendapatkan kata sepakat dari setiap simpul untuk mengembalikan sekeping data kepada pelanggan. Pertanyaan cepat kerana dapat dikembalikan dari mana-mana nod yang paling dekat atau paling senang.

Kelebihan lain yang tidak dapat dikongsi bersama adalah ketahanan dan peningkatan skala. Mengeluarkan kluster semudah memutar simpul baru di kluster dan menunggu mereka menyegerakkan dengan yang lain. Sekiranya node NoSQL turun, pelayan lain dalam kluster akan terus digunakan. Semua data tetap tersedia, walaupun terdapat lebih sedikit nod yang tersedia untuk melayani permintaan.

Perhatikan bahawa reka bentuk bersama-sama tidak eksklusif untuk pangkalan data NoSQL. Banyak sistem SQL konvensional dapat disiapkan secara bersama-sama, walaupun biasanya melibatkan pengorbanan konsistensi di seluruh kelompok untuk prestasi.

Batasan NoSQL

Sekiranya NoSQL memberikan banyak kebebasan dan fleksibiliti, mengapa tidak meninggalkan sepenuhnya SQL? Jawapan mudah: Banyak aplikasi masih memerlukan jenis kekangan, konsistensi, dan perlindungan yang disediakan oleh pangkalan data SQL. Dalam kes tersebut, beberapa "kelebihan" NoSQL boleh berubah menjadi keburukan. Batasan lain berpunca dari fakta bahawa sistem NoSQL relatif baru. 

Tiada skema

Walaupun anda mengambil data dalam bentuk bebas, anda hampir selalu memerlukan batasan untuk menjadikannya berguna. Dengan NoSQL, memaksakan kekangan melibatkan memindahkan tanggungjawab dari pangkalan data kepada pembangun aplikasi. Sebagai contoh, pengembang dapat menerapkan struktur melalui sistem pemetaan relasional objek, atau ORM. Tetapi jika anda mahu skema hidup dengan data itu sendiri , NoSQL biasanya tidak melakukannya.

Beberapa penyelesaian NoSQL menyediakan mekanisme penaip dan pengesahan data pilihan untuk data. Apache Cassandra, misalnya, memiliki banyak jenis data asli yang mengingatkan pada yang terdapat dalam SQL konvensional.

Konsistensi akhirnya

Sistem NoSQL berdagang kuat atau konsisten segera untuk ketersediaan dan prestasi yang lebih baik. Pangkalan data konvensional memastikan bahawa operasi bersifat atom (semua bahagian transaksi berjaya, atau tidak ada), konsisten (semua pengguna mempunyai pandangan data yang sama), terpencil (transaksi tidak bersaing), dan tahan lama (setelah selesai mereka akan bertahan kegagalan pelayan).

Keempat sifat ini, secara kolektif disebut sebagai ACID, ditangani secara berbeza di kebanyakan sistem NoSQL. Daripada konsistensi segera di kluster, anda akhirnya mempunyai konsistensi, kerana masa yang diperlukan untuk menyalin kemas kini ke nod lain di kluster. Data yang dimasukkan ke dalam kluster akhirnya tersedia di mana-mana, tetapi anda tidak dapat menjamin kapan.

Semantik transaksi, yang dalam sistem SQL menjamin bahawa semua langkah dalam transaksi (misalnya melaksanakan penjualan dan mengurangkan inventori) sama ada selesai atau digulung kembali, biasanya tidak tersedia di NoSQL. Untuk mana-mana sistem di mana perlu ada "satu sumber kebenaran," seperti bank, pendekatan NoSQL tidak akan berfungsi dengan baik. Anda tidak mahu baki bank anda berbeza bergantung pada ATM mana anda pergi; anda mahu ia dilaporkan sebagai perkara yang sama di mana sahaja.

Beberapa pangkalan data NoSQL mempunyai mekanisme separa untuk mengatasi masalah ini. Sebagai contoh, MongoDB mempunyai jaminan konsistensi untuk operasi individu, tetapi tidak untuk pangkalan data secara keseluruhan. Microsoft Azure CosmosDB membolehkan anda memilih tahap konsistensi setiap permintaan, sehingga anda dapat memilih tingkah laku yang sesuai dengan kes penggunaan anda. Tetapi dengan NoSQL, harapkan konsistensi akhirnya sebagai tingkah laku lalai.

Pengunci masuk NoSQL

Sebilangan besar sistem NoSQL secara konseptual serupa, tetapi dilaksanakan dengan sangat berbeza. Masing-masing cenderung mempunyai metafora dan mekanisme tersendiri untuk bagaimana data ditanyakan dan diuruskan.

Satu kesan sampingan dari itu adalah tahap gandingan berpotensi tinggi antara logik aplikasi dan pangkalan data. Ini tidak begitu buruk jika anda memilih sistem NoSQL dan tetap menggunakannya, tetapi ia boleh menjadi batu sandungan jika anda menukar sistem di jalan raya.

Sekiranya anda berpindah dari, katakanlah, MongoDB ke CouchDB (atau sebaliknya), anda mesti melakukan lebih daripada sekadar memindahkan data. Anda juga mesti menavigasi perbezaan akses data dan metafora terprogram — dengan kata lain, anda mesti menulis semula bahagian aplikasi anda yang mengakses pangkalan data.

Kemahiran NoSQL

Kelemahan lain untuk NoSQL adalah kekurangan kepakaran yang relatif. Di mana pasaran untuk bakat SQL konvensional masih cukup besar, pasaran untuk kemahiran NoSQL baru muncul.

Sebagai rujukan, Indeed.com melaporkan bahawa pada akhir tahun 2017, jumlah senarai pekerjaan untuk pangkalan data SQL konvensional — MySQL, Microsoft SQL Server, Pangkalan Data Oracle, dan sebagainya — kekal lebih tinggi dalam tiga tahun terakhir daripada jumlah pekerjaan untuk MongoDB, Couchbase, dan Cassandra. Permintaan untuk kepakaran NoSQL semakin meningkat, tetapi masih merupakan sebahagian kecil dari pasaran untuk SQL konvensional.

Menggabungkan SQL dan NoSQL

Kita boleh menjangkakan beberapa perbezaan antara sistem SQL dan NoSQL akan hilang dari masa ke masa. Sudah banyak pangkalan data SQL sekarang menerima dokumen JSON sebagai jenis data asli, dan dapat melakukan pertanyaan terhadap data tersebut. Beberapa malah mempunyai cara asli untuk mengenakan batasan pada data JSON, sehingga dapat ditangani dengan ketegasan yang sama seperti data baris-dan-lajur konvensional.

Di sisi lain, pangkalan data NoSQL tidak hanya menambahkan bahasa pertanyaan seperti SQL, tetapi kemampuan lain dari pangkalan data SQL tradisional. Sebagai contoh, sekurang-kurangnya dua pangkalan data dokumen - MarkLogic dan RavenDB - berjanji untuk mematuhi ACID.

Di sana-sini terdapat tanda-tanda bahawa pangkalan data generasi akan datang akan merangkumi paradigma dan menawarkan fungsi NoSQL dan SQL. Microsoft, Azure Cosmos DB, misalnya, menggunakan sekumpulan primitif di bawah tudung untuk secara bergantian menghasilkan semula tingkah laku kedua-dua jenis sistem tersebut. Google Cloud Spanner adalah pangkalan data SQL yang menggabungkan konsistensi yang kuat dengan skalabiliti mendatar sistem NoSQL.

Namun, sistem SQL tulen dan NoSQL tulen akan tetap ada selama bertahun-tahun akan datang. Lihat ke NoSQL untuk mendapatkan akses cepat ke data berbentuk bebas. Ini datang dengan beberapa kos, seperti konsistensi pembacaan dan perlindungan lain yang biasa dilakukan pada pangkalan data SQL. Tetapi untuk banyak aplikasi, perlindungan tersebut mungkin bernilai untuk apa yang ditawarkan oleh NoSQL.