Partition key là gì

Khi tạo mô hình dữ liệu cho keyspace, việc quan trọng nhất cần làm chính là bỏ qua các hiểu biết về mô hình dữ liệu trong cơ sở dữ liệu quan hệ, mô hình dữ liệu trong cơ sở dữ liệu quan hệ được thiết kế nhằm đảm bảo cho việc lưu trữ hiệu quả, giảm tối đa việc dư thừa dữ liệu, xây dựng các mối quan hệ và liên kết giữa các bảng hoặc các thực thể với nhau. Mô hình dữ liệu trong Cassandra được thiết kế với mục đích hoàn toàn khác đó là giúp việc thao tác với dữ liệu hiệu quả và có thể lưu trữ được một khối lượng dữ liệu khổng lồ.
Không giống cơ sở dữ liệu quan hệ, mô hình dữ liệu (data model) trong Cassandra được thiết kế dựa trên mục đích truy vấn dữ liệu, điều này có nghĩa là developer phải biết được đọc và ghi như thế nào, lưu vào đâu trước khi thiết kế model dữ liệu. Việc này cũng áp dụng đối với việc đánh index trong Cassandra, việc tao ra các index trong Cassandra cũng là kết quả của việc phân tích các câu truy vấn, xem cần lấy các thông tin gì, có thường xuyên hay không, từ đó người ta mới dựa vào đó để đánh index cho trường đó.

Cassandra Data Model

Để biết được cách tạo model dữ liệu trong Cassandra, trước hết chúng ta phải hiểu được cơ chết hoạt động của Data model trong Cassandra. Cassandra được xây dựng dựa trên hai nền tảng Amazons Dyamo và Googles BigTable.
Khi sử dụng CQL (Cassandra Query Language) để tạo table (Column Family) developer đã làm hai việc:
Xác định tên cho cơ sở dữ liệu và xác định kiểu dữ liệu cho các column.
Xác định cách lưu trữ dữ liệu và xác định số bản sao của dữ liệu, công việc này được thực hiện khi developer chỉ định PRIMARY KEY cho table. Giá trị của PRIMARY KEY sẽ quyết định nơi mà dữ liệu của Row đó được lưu trữ, PRIMARY KEY còn được gọi là PARTITION KEY (Khóa phân vùng).
Khi đề cập tới PRIMARY KEY người ta thường đề cập tới một số thuật ngữ: partition key, composite/compound key, clustering key. trong đó:
Partition key chịu trách nhiệm phân bổ dữ liệu qua các node (server).
Clustering key chịu trách nhiệm sắp xếp dữ liệu theo Partition key.
Primary key tương đương với Partition key trong trường hợp key được tạo nên mới một field.
Composite/Compound key là key được tạo nên bởi nhiều hơn một field.
Ví dụ:

create table myBlog (
myKey text PRIMARY KEY,
data text
);

Trường hợp này Primary chính là Partition key (myKey).

create tablemyBlog(
key_part_one text,
key_part_two int,
data text,
PRIMARY KEY(key_part_one, key_part_two)
);

Trong trường hợp này chúng ta có Composite primary key (được tạo nên bởi 2 fields: key_part_one và key_part_two) trong đó key_part_onepartition key còn key_part_twoclustering key

Partition key và clustering key cũng có thể được tạo nên bởi nhiều fields, ví dụ:

create table myBlog (
k_part_one text,
k_part_two int,
k_clust_one text,
k_clust_two int,
k_clust_three uuid,
data text,
PRIMARY KEY((k_part_one,k_part_two), k_clust_one, k_clust_two, k_clust_three)
);

Trong trường hợp này (k_part_one,k_part_two) là partition key còn k_clust_one, k_clust_two, k_clust_three là cácclustering key

Cần lưu ý rằng trong câu query tối thiểu chúng ta phải cung cấp partition key cho mệnh đề where. trong trường hợp composite partition key:
PRIMARY KEY((col1, col2), col10, col4))
Chúng ta chỉ có thể thực hiện được câu query khi cung cấp đủ col1 và col2, sau đó chúng ta có thể thêm các điều kiện theo thứ tự thiết lập key, ví dụ:
col1, col2, col10
col1, col2, col10, col4.
câu query sẽ không thực thi khi chúng ta đặt điều kiện như sau:
col1, col2, col4hoặc câu query không chứa col1 và col2.

Xây dựng câu truy vấn, không thiết kế mô hình dữ liệu

Khi thiết kế cấu trúc dữ liệu (cấu trúc bảng) trong Cassandra người ta dựa trên các câu truy vấn để gia tăng tính performance. Trong Cassandra, dữ liệu của mỗi row không bị phân mảnh trên các node (dữ liệu của mỗi row được lưu trữ trên mỗi node riêng biệt) vì thế khi dữ liệu trên một row lớn, số lần thực hiện câu query trên key đó nhiều sẽ xảy ra tình trạng bị nghẽn. Để tránh tình trạng này các developer thường cố gắng thiết kế sao cho các dữ liệu cần lấy có thể thực hiện bởi một câu query (hoặc sử dụng ít câu query nhất).
Chi phí cho không gian lưu trữ dữ liệu là rẻ hơn rất nhiều, so với chi phí để gia tăng performane cho hệ thống, vì thế việc chuẩn hóa dữ liệu là không phù hợp khi sử dụng Cassandra, Cassandra không hỗ trợ các phương thức join giữa các bảng để lấy dữ liệu, vì vậy trước khi thiết kế, cần cân nhắc kỹ các câu query để đưa ra được một model hợp lý nhất.
Collections:Cassandra đồng thời cũng cung cấp Collections như một phần của model dữ liệu.

  • Set: Khi sử dụng model dữ liệu này, các giá trị dữ liệu không được trùng lặp nhau.
  • List: Khi sử dụng List, cũng giống như Set, nhưng khác ở chỗ là có thể lưu được duplicate dữ liệu.
  • Map: Dữ liệu được lưu ở dạng Key value.

Một điểm đáng lưu ý khi sử dụng Collections trong Cassandra đó là, khi thêm dữ liệu vào Set, List hay Map thì đồng nghĩa với Row đó tăng thêm một Column.

Share this:

  • Twitter
  • Facebook

Like this:

Like Loading...