Cassandra'da bölüm anahtarı, bileşik anahtar ve kümeleme anahtarı arasındaki fark nedir?


523

Aşağıdaki keytürler arasındaki farkları anlamak için internette makaleler okuyorum . Ama kavramak benim için zor görünüyor. Örnekler kesinlikle anlayışı daha iyi hale getirmeye yardımcı olacaktır.

primary key,
partition key, 
composite key 
clustering key

23
Bu kavramlar hakkında birçok ayrıntılı açıklama içeren bu makaleyi buldum .
mynkow

Bu makalede ayrıca bu terimler açıkça belirtilmiştir.
duong_dajgja

@duong_dajgja Yukarıda paylaştığınız URL bozuk, lütfen geçerli / faydalı URL ile yorumu düzenleyebilir misiniz?
realPK

@realPK Bağlantı bir şekilde gitti. Ama burada sizin için başka bir bağlantı buldum quora.com/… .
duong_dajgja

Yanıtlar:


1172

Bu konuda çok fazla karışıklık var, mümkün olduğunca basit hale getirmeye çalışacağım.

Birincil anahtar, bir Tablodan veri almak için kullanılan bir veya daha fazla sütunu gösteren genel bir kavramdır.

Birincil anahtar BASİT olabilir ve hatta satır içi olarak bildirilebilir:

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

Bu, tek bir sütunla yapıldığı anlamına gelir.

Ancak birincil anahtar daha fazla sütundan oluşturulan KOMPOZİT ( BİLEŞİK olarak da bilinir ) olabilir.

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

Bir durumda KOMPOZİT birincil anahtar, anahtarın "ilk bölümü" olarak adlandırılan bölüm anahtar (bu örnek içerisinde key_part_one bölüm tuşu) ve anahtarın ikinci bölümü küme anahtarı (bu örnek içerisinde key_part_two )

Hem bölümleme hem de kümeleme anahtarının daha fazla sütunla yapılabileceğini lütfen unutmayın :

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

Bu isimlerin arkasında ...

  • Bölme Anahtarı sizin düğümleri arasında veri dağıtımından sorumludur.
  • Kümelenme Anahtar bölüm içinde sıralama verileri sorumludur.
  • Birincil Anahtar eşdeğerdir Bölme Key tek alan anahtar tablosundaki (yani içinde Basit ).
  • Kompozit / Bileşik anahtar sadece bir çoklu kolon anahtar

Diğer kullanım bilgileri: DATASTAX DOKÜMANTASYONU


Küçük kullanım ve içerik örnekleri
BASİT ANAHTAR:

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

tablo içeriği

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

KOMPOZİT / KOMPOZ TUŞU "geniş satırları" alabilir (yani, tanımlanmış kümeleme anahtarları olsa bile, sadece bölüm anahtarıyla sorgulayabilirsiniz)

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

tablo içeriği

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

Ancak tüm anahtarlarla (hem bölümleme hem de kümeleme) sorgulayabilirsiniz ...

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

sorgu çıktısı

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

Önemli not: bölüm anahtarı, a kullanarak bir sorgu gerçekleştirmek için gereken minimum belirtecidir where clause. Aşağıdaki gibi bir bileşik bölüm anahtarınız varsa

Örneğin: PRIMARY KEY((col1, col2), col10, col4))

Sorguyu yalnızca en az hem col1 hem de col2 ileterek gerçekleştirebilirsiniz; bunlar, bölüm anahtarını tanımlayan 2 sütundur. Sorgu yapmak için "genel" kuralı, en azından tüm bölüm anahtarı sütunlarını geçirmeniz gerektiğidir, ardından isteğe bağlı olarak her kümeleme anahtarını ayarlandıkları sırayla ekleyebilirsiniz.

geçerli sorgular ( ikincil dizinler hariç )

  • col1 ve col2
  • col1 ve col2 ve col10
  • col1 ve col2 ve col10 ve col 4

Geçersiz:

  • col1 ve col2 ve col4
  • hem col1 hem de col2 içermeyen herhangi bir şey

Bu yardımcı olur umarım.


7
Yazdığım gibi - << Sorgu yapmak için "genel" kural, en azından tüm bölüm anahtar sütunlarını geçirmeniz gerektiğidir, o zaman her anahtarı ayarlandıkları sırayla ekleyebilirsiniz. >> - col10 daha önce tanımlandığı için col4 ayrıca col4
Carlo Bertuccini

2
İkincil dizinler ekleyebilirsiniz, ancak bu "herhangi bir" cql sorgusu ve daha fazlasını yürütebileceğiniz anlamına gelmez: ikincil bir dizin oluşturmadan önce 10 ... 000'e kadar saymalısınız ..... :)
Carlo Bertuccini

2
İkincil dizinler yerel dizinler olarak uygulanır - kümede dağıtılmazlar. Kümenin her düğümü, sahip olduğu verilerin ikincil dizinlerini depolamaktan sorumludur. Bu nedenle sec.index ile ilgili bir sorgu kümedeki tüm düğümleri içerebilir
Carlo Bertuccini

5
Bu birkaç gün boyunca kafam karıştı, bu cevap için teşekkürler, şimdi kafamda veri modelini oluşturabiliyorum.
Roger Dwan

2
vay. Beni saatlerce veya günlerce kurtardın! Teşekkürler, parlak bir açıklama.
Andre Garcia

128

Kabul edilen cevap olarak özet bir cevap eklemek oldukça uzundur. "Satır" ve "sütun" terimleri, Cassandra'nın gerçekte nasıl uygulandığını değil, CQL bağlamında kullanılır.

  • Bir birincil anahtar benzersiz bir satır tanımlar.
  • Bir bileşik anahtar birden çok sütun oluşan bir anahtardır.
  • Bir bölüm anahtarı , bir satır kümesi, yani bir bölüm bulmak için birincil aramadır.
  • Bir küme temel bölüm tuşu değildir (ve bir bölüm içinde sipariş tanımlar) birincil anahtar parçasıdır.

Örnekler:

  • PRIMARY KEY (a): Bölüm anahtarı a.
  • PRIMARY KEY (a, b): Bölüm anahtarı, akümeleme anahtarıdır b.
  • PRIMARY KEY ((a, b)): Kompozit bölüm anahtarıdır (a, b).
  • PRIMARY KEY (a, b, c): Bölüm anahtarı, abileşik kümeleme anahtarıdır (b, c).
  • PRIMARY KEY ((a, b), c): Bileşik bölüm anahtarı, (a, b)kümeleme anahtarı c.
  • PRIMARY KEY ((a, b), c, d): Bileşik bölüm anahtarı, (a, b)bileşik kümeleme anahtarıdır (c, d).

15

Cassandra'da, birincil anahtar, bölüm anahtarı, bileşik anahtar, kümeleme anahtarı arasındaki fark her zaman karışıklık yaratır .. Bu yüzden aşağıda açıklayacağım ve birbirimizle ilişki kuracağım. Cassandra veritabanı erişimi için CQL (Cassandra Sorgu Dili) kullanıyoruz. Not: - Cevap, Cassandra'nın güncellenmiş sürümüne göredir. Birincil anahtar :-

Cassandra'da birincil Anahtarı kullanmanın 2 farklı yolu vardır.

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

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

CQL'de, PRIMARY KEY için sütunların tanımlanma sırası önemlidir. Anahtarın ilk sütununa, aynı bölüm anahtarını paylaşan tüm satırların (aslında tablo genelinde bile) aynı fiziksel düğümde depolandığı özelliğe sahip bölüm anahtarı denir. Ayrıca, belirli bir tablo için aynı bölüm anahtarını paylaşan satırlara ekleme / güncelleme / silme işlemi, atomik ve tek başına gerçekleştirilir. Hangi sütunların bölüm anahtarını oluşturduğunu tanımlamak için fazladan bir parantez kümesi kullanarak bileşik bir bölüm anahtarının, yani birden çok sütundan oluşan bir bölüm anahtarının mümkün olabileceğini unutmayın.

Bölümleme ve Kümeleme PRIMARY KEY tanımı iki bölümden oluşur: Bölümleme Anahtarı ve Kümeleme Sütunları. İlk bölüm depolama motoru satır anahtarıyla eşlenirken, ikinci bölüm bir satırdaki sütunları gruplandırmak için kullanılır.

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

Burada device_id bölüm anahtarıdır ve işaretli_at cluster_key'dir.

Bildirime bağlı olarak birden çok küme anahtarının yanı sıra bölüm anahtarına da sahip olabiliriz.


6
Kaynaklarınıza bir miktar kredi vermiş olabilirsiniz (2013 = yayınınızdan daha eski): thelastpickle.com/blog/2013/01/11/primary-keys-in-cql.html
Christophe Roussy

11

Birincil Anahtar : Bölüm anahtarlarından oluşur [ve isteğe bağlı kümeleme anahtarları (veya sütunlar)]
Bölüm Anahtarı : Bölüm anahtarının karma değeri, verileri depolamak için kümedeki belirli düğümü belirlemek için kullanılır
Küme Anahtarı : bölümlerin her birinde (veya sorumlu düğümde ve kopyalarında) verileri sıralayın

Bileşik Birincil Anahtar : Yukarıda belirtildiği gibi, kümeleme anahtarları Birincil Anahtarda isteğe bağlıdır. Bahsetmedikleri takdirde, basit bir birincil anahtardır. Kümeleme anahtarlarından bahsedilirse, bu Bileşik birincil anahtardır.

Bileşik Bölüm Anahtarı : Bölüm anahtarı olarak yalnızca bir sütun kullanılması, geniş satır sorunlarına neden olabilir (kullanım senaryosu / veri modellemesine bağlıdır). Bu nedenle bölüm anahtarı bazen birden fazla sütunun birleşimi olarak belirtilir.

Hangisinin zorunlu olduğu konusunda, sorguda hangisinin atlanabileceği vb. İle ilgili olarak Cassandra'nın dev bir HashMap yardımcıolduğunu hayal etmeye çalışmak. Yani bir HashMap içinde, Anahtar olmadan değerleri alamazsınız.
Burada, Bölüm tuşları bu anahtarın rolünü oynar. Bu nedenle, her sorgunun belirtilmesi gerekir. Bu olmadan Cassandra hangi düğümü arayacağını bilemez. Kümeleme tuşları ileri Cassandra belirli düğüm öğrenirse sonra sorgu daraltmayı (ve 's kopyaları) yardım, belirli sorumlu (isteğe bağlıdır sütunlar,) Bölme tuşu .


5

Kısaca:

Bölüm Anahtarı , bir satır için tanımlamadan başka bir şey değildir ; çoğu zaman tanımlama, tek sütundur ( Birincil Anahtar olarak adlandırılır ), bazen birden çok sütunun ( Kompozit Bölüm Anahtarı olarak adlandırılır) birleşimidir .

Küme anahtarı Dizin Oluşturma ve Sıralama'dan başka bir şey değildir . Küme anahtarları birkaç şeye bağlıdır:

  1. Birincil anahtar sütunları dışında nerede deyiminde hangi sütunları kullanırsınız.

  2. Çok büyük kayıtlarınız varsa, o zaman hangi endişe üzerine kolay yönetim için tarihi bölebilirim. Örnek olarak, ilçe nüfusu kayıtlarının 1 milyonu var. Kolay yönetim için verileri duruma ve pin koduna vb. Göre kümelendiriyorum.


3
Bölüm Anahtarı A satırı için bir tanımlama DEĞİLDİR ... hepsi aynı bölüm anahtarına sahip olan bir grup satırı tanımlar
wmac

1

Unutmaya değer, muhtemelen bu lotları ilişkisel dünyada (kompozit anahtarlar) benzer kavramlardan daha fazla kullanacaksınız.

Örnek - X kullanıcı grubuna yeni katılmış olan son N kullanıcılarını bulmanız gerektiğini varsayalım. Bu durumda bu verimli okumalar nasıl yapılır? Bunun gibi (resmi Cassandra rehberinden ):

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)

Burada, bölümleme anahtarı bileşiktir ve kümeleme anahtarı birleştirilmiş bir tarihtir. Kümeleme anahtarının bir katılma tarihi olmasının nedeni , sonuçların zaten sıralanmış (ve depolanmış olması, bu da aramaları hızlı hale getirmesidir ). Ancak anahtarı bölmek için neden bileşik anahtar kullanıyoruz ? Çünkü her zaman mümkün olduğunca az bölüm okumak istiyoruz . Join_date'i buraya koymak nasıl yardımcı olur? Şimdi aynı gruptaki ve aynı katılma tarihindeki kullanıcılar tek bir bölümde ikamet edecek! Bu, her zaman mümkün olduğunca az sayıda bölüm okuyacağımız anlamına gelir (önce en yenisiyle başlayın, sonra aralarında atlamak yerine daha eski olanlara geçin).

Aslında, aşırı durumlarda ayrıca bir karmasını kullanmak gerekir join_date bir yerine join_date son 3 gün boyunca sorgulamak eğer sık sık söz konusu hisse senedi aynı karma ve dolayısıyla aynı bölümünden kullanılabilir olduğunu - yalnız!


0

Cassandra'daki birincil anahtar genellikle iki bölümden oluşur - Bölüm anahtarı ve Kümeleme sütunları.

birincil_anahtarı ((bölüm_anahtarı), kümeleme_kolu)

Bölüm anahtarı - Birincil anahtarın ilk bölümü. Bir bölümleme anahtarının ana amacı, belirli satırı depolayan düğümü tanımlamaktır.

TABLO OLUŞTUR phone_book (telefon_sayısı int, ad metni, yaş int, şehir metni, PRIMARY KEY ((telefon_sayısı, ad), yaş);

Burada, (phone_num, name) bölüm anahtarıdır. Verileri eklerken, bölümleme anahtarının karma değeri oluşturulur ve bu değer satırın hangi düğüme girmesi gerektiğine karar verir.

4 düğümlü bir küme düşünün, her düğümün saklayabileceği çeşitli karma değerleri vardır. (Yaz) telefon defteri KİTAPLARINA GİRİN (7826573732, 'Joey', 25, 'New York');

Şimdi, bölüm anahtarının karma değeri Cassandra bölümleyici tarafından hesaplanır. örneğin, karma değeri (7826573732, 'Joey') → 12, şimdi bu satır Düğüm C'ye eklenecek.

(Oku) SEÇ * telefon rehberinden NEREDE phone_num = 7826573732 ve name = 'Joey';

Şimdi yine, bölüm anahtarının (7826573732, 'Joey') hash değeri hesaplanır; bu, okunan işlemin yapıldığı C Düğümünde bulunan 12 durumumuzda.

  1. Kümeleme sütunları - Birincil anahtarın ikinci kısmı. Kümeleme sütunlarına sahip olmanın temel amacı, verileri sıralı bir sırada saklamaktır. Varsayılan olarak, sipariş artmaktadır.

Çözdüğünüz sorguya bağlı olarak, birincil anahtarda birden fazla bölüm anahtarı ve kümeleme sütunu olabilir.

birincil_anahtarı ((pk1, pk2), sütun 1, sütun2)


-3

Veritabanı tasarımında, bileşik anahtar çok az olmayan bir dizi superkeydir.

Bileşik anahtar, bileşik anahtar ve süper olmayan olmayan en az bir öznitelik içeren bir kümedir

Verilen tablo: EMPLOYEES {çalışan_kimliği, ad, soyadı}

Olası süperkeyler:

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

{çalışan_kimliği} tek minimum anahtardır ve bu da onu tek aday anahtar yapar - {ad} ve {soyadı} 'nın tekliği garanti etmediği göz önüne alındığında. Birincil anahtar, seçilen bir aday anahtarı olarak tanımlandığından ve bu örnekte yalnızca bir aday anahtarı bulunduğundan, {worker_id}, minimum superkey, tek aday anahtar ve olası tek birincil anahtardır.

Bileşik anahtarların kapsamlı listesi:

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

Tek bileşik anahtar {worker_id, firstname, soyadı} 'dır, çünkü bu anahtar bir bileşik anahtar ({worker_id, firstname}) ve superkey olmayan bir öznitelik ({soyadı}) içerir.


Sorulan soru ile tamamen alakasız. Lütfen cevabı genel bir açıklama değil, Cassandra bağlamında sorulan adres anahtarlarına düzenleyin. TY.
realPK
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.