Pemodelan Data di Cassandra

1. Ikhtisar

Cassandra adalah database NoSQL yang menyediakan ketersediaan tinggi dan skalabilitas horizontal tanpa mengorbankan kinerja.

Untuk mendapatkan performa terbaik dari Cassandra, kita perlu merancang skema dengan cermat di sekitar pola kueri yang spesifik untuk masalah bisnis yang dihadapi.

Pada artikel ini, kami akan meninjau beberapa konsep utama seputar bagaimana pendekatan pemodelan data di Cassandra .

Sebelum melanjutkan, Anda dapat membaca artikel Cassandra dengan Java kami untuk memahami dasar-dasar dan cara menyambung ke Cassandra menggunakan Java.

2. Kunci Partisi

Cassandra adalah database terdistribusi di mana data dipartisi dan disimpan di banyak node dalam sebuah cluster.

Kunci partisi terdiri dari satu atau lebih bidang data dan digunakan oleh pemartisi untuk menghasilkan token melalui hashing untuk mendistribusikan data secara seragam di seluruh kluster .

3. Kunci Pengelompokan

Kunci pengelompokan terdiri dari satu atau beberapa bidang dan membantu dalam pengelompokan atau pengelompokan bersama baris dengan kunci partisi yang sama dan menyimpannya dalam urutan yang diurutkan.

Katakanlah kita menyimpan data deret waktu di Cassandra dan kita ingin mengambil data dalam urutan kronologis. Kunci pengelompokan yang menyertakan bidang data deret waktu akan sangat membantu untuk pengambilan data yang efisien untuk kasus penggunaan ini.

Catatan: Kombinasi kunci partisi dan kunci pengelompokan membentuk kunci utama dan secara unik mengidentifikasi catatan apa pun di cluster Cassandra.

4. Panduan Seputar Pola Query

Sebelum memulai dengan pemodelan data di Cassandra, kita harus mengidentifikasi pola kueri dan memastikan bahwa mereka mematuhi pedoman berikut:

  1. Setiap kueri harus mengambil data dari satu partisi
  2. Kita harus melacak berapa banyak data yang disimpan di sebuah partisi, karena Cassandra memiliki batasan jumlah kolom yang dapat disimpan dalam satu partisi.
  3. Anda boleh mendenormalisasi dan menduplikasi data untuk mendukung jenis pola kueri yang berbeda pada data yang sama

Berdasarkan pedoman di atas, mari kita lihat beberapa kasus penggunaan dunia nyata dan bagaimana kita akan membuat model model data Cassandra untuk mereka.

5. Contoh Pemodelan Data Dunia Nyata

5.1. Posting Facebook

Misalkan kita menyimpan posting Facebook dari pengguna yang berbeda di Cassandra. Salah satu pola kueri umum adalah mengambil pos ' N ' teratas yang dibuat oleh pengguna tertentu.

Dengan demikian, kami perlu menyimpan semua data untuk pengguna tertentu pada satu partisi sesuai pedoman di atas.

Selain itu, menggunakan stempel waktu posting sebagai kunci pengelompokan akan membantu untuk mengambil posting ' N ' teratas dengan lebih efisien.

Mari tentukan skema tabel Cassandra untuk kasus penggunaan ini:

CREATE TABLE posts_facebook ( user_id uuid, post_id timeuuid, content text, PRIMARY KEY (user_id, post_id) ) WITH CLUSTERING ORDER BY (post_id DESC);

Sekarang, mari tulis kueri untuk menemukan 20 posting teratas untuk pengguna Anna :

SELECT content FROM posts_facebook WHERE user_id = "Anna_id" LIMIT 20

5.2. Gym di Seluruh Negeri

Misalkan kami menyimpan detail gym mitra yang berbeda di berbagai kota dan negara bagian di banyak negara dan kami ingin mengambil gym untuk kota tertentu.

Juga, katakanlah kita perlu mengembalikan hasil setelah gym diurutkan berdasarkan tanggal pembukaannya.

Berdasarkan pedoman di atas, kita harus menyimpan gym yang terletak di kota tertentu dari negara bagian dan negara tertentu pada satu partisi dan menggunakan tanggal pembukaan dan nama gym sebagai kunci pengelompokan.

Mari tentukan skema tabel Cassandra untuk contoh ini:

CREATE TABLE gyms_by_city ( country_code text, state text, city text, gym_name text, opening_date timestamp, PRIMARY KEY ( (country_code, state_province, city), (opening_date, gym_name)) WITH CLUSTERING ORDER BY (opening_date ASC, gym_name ASC);

Sekarang, mari kita lihat kueri yang mengambil sepuluh gym pertama menurut tanggal pembukaannya untuk kota Phoenix di negara bagian Arizona AS:

SELECT * FROM gyms_by_city WHERE country_code = "us" AND state = "Arizona" AND city = "Phoenix" LIMIT 10

Selanjutnya, mari kita lihat kueri yang mengambil sepuluh gym yang paling baru dibuka di kota Phoenix di negara bagian Arizona AS:

SELECT * FROM gyms_by_city WHERE country_code = "us" and state = "Arizona" and city = "Phoenix" ORDER BY opening_date DESC LIMIT 10

Catatan: Karena urutan kueri terakhir berlawanan dengan urutan yang ditentukan selama pembuatan tabel, kueri akan berjalan lebih lambat karena Cassandra pertama-tama akan mengambil data dan kemudian mengurutkannya di memori.

5.3. Pelanggan dan Produk E-niaga

Katakanlah kita menjalankan toko e-commerce dan bahwa kita menyimpan informasi Pelanggan dan Produk di dalam Cassandra. Mari kita lihat beberapa pola kueri umum seputar kasus penggunaan ini:

  1. Dapatkan info Pelanggan
  2. Dapatkan info Produk
  3. Dapatkan semua Pelanggan yang menyukai Produk tertentu
  4. Dapatkan semua Produk yang disukai Pelanggan

Kami akan mulai dengan menggunakan tabel terpisah untuk menyimpan informasi Pelanggan dan Produk . Namun, kami perlu memperkenalkan sejumlah besar denormalisasi untuk mendukung kueri ke-3 dan ke-4 yang ditunjukkan di atas.

We will create two more tables to achieve this – “Customer_by_Product” and “Product_by_Customer“.

Let's look at the Cassandra table schema for this example:

CREATE TABLE Customer ( cust_id text, first_name text, last_name text, registered_on timestamp, PRIMARY KEY (cust_id)); CREATE TABLE Product ( prdt_id text, title text, PRIMARY KEY (prdt_id)); CREATE TABLE Customer_By_Liked_Product ( liked_prdt_id text, liked_on timestamp, title text, cust_id text, first_name text, last_name text, PRIMARY KEY (prdt_id, liked_on)); CREATE TABLE Product_Liked_By_Customer ( cust_id text, first_name text, last_name text, liked_prdt_id text, liked_on timestamp, title text, PRIMARY KEY (cust_id, liked_on));

Note: To support both the queries, recently-liked products by a given customer and customers who recently liked a given product, we have used the “liked_on” column as a clustering key.

Let's look at the query to find the ten Customers who most recently liked the product “Pepsi“:

SELECT * FROM Customer_By_Liked_Product WHERE title = "Pepsi" LIMIT 10

And let's see the query that finds the recently-liked products (up to ten) by a customer named “Anna“:

SELECT * FROM Product_Liked_By_Customer WHERE first_name = "Anna" LIMIT 10

6. Inefficient Query Patterns

Due to the way that Cassandra stores data, some query patterns are not at all efficient, including the following:

  • Mengambil data dari beberapa partisi - ini akan membutuhkan koordinator untuk mengambil data dari beberapa node, menyimpannya sementara di heap, dan kemudian menggabungkan data sebelum mengembalikan hasil kepada pengguna
  • Kueri berbasis gabungan - karena sifatnya yang terdistribusi, Cassandra tidak mendukung tabel bergabung dalam kueri dengan cara yang sama seperti database relasional, dan akibatnya, kueri dengan gabungan akan lebih lambat dan juga dapat menyebabkan masalah ketidakkonsistenan dan ketersediaan

7. Kesimpulan

Dalam tutorial ini, kami telah membahas beberapa praktik terbaik tentang cara mendekati pemodelan data di Cassandra.

Memahami konsep inti dan mengidentifikasi pola kueri sebelumnya diperlukan untuk merancang model data yang benar yang mendapatkan kinerja terbaik dari cluster Cassandra.