17.9.10

Cassandra Data Model #1

[Column | SuperColumn] >- [ColumnFamily | SuperColumnFamily] >- Keyspace/Application >- Cluster

โครงสร้างข้อมูลของ Cassandra แบ่งออกเป็นสองประเภทหลักๆ ได้แก่ Column และ SuperColumn ซึ่งสองชนิดนี้สามารถจัดกลุ่มรวมกันได้โดยใช้อีกสองประเภทคือ ColumnFamily และ SuperColumnFamily

Schema
Cassandra จะเป็นลักษณะของไม่มี schema (schema-less) จะเห็นภาพชัดขึ้นเมื่อพูดถึง Column Family

Cluster
หนึ่ง Clusters สามารถเก็บได้หลาย keyspace

Columns
โครงสร้างข้อมูลจะประกอบด้วยสามส่วนได้แก่ name, value และ timestamp
public class Column {
 Byte[] name;
 Byte[] value;
 Long timestamp;
}
ถ้ามองเป็นโครงสร้างแบบ JSON จะได้รูปแบบดังนี้
{
 "name": "emailAddress"
 "value": "foo@bar.com"
 "timestamp": 123456789
}
ค่า name และ value จะเก็บเป็น binary ถึงแม้ว่า application จะใ้ช้ UTF8 ก็ตาม และสังเกตุว่ามีการเก็บค่า timestamp ด้วย ซึ่งมันถูกใช้เพื่อแก้ปัญหาความขัดแย้งกันของข้อมูล โดยจะเกิดเมื่อเรามีข้อมูลเดียวกันสองชุด ค่านี้จะบอกเราว่าข้อมูลชุดใดเป็นเวอร์ชั่นใหม่สุด และข้อมูลเก่าจะถูกแทนที่ด้วยข้อมูลที่ใหม่กว่า
บางครั้งเวลาเราพูดถึง column มักจะตัด timestamp และมองภาพแค่การจับคู่กันของ name กับ value
ดังนั้นในเอกสารนี้ส่วนของ timestamp จะถูกตัดออกเพื่อให้อ่านง่ายขึ้น

SuperColumns
โครงสร้างข้อมูลของ SuperColumn จะเก็บ name และ value โดย value จะเก็บ map ของ key/Column โดย key จะมีค่าเหมือนกับชื่อของ column ที่มันเก็บอยู่ (มองง่ายๆ SuperColumn จะเก็บ Column อีกที ซึ่งมีมากกว่าหนึ่งก็ได้)
สิ่งที่แตกต่างระหว่าง Column และ SuperColumn คือ Column.value เก็บชนิดข้อมูลเป็น String แต่ SuperColumn.value เก็บชนิดข้อมูลเป็น map ของ column และ SuperColumn ไม่เก็บ timestamp ซึ่งค่านี้จะเก็บอยู่ใน Column เท่านั้น
ถ้ามองในมุม Java เราจะเขียนโครงสร้างได้หน้าตาดังนี้ ซึ่งดูแล้วง่ายกว่ามองจากรูปมาก
public class SuperColumn {
 Byte[] name;
 Map value;
}
SuperColumn sc = new SuperColumn();
sc.name = “person1”;
sc.value.put(“firstname”, new Column(“firstname”, “Ronald”));
sc.value.put(“lastname”, new Column(“familyname”, “Mathies”));
ถ้ามองเป็นโครงสร้าง JSON จะได้ดังรูปนี้
{
 name: “Post”
 value: {
  “title”: {name: “title”, value: “Cassandra data model”, timestamp: 123456789},
  “body”: {name: “body”, value: “Blah Blah ...”, timestamp: 123456789},
  “author”: {name: “author”, value: “Phamonyut”, timestamp: 123456789},
 }, 
 name: “Tag”
 value {
  “0”: {name: “0”, value: “cassandra”, timestamp: 123456789},
  “1”: {name: “1”, value: “nosql”, timestamp: 123456789},
 }
}

No comments:

Post a Comment