Setelah pada artikel sebelumnya saya sudah menjelaskan sedikit tentang Apache Cassandra, sekarang akan saya lanjutkan pembahasan mengenai data model dari Cassandra. Cassandra memiliki data model yang bisa dibilang terinspirasi data model dari Google BigTable.Cassandra memiliki data model yang paling mudah kita anggap saja sebagai array/hash 4 atau 5 dimensi.
Berikut ini adalah beberapa konsep atau istilah yang ada dalam Cassandra:
- Cluster : Mesin (Nodes) yang terinstall Cassandra. Dalam satu cluster bisa terdapat beberapa node atau Keyspace.
- Keyspace : Namespace dari beberapa ColumnFamily. Jika di dalam RDMS, maka disebut Database.
- ColumnFamily : Jika dalam RDMS biasa disebut sebagai table. ColumnFamily berisi column-column, yang masing-masing column mempunyai nama, nilai (value), dan timestamp, dan direferensikan oleh row keys (primary key dalam RDMS).
- SuperColumn : bisa dianggap sebagai column yang mana mereka mempunyai sub-column.
Column
Column adalah bagian data yang terkecil di dalam Cassandra. Yang berupa tuple (triplet) yang berisi nama column (name), nilai column (value), dan timestamp.
Dibawah ini adalah representasi Column dalam thrift interface dan JSON:
- Thrift Interface
- JSON
struct Column {
1: binary name,
2: binary value,
3: i64 timestamp,
}
{
name: "namalengkap", // nama column
value: "Hendro Wibowo", // nilai column
timestamp: 123456789 // timestamp
}
Untuk lebih mudah pemahaman, kita abaikan saja terlebih dahulu timestamp. Jadi hanya pasangan name dan value saja yang kita lihat. Name dan value ini mempunyai tipe data binary (byte) dan tidak ada batasan berapa panjang karakter yang akan diisikan.
SuperColumn
SuperColumn adalah sebuah tuple yang mempunyai nama dan nilai yang berupa column-column dengan jumlah yang tidak terbatas (yang direferensikan oleh column name). Dalam notasi JSON maka bias kita gambarkan sebagai berikut:
{
name : "KasKus", // Nama SuperColumn
value :
{
// Column-column yang merupakan nilai dari SuperColumn
company { name : “company”, value : “PT Darta Media Indonesia”, timestamp : 123456 },
address { name : “address”, value : “Jl Melawai X No 3-5”, timestamp : 123456 },
city { name : “city”, value : “Jakarta”, timestamp : 123456 }
}
}
Perbedaan mendasar dari column dan supercolumn adalah nilainya. Jika pada column nilainya adalah berisi string, maka pada supercolumn nilainya berisi column-column (map of column). Dan juga pada supercolumn tidak mempunyai timestamp.
ColumnFamily
Ada sebuah struktur tunggal (single structure) untuk mengelompokkan Column dan SuperColumn dalam sebuah kesatuan. Struktur ini disebut sebagai ColumnFamily yang mempunyai dua macam jenis yaitu Standard dan Super. Sebuah ColumnFamily bisa berisi column dan supercolumn dalam jumlah yang tidak terbatas.
Perbedaan dari ColumnFamily tipe Standard dan Super adalah jika pada ColumnFamily bertipe Standard hanya berisi column-column saja, sedangkan pada ColumnFamily bertipe Super bisa berisi SuperColumn selain hanya Column saja.
Berikut ini adalah contoh ColumnFamily:
KaskusUser = { // ColumnFamily bertipe Super
name : “weeladalah”, // column name, bisa berfungsi sebagai row key
value : {
fullname:{name:“fullname”,value:“Hendro Wibowo”,timestamp: 12345 },
address:{name:“address”,value:“Jl Bambu Kuning 10”,timestamp: 12345 },
totalpost:{name:“totalpost”, value:100, timestamp:12345 }
},
name : “ferry”,
value : { // SuperColumn
fullname: { name: “fullname”, value: “Ferry”, timestamp: 12345 },
address: { name: “address”, value: “Jl Melawai X”, timestamp: 12345 },
totalpost: { name: “totalpost”, value: 134, timestamp: 12345 }
friends : {
name: “friends”, value:
{
// Berisi data daftar friends
}
}
}
}
Lalu bagaimana cara mengurutkan data dalam Cassandra? Cassandra tidak menggunakan SQL atau query untuk menampilkan data yang kita inginkan. Data akan diurutkan segera setelah kita memasukkan (insert) data tersebut ke dalam cluster (database server) dan data tersebut akan selalu terurut. Inilah mengapa Cassandra mempunyai kecepatan baca yang jauh lebih baik daripada relational database tetapi untuk mendapatkan performa yang baik, kita harus mempunyai perencanaan yang baik terhadap data model yang akan kita buat.
Data akan selalu diurutkan berdasarkan nama column dan juga berdasarkan tipe pengurutan yang kita tentukan di dalam opsi CompareWith yang terdapat storage-conf.xml. Tipe-tipe pengurutan tersebut antara lain BytesType, UTF8Type, LexicalUUIDType, TimeUUIDType, AsciiType, and LongType.