Sự khác biệt giữa khóa phân vùng, khóa tổng hợp và khóa phân cụm trong Cassandra?


523

Tôi đã đọc các bài báo trên mạng để hiểu sự khác biệt giữa các keyloạ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

23
Tôi tìm thấy bài viết này có chứa nhiều giải thích chi tiết xung quanh các khái niệm này.
mynkow

Bài viết này cũng chỉ ra rõ ràng các điều khoản này.
duong_dajgja

URL @duong_dajgja được bạn chia sẻ ở trên bị hỏng, bạn có thể chỉnh sửa nhận xét với URL hợp lệ / hữu ích không?
realPK

@realPK Liên kết nào đó đã biến mất. Nhưng tôi đã tìm thấy một liên kết khác cho bạn ở đây quora.com/ .
duong_dajgja

Câu trả lời:


1172

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 ...

  • Khóa phân vùng chịu trách nhiệm phân phối dữ liệu trên các nút của bạn.
  • Khóa Clustering chịu trách nhiệm sắp xếp dữ liệu trong phân vùng.
  • Các khoá chính là tương đương với chính phân vùng trong một bảng duy nhất lĩnh vực-key-(ví dụ đơn giản ).
  • Khóa tổng hợp / hợp chất chỉ là bất kỳ khóa nhiều cột

Thông tin sử dụng khác: TÀI LIỆU ĐẠT


Ví dụ sử dụng và nội dung nhỏ
SIMPLE KEY:

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ụ )

  • col1 và col2
  • col1 và col2 và col10
  • col1 và col2 và col10 và col 4

Không hợp lệ:

  • col1 và col2 và col4
  • bất cứ thứ gì không chứa cả col1 và col2

Hi vọng điêu nay co ich.


7
Như tôi đã viết - << 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ừng khóa theo thứ tự chúng được đặt. >> - vì col10 được xác định trước col4 bạn phải vượt qua nó để truy vấn col4
Carlo Bertuccini

2
Bạn có thể thêm các chỉ mục phụ nhưng điều đó không có nghĩa là bạn có thể thực hiện "bất kỳ" truy vấn cql nào - và hơn thế nữa: trước khi tạo một chỉ mục phụ, bạn nên đếm đến 10 ... 000 ..... :)
Carlo Bertuccini

2
Các chỉ mục phụ được thực hiện như các chỉ mục cục bộ - chúng không được phân phối trong cụm. Mỗi nút của cụm có trách nhiệm lưu trữ các chỉ mục thứ cấp của dữ liệu mà nó sở hữu. Vì lý do này, một truy vấn trên sec.index có thể liên quan đến tất cả các nút trong cụm
Carlo Bertuccini

5
Điều này đã làm tôi bối rối trong vài ngày, nhờ câu trả lời này, giờ tôi có thể xây dựng mô hình dữ liệu trong đầu.
Roger Dwan

2
ồ bạn chỉ tiết kiệm cho tôi hàng giờ hoặc ngày! Cảm ơn bạn, lời giải thích tuyệt vời.
Andre Garcia

128

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.

  • Một khóa chính xác định duy nhất một dòng.
  • Một chìa khóa hợp là chìa khóa hình thành từ nhiều cột.
  • Một chìa khóa phân vùng là tra cứu chính để tìm một tập hợp các hàng, tức là một vách ngăn.
  • Một chìa khóa phân nhóm là một phần của khóa chính mà không phải là chìa khóa phân vùng (và xác định thứ tự trong một phân vùng).

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).

15

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 :-

Trong cassandra có 2 cách khác nhau để sử dụng 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.


6
Bạn có thể đã cung cấp một số tín dụng cho các nguồn của mình (2013 = cũ hơn bài đăng của bạn): thelastpickle.com/blog/2013/01/11/primary-keys-in-cql.html
Roussy

11

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ể đó.


5

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:

  1. Những cột bạn sử dụng trong mệnh đề where trừ các cột khóa chính.

  2. 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.


3
Khóa phân vùng KHÔNG phải là một nhận dạng cho một hàng ... nó xác định một loạt các hàng tất cả đều có cùng một khóa phân vùng
wmac

1

Đá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!


0

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.

  1. Cột phân cụm - Phần thứ hai của khóa chính. Mục đích chính của việc có các cột phân cụm là lưu trữ dữ liệu theo thứ tự được sắp xếp. Theo mặc định, thứ tự tăng dầ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)


-3

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ọ)}.


Hoàn toàn không liên quan đến câu hỏi. Vui lòng chỉnh sửa câu trả lời cho các khóa địa chỉ được hỏi trong ngữ cảnh của Cassandra, không phải là một lời giải thích chung chung. TY.
realPK
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.