Perbedaan antara kunci partisi, kunci komposit dan kunci clustering di Cassandra?

523

Saya telah membaca artikel di internet untuk memahami perbedaan antara keytipe - tipe berikut . Tapi sepertinya sulit bagi saya untuk memahami. Contoh-contoh pasti akan membantu membuat pemahaman menjadi lebih baik.

primary key,
partition key, 
composite key 
clustering key
badai otak
sumber
23
Saya menemukan artikel ini yang berisi banyak penjelasan terperinci tentang konsep-konsep ini.
mynkow
Artikel ini juga menunjukkan dengan jelas istilah-istilah ini.
duong_dajgja
@duong_dajgja URL yang Anda bagikan di atas rusak, bisakah Anda mengedit komentar dengan URL yang valid / berguna?
realPK
@ realPK Tautannya entah bagaimana telah hilang. Tapi saya menemukan tautan lain untuk Anda di sini quora.com/… .
duong_dajgja

Jawaban:

1172

Ada banyak kebingungan di sekitar ini, saya akan mencoba membuatnya sesederhana mungkin.

Kunci utama adalah konsep umum untuk menunjukkan satu atau lebih kolom yang digunakan untuk mengambil data dari Tabel.

Kunci utama mungkin SEDERHANA dan bahkan dinyatakan sebaris:

 create table stackoverflow_simple (
      key text PRIMARY KEY,
      data text      
  );

Itu berarti dibuat oleh satu kolom.

Tetapi kunci utama juga bisa menjadi KOMPOSIT (alias SENYAWA ), dihasilkan dari lebih banyak kolom.

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

Dalam situasi kunci primer KOMPOSIT , "bagian pertama" dari kunci tersebut disebut PARTITION KEY (dalam contoh ini key_part_one adalah kunci partisi) dan bagian kedua dari kunci adalah CLUSTERING KEY (dalam contoh ini key_part_two )

Harap perhatikan bahwa baik kunci partisi dan pengelompokan dapat dibuat oleh lebih banyak kolom , berikut caranya:

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

Di belakang nama-nama ini ...

  • The Partisi Key bertanggung jawab untuk distribusi data di node Anda.
  • The Clustering Key bertanggung jawab untuk memilah data dalam partisi.
  • The Primary Key adalah setara dengan Key partisi dalam satu tabel-bidang-key (yaitu Simple ).
  • The Composite / Compound Key hanya sembarang tombol multi-kolom

Informasi penggunaan lebih lanjut: DOKUMENTASI DATASTAX


Penggunaan kecil dan contoh konten KUNCI
SEDERHANA :

insert into stackoverflow_simple (key, data) VALUES ('han', 'solo');
select * from stackoverflow_simple where key='han';

konten tabel

key | data
----+------
han | solo

KUNCI KOMPOSIT / SENYAWAAN dapat mengambil "baris lebar" (yaitu Anda dapat melakukan kueri hanya dengan kunci partisi, bahkan jika Anda memiliki kunci pengelompokan yang ditentukan)

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';

konten tabel

 key_part_one | key_part_two | data
--------------+--------------+--------------------
      ronaldo |            9 |    football player
      ronaldo |           10 | ex-football player

Tetapi Anda dapat melakukan kueri dengan semua kunci (baik partisi dan pengelompokan) ...

select * from stackoverflow_composite 
   where key_part_one = 'ronaldo' and key_part_two  = 10;

output permintaan

 key_part_one | key_part_two | data
--------------+--------------+--------------------
      ronaldo |           10 | ex-football player

Catatan penting: kunci partisi adalah penentu minimum yang diperlukan untuk melakukan kueri menggunakan a where clause. Jika Anda memiliki kunci partisi komposit, seperti berikut ini

misalnya: PRIMARY KEY((col1, col2), col10, col4))

Anda dapat melakukan kueri hanya dengan melewati setidaknya col1 dan col2, ini adalah 2 kolom yang menentukan kunci partisi. Aturan "umum" untuk membuat kueri adalah Anda harus melewati setidaknya semua kolom kunci partisi, lalu Anda dapat menambahkan secara opsional setiap kunci pengelompokan sesuai urutan yang ditetapkan.

jadi kueri yang valid adalah ( tidak termasuk indeks sekunder )

  • col1 dan col2
  • col1 dan col2 dan col10
  • col1 dan col2 dan col10 dan col 4

Tidak valid:

  • col1 dan col2 dan col4
  • apa pun yang tidak mengandung col1 dan col2

Semoga ini membantu.

Carlo Bertuccini
sumber
7
Seperti yang saya tulis - << Aturan "umum" untuk membuat kueri adalah Anda harus melewati setidaknya semua kolom kunci partisi, maka Anda dapat menambahkan setiap kunci dalam urutan yang ditetapkan. >> - karena col10 didefinisikan sebelum col4 Anda harus meneruskannya ke kueri juga untuk col4
Carlo Bertuccini
2
Anda dapat menambahkan indeks sekunder tetapi itu tidak berarti Anda dapat menjalankan kueri cql "apa pun" - dan banyak lagi: sebelum membuat indeks sekunder, Anda harus menghitung hingga 10 ... 000 ..... :)
Carlo Bertuccini
2
Indeks sekunder diimplementasikan sebagai indeks lokal - mereka tidak didistribusikan di cluster. Setiap node cluster bertanggung jawab untuk menyimpan indeks sekunder dari data yang dimilikinya. Untuk alasan ini permintaan pada sec.index mungkin melibatkan semua node dalam cluster
Carlo Bertuccini
5
Ini membingungkan saya selama beberapa hari, terima kasih atas jawaban ini, sekarang saya dapat membangun model data di kepala saya.
Roger Dwan
2
Wow. Anda baru saja menyelamatkan saya berjam-jam atau berhari-hari! Terima kasih, penjelasannya.
Andre Garcia
128

Menambahkan jawaban ringkasan sebagai jawaban yang diterima cukup panjang. Istilah "baris" dan "kolom" digunakan dalam konteks CQL, bukan bagaimana Cassandra sebenarnya diimplementasikan.

  • Sebuah kunci primer unik mengidentifikasi baris.
  • Sebuah kunci komposit adalah kunci yang terbentuk dari beberapa kolom.
  • Sebuah tombol partisi adalah lookup utama untuk menemukan satu set baris, yaitu partisi.
  • Sebuah kunci pengelompokan adalah bagian dari primary key yang bukan kunci partisi (dan mendefinisikan pemesanan dalam waktu partisi).

Contoh:

  • PRIMARY KEY (a): Kunci partisi adalah a.
  • PRIMARY KEY (a, b): Kunci partisi adalah a, kunci pengelompokan adalah b.
  • PRIMARY KEY ((a, b)): Kunci partisi komposit adalah (a, b).
  • PRIMARY KEY (a, b, c): Kunci partisi adalah a, kunci pengelompokan komposit adalah (b, c).
  • PRIMARY KEY ((a, b), c): Kunci partisi komposit adalah (a, b), kunci pengelompokan adalah c.
  • PRIMARY KEY ((a, b), c, d): Kunci partisi komposit adalah (a, b), kunci pengelompokan komposit (c, d).
OrangeDog
sumber
15

Dalam cassandra, perbedaan antara kunci primer, kunci partisi, kunci komposit, kunci clustering selalu membuat beberapa kebingungan .. Jadi saya akan menjelaskan di bawah ini dan saling berhubungan satu sama lain. Kami menggunakan CQL (Cassandra Query Language) untuk akses basis data Cassandra. Catatan: - Jawaban sesuai versi Cassandra yang diperbarui. Kunci utama :-

Dalam cassandra ada 2 cara berbeda untuk menggunakan Kunci Utama.

CREATE TABLE Cass (
    id int PRIMARY KEY,
    name text 
);

Create Table Cass (
   id int,
   name text,
   PRIMARY KEY(id) 
);

Dalam CQL, urutan kolom didefinisikan untuk hal-hal KUNCI UTAMA. Kolom pertama dari kunci tersebut disebut kunci partisi yang memiliki properti yang semua barisnya berbagi kunci partisi yang sama (bahkan di seluruh tabel sebenarnya) disimpan pada simpul fisik yang sama. Juga, penyisipan / pembaruan / penghapusan pada baris berbagi kunci partisi yang sama untuk tabel yang diberikan dilakukan secara atom dan dalam isolasi. Perhatikan bahwa dimungkinkan untuk memiliki kunci partisi komposit, yaitu kunci partisi yang terdiri dari beberapa kolom, menggunakan seperangkat tanda kurung tambahan untuk menentukan kolom mana yang membentuk kunci partisi.

Partisi dan Clustering Definisi PRIMARY KEY terdiri dari dua bagian: Kunci Partisi dan Kolom Clustering. Bagian pertama memetakan ke kunci baris mesin penyimpanan, sedangkan yang kedua digunakan untuk mengelompokkan kolom dalam satu baris.

CREATE TABLE device_check (
  device_id   int,
  checked_at  timestamp,
  is_power    boolean,
  is_locked   boolean,
  PRIMARY KEY (device_id, checked_at)
);

Di sini device_id adalah kunci partisi dan checked_at adalah cluster_key.

Kita dapat memiliki beberapa kunci kluster dan juga kunci partisi yang tergantung pada deklarasi.

Guy Data Besar
sumber
6
Anda bisa memberikan kredit pada sumber Anda (2013 = lebih tua dari pos Anda): thelastpickle.com/blog/2013/01/11/primary-keys-in-cql.html
Christophe
11

Kunci Utama : Terdiri dari kunci partisi [dan kunci pengelompokan opsional (atau kolom)]
Kunci Partisi : Nilai hash kunci Partisi digunakan untuk menentukan node spesifik dalam sebuah cluster untuk menyimpan data
Kunci Clustering : Digunakan untuk urutkan data di setiap partisi (atau simpul yang bertanggung jawab dan replika-nya)

Compound Primary Key : Seperti yang disebutkan di atas, kunci pengelompokan adalah opsional di Primary Key. Jika tidak disebutkan, itu adalah kunci utama yang sederhana. Jika kunci pengelompokan disebutkan, itu adalah kunci utama gabungan.

Kunci Partisi Komposit : Menggunakan hanya satu kolom sebagai kunci partisi, dapat menyebabkan masalah baris lebar (tergantung pada kasus penggunaan / pemodelan data). Karenanya kunci partisi terkadang ditentukan sebagai kombinasi lebih dari satu kolom.

Mengenai kebingungan mana yang wajib , mana yang dapat dilewati, dll. Dalam kueri, mencoba membayangkan Cassandra sebagai HashMap raksasa membantu. Jadi di HashMap, Anda tidak dapat mengambil nilai tanpa Kunci.
Di sini, tombol Partition memainkan peran kunci itu. Jadi setiap permintaan harus ditentukan. Tanpanya Cassandra tidak akan tahu simpul mana yang harus dicari.
The Kunci pengelompokan (kolom, yang opsional) membantu dalam mempersempit pencarian permintaan Anda setelah Cassandra tahu simpul tertentu (dan replika itu) lebih lanjut bertanggung jawab untuk itu khusus kunci Partition .

Chandan Hegde
sumber
5

Secara singkat:

Partition Key tidak lain adalah identifikasi untuk satu baris, yang paling sering diidentifikasi adalah satu kolom (disebut Primary Key ) kadang-kadang kombinasi dari beberapa kolom (disebut Compition Partition Key ).

Kunci Cluster tidak lain adalah Pengindeksan & Penyortiran . Kunci cluster bergantung pada beberapa hal:

  1. Kolom apa yang Anda gunakan di mana klausa kecuali kolom kunci utama.

  2. Jika Anda memiliki catatan yang sangat besar maka tentang masalah apa saya dapat membagi tanggal untuk manajemen yang mudah. Contoh, saya punya data 1 juta catatan populasi county. Jadi untuk manajemen yang mudah, saya mengelompokkan data berdasarkan negara dan setelah kode pin dan seterusnya.

Matahari
sumber
3
Kunci Partisi BUKAN identifikasi untuk baris ... ini mengidentifikasi banyak baris yang semuanya memiliki kunci partisi yang sama
wmac
1

Layak untuk dicatat, Anda mungkin akan menggunakan banyak lebih banyak daripada dalam konsep serupa di dunia relasional (kunci komposit).

Contoh - misalkan Anda harus menemukan pengguna N terakhir yang baru-baru ini bergabung dengan grup pengguna X. Bagaimana Anda melakukan ini dengan efisien karena pembacaan dominan dalam kasus ini? Seperti itu (dari panduan Cassandra resmi ):

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)

Di sini, kunci partisi adalah senyawa itu sendiri dan kunci pengelompokan adalah tanggal bergabung. Alasan mengapa kunci pengelompokan adalah tanggal bergabung adalah karena hasilnya sudah diurutkan (dan disimpan, yang membuat pencarian cepat). Tapi mengapa kita menggunakan kunci majemuk untuk kunci partisi ? Karena kami selalu ingin membaca partisi sesedikit mungkin . Bagaimana menempatkan join_date di sana membantu? Sekarang pengguna dari grup yang sama dan tanggal bergabung yang sama akan berada di satu partisi! Ini berarti kita akan selalu membaca partisi sesedikit mungkin (pertama mulai dengan yang terbaru, kemudian pindah ke yang lebih tua dan seterusnya, daripada melompat di antara mereka).

Bahkan, dalam kasus-kasus ekstrem Anda juga perlu menggunakan hash dari join_date daripada join_date saja - sehingga jika Anda melakukan query selama 3 hari terakhir, mereka yang memiliki hash yang sama dan karenanya tersedia dari partisi yang sama!

kboom
sumber
0

Kunci utama dalam Cassandra biasanya terdiri dari dua bagian - Kunci partisi dan kolom Clustering.

primary_key ((partisi_key), clustering_col)

Kunci partisi - Bagian pertama dari kunci utama. Tujuan utama kunci partisi adalah untuk mengidentifikasi simpul yang menyimpan baris tertentu.

CREATE TABLE phone_book (int phone_num, teks nama, usia int, teks kota, KUNCI UTAMA ((phone_num, nama), umur);

Di sini, (phone_num, nama) adalah kunci partisi. Saat memasukkan data, nilai hash dari kunci partisi dihasilkan dan nilai ini memutuskan ke node mana baris harus dimasukkan.

Pertimbangkan 4 node cluster, setiap node memiliki rentang nilai hash yang dapat disimpan. (Tulis) INSERT INTO phone_book VALUES (7826573732, 'Joey', 25, 'New York');

Sekarang, nilai hash kunci partisi dihitung oleh Cassandra partisier. katakanlah, nilai hash (7826573732, 'Joey') → 12, sekarang, baris ini akan dimasukkan dalam Node C.

(Baca) SELECT * FROM phone_book WHERE phone_num = 7826573732 dan name = 'Joey';

Sekarang, lagi nilai hash dari kunci partisi (7826573732, 'Joey') dihitung, yaitu 12 dalam kasus kami yang berada di Node C, dari mana pembacaan dilakukan.

  1. Kolom pengelompokan - Bagian kedua dari kunci utama. Tujuan utama memiliki kolom pengelompokan adalah untuk menyimpan data dalam urutan yang diurutkan. Secara default, pesanan naik.

Mungkin ada lebih dari satu kunci partisi dan kolom pengelompokan di kunci utama tergantung pada kueri yang Anda pecahkan.

primary_key ((pk1, pk2), col 1, col2)

Sumon Saikan
sumber
-3

Dalam desain basis data, kunci majemuk adalah sekumpulan superkeys yang tidak minimal.

Kunci komposit adalah himpunan yang berisi kunci majemuk dan setidaknya satu atribut yang bukan superkey

Tabel yang diberikan: EMPLOYEES {employee_id, firstname, marga}

Kemungkinan superkeys adalah:

{employee_id}
{employee_id, firstname}
{employee_id, firstname, surname}

{employee_id} adalah satu-satunya superkey minimal, yang juga menjadikannya satu-satunya kunci kandidat - mengingat {firstname} dan {nama keluarga} tidak menjamin keunikan. Karena kunci utama didefinisikan sebagai kunci kandidat yang dipilih, dan hanya satu kunci kandidat yang ada dalam contoh ini, {employee_id} adalah superkey minimal, satu-satunya kunci kandidat, dan satu-satunya kunci primer yang mungkin.

Daftar lengkap kunci majemuk adalah:

{employee_id, firstname}
{employee_id, surname}
{employee_id, firstname, surname}

Satu-satunya kunci komposit adalah {employee_id, firstname, nama keluarga} karena kunci itu berisi kunci majemuk ({employee_id, firstname}) dan atribut yang bukan superkey ({nama keluarga}).

Khurana
sumber
Sama sekali tidak relevan dengan pertanyaan yang diajukan. Harap edit jawaban ke kunci alamat yang diminta dalam konteks Cassandra, bukan penjelasan umum. TY.
realPK