Pemodelan Data di Cassandra

1. Gambaran keseluruhan

Cassandra adalah pangkalan data NoSQL yang menyediakan ketersediaan tinggi dan skalabiliti mendatar tanpa menjejaskan prestasi.

Untuk mendapatkan prestasi terbaik dari Cassandra, kita perlu merancang skema dengan teliti mengenai corak pertanyaan yang khusus untuk masalah perniagaan yang sedang dihadapi.

Dalam artikel ini, kami akan mengkaji beberapa konsep utama mengenai cara mendekati pemodelan data di Cassandra .

Sebelum meneruskan, anda boleh membaca artikel Cassandra dengan Java kami untuk memahami asas-asasnya dan cara menyambung ke Cassandra menggunakan Java.

2. Kekunci Partition

Cassandra adalah pangkalan data yang diedarkan di mana data dipartisi dan disimpan di pelbagai nod dalam kluster.

Kunci partition terdiri daripada satu atau lebih medan data dan digunakan oleh partitioner untuk menghasilkan token melalui hashing untuk menyebarkan data secara seragam di sekumpulan .

3. Kekunci Pengelompokan

Kekunci pengelompokan terdiri dari satu atau lebih bidang dan membantu dalam pengelompokan atau pengelompokan baris dengan kunci partisi yang sama dan menyimpannya dalam urutan yang disusun.

Katakan bahawa kami menyimpan data siri masa di Cassandra dan kami ingin mengambil data mengikut urutan kronologi. Kunci pengelompokan yang merangkumi bidang data siri masa akan sangat membantu untuk pengambilan data yang cekap untuk kes penggunaan ini.

Catatan: Kombinasi kunci partisi dan kunci kluster membentuk kunci utama dan mengenal pasti sebarang rekod dalam kluster Cassandra.

4. Garis Panduan Mengenai Corak Pertanyaan

Sebelum memulakan pemodelan data di Cassandra, kita harus mengenal pasti corak pertanyaan dan memastikan bahawa mereka mematuhi garis panduan berikut:

  1. Setiap pertanyaan harus mengambil data dari satu partisi
  2. Kita harus mengawasi berapa banyak data yang disimpan dalam partisi, kerana Cassandra mempunyai had sekitar jumlah lajur yang dapat disimpan dalam satu partisi
  3. Adalah wajar untuk mendormormalisasi dan mendua data untuk menyokong pelbagai jenis corak pertanyaan berbanding data yang sama

Berdasarkan garis panduan di atas, mari kita lihat beberapa kes penggunaan dunia nyata dan bagaimana kita akan memperagakan model data Cassandra untuknya.

5. Contoh Pemodelan Data Dunia Sebenar

5.1. Catatan Facebook

Katakanlah bahawa kita menyimpan catatan Facebook dari pengguna yang berbeza di Cassandra. Salah satu corak pertanyaan biasa adalah mengambil catatan ' N ' teratas yang dibuat oleh pengguna tertentu.

Oleh itu, kita perlu menyimpan semua data untuk pengguna tertentu pada satu partisi mengikut garis panduan di atas.

Juga, menggunakan cap waktu pos sebagai kunci kluster akan sangat berguna untuk mendapatkan catatan ' N ' teratas dengan lebih berkesan.

Mari tentukan skema jadual Cassandra untuk kes 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 pertanyaan untuk mencari 20 jawatan teratas untuk pengguna Anna :

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

5.2. Gimnasium di Seluruh Negara

Anggaplah bahawa kami menyimpan butiran gim gimnasium yang berlainan di pelbagai bandar dan negeri di banyak negara dan kami ingin mengambil gimnasium untuk bandar tertentu.

Juga, katakan kita perlu mengembalikan hasilnya dengan gim disusun mengikut tarikh pembukaannya.

Berdasarkan garis panduan di atas, kita harus menyimpan gimnasium yang terletak di bandar tertentu dari negara dan negara tertentu pada satu partisi dan menggunakan tarikh pembukaan dan nama gim sebagai kunci pengelompokan.

Mari tentukan skema jadual 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 pertanyaan yang menjumpai sepuluh gimnasium pertama pada tarikh pembukaannya untuk bandar Phoenix dalam negeri Arizona AS:

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

Seterusnya, mari kita lihat pertanyaan yang menjumpai sepuluh gimnasium yang dibuka baru-baru ini di bandar Phoenix dalam negeri 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: Oleh kerana urutan urutan pertanyaan terakhir bertentangan dengan urutan urutan yang ditentukan semasa pembuatan jadual, pertanyaan akan berjalan lebih perlahan kerana Cassandra pertama kali akan mengambil data dan kemudian menyusunnya dalam memori.

5.3. Pelanggan dan Produk E-dagang

Katakanlah kita menjalankan kedai e-dagang dan bahawa kita menyimpan maklumat Pelanggan dan Produk di Cassandra. Mari lihat beberapa corak pertanyaan umum mengenai kes penggunaan ini:

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

Kami akan bermula dengan menggunakan jadual berasingan untuk menyimpan maklumat Pelanggan dan Produk . Walau bagaimanapun, kita perlu memperkenalkan sejumlah besar denormalisasi untuk menyokong pertanyaan 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 memerlukan penyelaras untuk mengambil data dari beberapa nod, menyimpannya sementara di timbunan, dan kemudian mengumpulkan data sebelum mengembalikan hasilnya kepada pengguna
  • Pertanyaan berasaskan penyertaan - kerana sifatnya yang diedarkan, Cassandra tidak menyokong penyertaan jadual dalam pertanyaan dengan cara yang sama seperti pangkalan data hubungan, dan sebagai hasilnya, pertanyaan dengan gabungan akan menjadi lebih lambat dan juga dapat menyebabkan masalah ketidakkonsistenan dan ketersediaan

7. Kesimpulannya

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

Memahami konsep teras dan mengenal pasti corak pertanyaan terlebih dahulu adalah perlu untuk merancang model data yang betul yang mendapat prestasi terbaik dari kluster Cassandra.