Definisikan kolom statis
Misalkan tabel Cassandra menyimpan informasi pengguna (seperti alamat email dan kata sandi) serta pembaruan status pengguna. Umumnya, informasi pengguna jarang berubah, sedangkan status pengguna sering diperbarui. Jika informasi pengguna diperbarui setiap kali status berubah, sejumlah besar ruang penyimpanan akan terpakai.
Cassandra menyediakan fitur kolom statis untuk menangani masalah ini. Kolom statis yang dideklarasikan dalam kunci partisi yang sama hanya memiliki satu nilai, yang berarti hanya satu set data dalam kolom tersebut yang disimpan.
Menentukan kolom statis
Tambahkan STATIC di akhir nama kolom untuk menentukan kolom sebagai kolom statis, seperti yang ditunjukkan dalam contoh berikut:
CREATE TABLE "iteblog_users_with_status_updates" (
"username" text,
"id" timeuuid,
"email" text STATIC,
"encrypted_password" blob STATIC,
"body" text,
PRIMARY KEY ("username", "id")
);
Perintah di atas mengatur kedua bidang email dan encrypted_password sebagai STATIC. Ini menunjukkan bahwa sebuah username hanya memiliki satu nilai email dan satu nilai encrypted_password.
Batasan pada kolom statis
Anda tidak dapat menambahkan kata kunci STATIC ke kolom di setiap tabel. Kolom statis memiliki batasan berikut:
Kolom pengelompokan (juga dikenal sebagai kunci pengelompokan) tidak didefinisikan untuk tabel, seperti yang ditunjukkan dalam contoh berikut:
cqlsh:iteblog_keyspace> CREATE TABLE "iteblog_users_with_status_updates_invalid" (
... "username" text,
... "id" timeuuid,
... "email" text STATIC,
... "encrypted_password" blob STATIC,
... "body" text,
... PRIMARY KEY ("username")
... );
InvalidRequest: Error from server: code=2200 [Invalid query] message="Static columns are only useful (and thus allowed) if the table has at least one clustering column"
Anda tidak dapat membuat kolom statis dalam tabel iteblog_users_with_status_updates_invalid karena tabel tersebut hanya memiliki kunci utama dan kolom pengelompokan tidak didefinisikan. Semakin banyak baris data untuk kunci partisi yang sama menghasilkan performa yang lebih baik untuk kolom statis. Jika tidak ada kolom pengelompokan yang didefinisikan, nilai kunci utama mengidentifikasi baris unik dalam partisi dan kolom statis tidak diperlukan.
Tabel diatur ke tabel COMPACT STORAGE, seperti yang ditunjukkan dalam contoh berikut:
cqlsh:iteblog_keyspace> CREATE TABLE "iteblog_users_with_status_updates_invalid" (
... "username" text,
... "id" timeuuid,
... "email" text STATIC,
... "encrypted_password" blob STATIC,
... "body" text,
... PRIMARY KEY ("username", "id")
... )WITH COMPACT STORAGE;
InvalidRequest: Error from server: code=2200 [Invalid query] message="Static columns are not supported in COMPACT STORAGE tables"
Kolom yang digunakan sebagai bagian dari kunci partisi atau kolom pengelompokan tidak dapat diatur menjadi STATIC, seperti yang ditunjukkan dalam contoh berikut:
cqlsh:iteblog_keyspace> CREATE TABLE "iteblog_users_with_status_updates_invalid" (
... "username" text,
... "id" timeuuid STATIC,
... "email" text STATIC,
... "encrypted_password" blob STATIC,
... "body" text,
... PRIMARY KEY ("username", "id")
... );
InvalidRequest: Error from server: code=2200 [Invalid query] message="Static column id cannot be part of the PRIMARY KEY"
cqlsh:iteblog_keyspace> CREATE TABLE "iteblog_users_with_status_updates_invalid" (
... "username" text,
... "id" timeuuid,
... "email" text STATIC,
... "encrypted_password" blob STATIC,
... "body" text,
... PRIMARY KEY (("username", "id"), email)
... );
InvalidRequest: Error from server: code=2200 [Invalid query] message="Static column email cannot be part of the PRIMARY KEY"
Menyisipkan data ke dalam tabel yang berisi kolom statis
Data dimasukkan ke dalam tabel yang berisi kolom statis dengan cara yang mirip dengan memasukkan data ke dalam tabel standar. Sebagai contoh, Anda dapat menjalankan pernyataan berikut untuk memasukkan data ke dalam tabel iteblog_users_with_status_updates:
cqlsh:iteblog_keyspace> INSERT INTO "iteblog_users_with_status_updates"
... ("username", "id", "email", "encrypted_password", "body")
... VALUES (
... 'iteblog',
... NOW(),
... 'iteblog_hadoop@iteblog.com',
... 0x877E8C36EFA827DBD4CAFBC92DD90D76,
... 'Learning Cassandra!'
... );
cqlsh:iteblog_keyspace> select username, email, encrypted_password, body from iteblog_users_with_status_updates;
username | email | encrypted_password | body
----------+----------------------------+------------------------------------+---------------------
iteblog | iteblog_hadoop@iteblog.com | 0x877e8c36efa827dbd4cafbc92dd90d76 | Learning Cassandra!
(1 rows)
Sebuah baris data dimasukkan ke dalam tabel. Pernyataan di atas telah melakukan dua operasi berikut:
Semua data dalam kolom email dan encrypted_password untuk username iteblog diatur ke iteblog_hadoop@iteblog.com dan 0x877e8c36efa827dbd4cafbc92dd90d76.
Sebuah baris untuk body Learning Cassandra! ditambahkan ke partisi iteblog. Jalankan pernyataan berikut untuk memasukkan baris lain ke dalam tabel:
cqlsh:iteblog_keyspace> INSERT INTO "iteblog_users_with_status_updates"
... ("username", "id", "body")
... VALUES ('iteblog', NOW(), 'I love Cassandra!') ;
cqlsh:iteblog_keyspace> select username, email, encrypted_password, body from iteblog_users_with_status_updates;
username | email | encrypted_password | body
----------+----------------------------+------------------------------------+---------------------
iteblog | iteblog_hadoop@iteblog.com | 0x877e8c36efa827dbd4cafbc92dd90d76 | Learning Cassandra!
iteblog | iteblog_hadoop@iteblog.com | 0x877e8c36efa827dbd4cafbc92dd90d76 | I love Cassandra!
(2 rows)
cqlsh:iteblog_keyspace>
Pernyataan menunjukkan bahwa kolom email dan encrypted_password tidak ditentukan ketika data dimasukkan ke dalam tabel. Namun, hasil kueri menunjukkan bahwa nilai dari dua kolom dalam baris baru sama dengan nilai yang ditentukan dalam pernyataan sebelumnya.
Pengguna memodifikasi alamat email karena beberapa alasan, seperti yang ditunjukkan dalam contoh berikut:
cqlsh:iteblog_keyspace> UPDATE iteblog_users_with_status_updates SET email = 'iteblog@iteblog.com'
... WHERE username = 'iteblog';
cqlsh:iteblog_keyspace> select username, email, encrypted_password, body from iteblog_users_with_status_updates;
username | email | encrypted_password | body
----------+---------------------+------------------------------------+---------------------
iteblog | iteblog@iteblog.com | 0x877e8c36efa827dbd4cafbc92dd90d76 | Learning Cassandra!
iteblog | iteblog@iteblog.com | 0x877e8c36efa827dbd4cafbc92dd90d76 | I love Cassandra!
(2 rows)
Hasil kueri menunjukkan bahwa semua email dari username iteblog dimodifikasi menjadi email baru karena kolom email bersifat statis.
Tabel menyimpan informasi pengguna seperti alamat email dan kata sandi. Jika pengguna memodifikasi alamat email dan kata sandi di halaman frontend, sistem backend harus mendapatkan alamat email dan kata sandi saat ini dengan menjalankan pernyataan berikut:
cqlsh:iteblog_keyspace> SELECT "username", "email", "encrypted_password"
... FROM "iteblog_users_with_status_updates"
... WHERE "username" = 'iteblog';
username | email | encrypted_password
----------+---------------------+------------------------------------
iteblog | iteblog@iteblog.com | 0x877e8c36efa827dbd4cafbc92dd90d76
iteblog | iteblog@iteblog.com | 0x877e8c36efa827dbd4cafbc92dd90d76
(2 rows)
Semua baris alamat email dan kata sandi untuk username iteblog dikembalikan. Hasil ini tidak terduga. Anda dapat menjalankan pernyataan SELECT DISTINCT untuk menghilangkan baris duplikat:
cqlsh:iteblog_keyspace> SELECT DISTINCT "username", "email", "encrypted_password"
... FROM "iteblog_users_with_status_updates"
... WHERE "username" = 'iteblog';
username | email | encrypted_password
----------+---------------------+------------------------------------
iteblog | iteblog@iteblog.com | 0x877e8c36efa827dbd4cafbc92dd90d76
(1 rows)
Semua baris duplikat untuk username iteblog dihilangkan, dan baris unik muncul di akhir.
Cassandra tidak melakukan operasi DISTINCT untuk semua data dari username iteblog. Hal ini karena satu set data kolom statis disimpan dalam sistem yang mendasarinya.