Tôi đã đọc các bài báo trên mạng để hiểu sự khác biệt giữa các key
loại sau . Nhưng nó chỉ có vẻ khó để tôi nắm bắt. Ví dụ chắc chắn sẽ giúp làm cho sự hiểu biết tốt hơn.
primary key,
partition key,
composite key
clustering key
Tôi đã đọc các bài báo trên mạng để hiểu sự khác biệt giữa các key
loại sau . Nhưng nó chỉ có vẻ khó để tôi nắm bắt. Ví dụ chắc chắn sẽ giúp làm cho sự hiểu biết tốt hơn.
primary key,
partition key,
composite key
clustering key
Câu trả lời:
Có rất nhiều nhầm lẫn xung quanh điều này, tôi sẽ cố gắng làm cho nó đơn giản nhất có thể.
Khóa chính là một khái niệm chung để chỉ ra một hoặc nhiều cột được sử dụng để truy xuất dữ liệu từ Bảng.
Khóa chính có thể là SIMPLE và thậm chí được khai báo nội tuyến:
create table stackoverflow_simple (
key text PRIMARY KEY,
data text
);
Điều đó có nghĩa là nó được tạo bởi một cột duy nhất.
Nhưng khóa chính cũng có thể là COMPOSITE (còn gọi là SO SÁNH ), được tạo từ nhiều cột hơn.
create table stackoverflow_composite (
key_part_one text,
key_part_two int,
data text,
PRIMARY KEY(key_part_one, key_part_two)
);
Trong một tình huống của COMPOSITE khóa chính, các "phần đầu" của khóa được gọi là PARTITION KEY (trong ví dụ này key_part_one là chìa khóa phân vùng) và phần thứ hai của khóa là KEY Clustering (trong ví dụ này key_part_two )
Xin lưu ý rằng cả phân vùng và khóa phân cụm có thể được tạo bởi nhiều cột hơn , dưới đây là:
create table stackoverflow_multiple (
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)
);
Đằng sau những cái tên này ...
Thông tin sử dụng khác: TÀI LIỆU ĐẠT
insert into stackoverflow_simple (key, data) VALUES ('han', 'solo');
select * from stackoverflow_simple where key='han';
bảng nội dung
key | data
----+------
han | solo
COMPOSITE / COMPOUND KEY có thể truy xuất "các hàng rộng" (tức là bạn có thể truy vấn chỉ bằng phím phân vùng, ngay cả khi bạn đã xác định các khóa phân cụm)
insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('ronaldo', 9, 'football player');
insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('ronaldo', 10, 'ex-football player');
select * from stackoverflow_composite where key_part_one = 'ronaldo';
bảng nội dung
key_part_one | key_part_two | data
--------------+--------------+--------------------
ronaldo | 9 | football player
ronaldo | 10 | ex-football player
Nhưng bạn có thể truy vấn bằng tất cả khóa (cả phân vùng và phân cụm) ...
select * from stackoverflow_composite
where key_part_one = 'ronaldo' and key_part_two = 10;
đầu ra truy vấn
key_part_one | key_part_two | data
--------------+--------------+--------------------
ronaldo | 10 | ex-football player
Lưu ý quan trọng: khóa phân vùng là chỉ định tối thiểu cần thiết để thực hiện truy vấn bằng cách sử dụng a where clause
. Nếu bạn có một khóa phân vùng tổng hợp, như sau
ví dụ: PRIMARY KEY((col1, col2), col10, col4))
Bạn chỉ có thể thực hiện truy vấn bằng cách chuyển ít nhất cả col1 và col2, đây là 2 cột xác định khóa phân vùng. Quy tắc "chung" để thực hiện truy vấn là bạn phải vượt qua ít nhất tất cả các cột khóa phân vùng, sau đó bạn có thể thêm tùy chọn từng khóa phân cụm theo thứ tự chúng được đặt.
vì vậy các truy vấn hợp lệ là ( không bao gồm các chỉ mục phụ )
Không hợp lệ:
Hi vọng điêu nay co ich.
Thêm một câu trả lời tóm tắt là câu trả lời được chấp nhận là khá dài. Các thuật ngữ "hàng" và "cột" được sử dụng trong ngữ cảnh của CQL, chứ không phải cách Cassandra thực sự được triển khai.
Ví dụ:
PRIMARY KEY (a)
: Khóa phân vùng là a
.PRIMARY KEY (a, b)
: Khóa phân vùng là a
, khóa phân cụm là b
.PRIMARY KEY ((a, b))
: Phím phân vùng tổng hợp là (a, b)
.PRIMARY KEY (a, b, c)
: Khóa phân vùng là a
, khóa phân cụm tổng hợp là (b, c)
.PRIMARY KEY ((a, b), c)
: Khóa phân vùng tổng hợp là (a, b)
, khóa phân cụm là c
.PRIMARY KEY ((a, b), c, d)
: Khóa phân vùng tổng hợp là (a, b)
, khóa phân cụm tổng hợp là (c, d)
.Trong cassandra, sự khác biệt giữa khóa chính, khóa phân vùng, khóa tổng hợp, khóa phân cụm luôn gây ra một số nhầm lẫn .. Vì vậy, tôi sẽ giải thích bên dưới và liên quan đến nhau. Chúng tôi sử dụng CQL (Ngôn ngữ truy vấn Cassandra) để truy cập cơ sở dữ liệu Cassandra. Lưu ý: - Trả lời theo phiên bản cập nhật của Cassandra. Khóa chính :-
CREATE TABLE Cass (
id int PRIMARY KEY,
name text
);
Create Table Cass (
id int,
name text,
PRIMARY KEY(id)
);
Trong CQL, thứ tự các cột được xác định cho các vấn đề CHÍNH. Cột đầu tiên của khóa được gọi là khóa phân vùng có thuộc tính rằng tất cả các hàng chia sẻ cùng một khóa phân vùng (trên thực tế trên bảng) được lưu trữ trên cùng một nút vật lý. Ngoài ra, việc chèn / cập nhật / xóa trên các hàng chia sẻ cùng một khóa phân vùng cho một bảng đã cho được thực hiện nguyên tử và tách biệt. Lưu ý rằng có thể có khóa phân vùng tổng hợp, tức là khóa phân vùng được tạo thành từ nhiều cột, sử dụng một bộ dấu ngoặc đơn bổ sung để xác định cột nào tạo thành khóa phân vùng.
Phân vùng và phân cụm Định nghĩa PRIMARY KEY được tạo thành từ hai phần: Khóa phân vùng và Cột phân cụm. Phần đầu tiên ánh xạ tới phím hàng của công cụ lưu trữ, trong khi phần thứ hai được sử dụng để nhóm các cột liên tiếp.
CREATE TABLE device_check (
device_id int,
checked_at timestamp,
is_power boolean,
is_locked boolean,
PRIMARY KEY (device_id, checked_at)
);
Ở đây device_id là khóa phân vùng và check_at là cluster_key.
Chúng ta có thể có nhiều khóa cụm cũng như khóa phân vùng phụ thuộc vào khai báo.
Khóa chính : Bao gồm (các) khóa phân vùng [và các khóa phân cụm (hoặc cột) tùy chọn]
Khóa phân vùng : Giá trị băm của Khóa phân vùng được sử dụng để xác định nút cụ thể trong cụm để lưu trữ
Khóa phân cụm dữ liệu : Được sử dụng để sắp xếp dữ liệu trong mỗi phân vùng (hoặc nút chịu trách nhiệm và đó là bản sao)
Khóa chính hợp chất : Như đã nói ở trên, các khóa phân cụm là tùy chọn trong Khóa chính. Nếu họ không được đề cập, đó là một khóa chính đơn giản. Nếu các khóa phân cụm được đề cập, đó là khóa chính Hợp chất.
Khóa phân vùng hỗn hợp : Chỉ sử dụng một cột làm khóa phân vùng, có thể dẫn đến các sự cố hàng rộng (phụ thuộc vào mô hình sử dụng / mô hình dữ liệu). Do đó, khóa phân vùng đôi khi được chỉ định là sự kết hợp của nhiều hơn một cột.
Liên quan đến sự nhầm lẫn về cái nào là bắt buộc , cái nào có thể bỏ qua, v.v. trong một truy vấn, cố gắng tưởng tượng Cassandra như một HashMap khổng lồ giúp. Vì vậy, trong HashMap, bạn không thể truy xuất các giá trị mà không có Khóa.
Ở đây, các phím phân vùng đóng vai trò của khóa đó. Vì vậy, mỗi truy vấn cần phải có chúng được chỉ định. Nếu không có Cassandra sẽ không biết nút nào để tìm kiếm.
Các khóa phân cụm (các cột, là tùy chọn) giúp thu hẹp hơn nữa tìm kiếm truy vấn của bạn sau khi Cassandra tìm ra nút cụ thể (và đó là bản sao) chịu trách nhiệm cho khóa Phân vùng cụ thể đó.
Hiểu ngắn gọn:
Khóa phân vùng không có gì ngoài nhận dạng cho một hàng, phần lớn nhận dạng đó là cột đơn (được gọi là Khóa chính ) đôi khi là sự kết hợp của nhiều cột (được gọi là Khóa phân vùng tổng hợp ).
Khóa cụm không có gì ngoài Lập chỉ mục & Sắp xếp . Khóa cụm phụ thuộc vào một số điều:
Những cột bạn sử dụng trong mệnh đề where trừ các cột khóa chính.
Nếu bạn có hồ sơ rất lớn thì tôi có thể chia ngày để quản lý dễ dàng. Ví dụ, tôi có dữ liệu của 1 triệu hồ sơ dân số quận. Vì vậy, để dễ dàng quản lý, tôi phân cụm dữ liệu dựa trên trạng thái và sau mã pin, v.v.
Đáng lưu ý, có lẽ bạn sẽ sử dụng những thứ đó nhiều hơn trong các khái niệm tương tự trong thế giới quan hệ (khóa tổng hợp).
Ví dụ - giả sử bạn phải tìm N người dùng cuối cùng mới tham gia nhóm người dùng X. Làm thế nào bạn có thể thực hiện việc đọc hiệu quả này là chủ yếu trong trường hợp này? Như thế (từ hướng dẫn chính thức của Cassandra ):
CREATE TABLE group_join_dates (
groupname text,
joined timeuuid,
join_date text,
username text,
email text,
age int,
PRIMARY KEY ((groupname, join_date), joined)
) WITH CLUSTERING ORDER BY (joined DESC)
Ở đây, khóa phân vùng là chính hợp chất và khóa phân cụm là một ngày tham gia. Lý do tại sao khóa phân cụm là ngày tham gia là vì các kết quả đã được sắp xếp (và được lưu trữ, giúp tìm kiếm nhanh). Nhưng tại sao chúng ta sử dụng khóa ghép để phân vùng khóa ? Bởi vì chúng tôi luôn muốn đọc càng ít phân vùng càng tốt . Làm thế nào để đưa jo_date vào đó giúp? Bây giờ người dùng từ cùng một nhóm và cùng ngày tham gia sẽ nằm trong một phân vùng duy nhất! Điều này có nghĩa là chúng ta sẽ luôn đọc càng ít phân vùng càng tốt (trước tiên hãy bắt đầu bằng cái mới nhất, sau đó chuyển sang cái cũ hơn, v.v., thay vì nhảy giữa chúng).
Trong thực tế, trong trường hợp nặng bạn cũng sẽ cần phải sử dụng các hash của một join_date chứ không phải là một join_date một mình - vì vậy mà nếu bạn truy vấn trong 3 ngày cuối cùng thường là những người chia sẻ cùng một băm và do đó có sẵn từ cùng một phân vùng!
Khóa chính trong Cassandra thường bao gồm hai phần - Khóa phân vùng và cột Clustering.
chính_key ((phân vùng_key), phân cụm_col)
Khóa phân vùng - Phần đầu tiên của khóa chính. Mục đích chính của khóa phân vùng là xác định nút lưu trữ hàng cụ thể.
CREATE TABLE phone_book (phone_num int, name text, age int, city text, PRIMARY KEY ((phone_num, name), age);
Ở đây, (phone_num, name) là khóa phân vùng. Trong khi chèn dữ liệu, giá trị băm của khóa phân vùng được tạo và giá trị này quyết định nút nào mà hàng sẽ đi vào.
Hãy xem xét một cụm 4 nút, mỗi nút có một phạm vi giá trị băm mà nó có thể lưu trữ. (Viết) XÁC NHẬN VÀO phone_book GIÁ TRỊ (7826573732, 'Joey', 25, 'New York');
Bây giờ, giá trị băm của khóa phân vùng được tính toán bởi trình phân vùng Cassandra. giả sử, giá trị băm (7826573732, 'Joey') → 12, bây giờ, hàng này sẽ được chèn vào Node C.
(Đọc) CHỌN * TỪ phone_book WHERE phone_num = 7826573732 và name = 'Joey';
Bây giờ, một lần nữa giá trị băm của khóa phân vùng (7826573732, 'Joey') được tính, là 12 trong trường hợp của chúng tôi nằm trong Node C, từ đó việc đọc được thực hiện.
Có thể có nhiều hơn một khóa phân vùng và các cụm phân cụm trong một khóa chính tùy thuộc vào truy vấn bạn đang giải quyết.
chính_key ((pk1, pk2), col 1, col2)
Trong thiết kế cơ sở dữ liệu, khóa ghép là một tập hợp các siêu khóa không phải là tối thiểu.
Khóa tổng hợp là một tập hợp chứa khóa tổng hợp và ít nhất một thuộc tính không phải là siêu khóa
Bảng đã cho: NHÂN VIÊN {worker_id, tên, họ}
Các siêu khóa có thể là:
{employee_id}
{employee_id, firstname}
{employee_id, firstname, surname}
{worker_id} là siêu khóa tối thiểu duy nhất, cũng làm cho nó trở thành khóa ứng cử viên duy nhất - được cho rằng {Firstname} và {surname} không đảm bảo tính duy nhất. Vì khóa chính được định nghĩa là khóa ứng viên được chọn và chỉ có một khóa ứng viên tồn tại trong ví dụ này, {worker_id} là siêu khóa tối thiểu, khóa ứng viên duy nhất và là khóa chính duy nhất có thể.
Danh sách đầy đủ các phím ghép là:
{employee_id, firstname}
{employee_id, surname}
{employee_id, firstname, surname}
Khóa tổng hợp duy nhất là {worker_id, Firstname, họ} vì khóa đó chứa khóa tổng hợp ({worker_id, Firstname}) và một thuộc tính không phải là siêu khóa ({họ)}.