Am citit articole în jurul net pentru a înțelege diferențele dintre următoarele "cheie" tipuri. Dar mi se pare greu pentru mine să înțeleg. Exemple cu siguranta va ajuta la a face înțelegerea mai bună.
primary key,
partition key,
composite key
clustering key
Există o mulțime de confuzie în jurul valorii de acest lucru, voi încerca să fac cât mai simplu posibil.
Cheia primară este un concept general care să indice una sau mai multe coloane utilizat pentru a prelua date dintr-un Tabel.
Cheia primară poate fi SIMPLU și chiar a declarat inline:
create table stackoverflow_simple (
key text PRIMARY KEY,
data text
);
Asta înseamnă că este făcută de o singură coloană.
Dar cheia primară poate fi, de asemenea, COMPOZIT (aka COMPUSE), generate din mai multe coloane.
create table stackoverflow_composite (
key_part_one text,
key_part_two int,
data text,
PRIMARY KEY(key_part_one, key_part_two)
);
Într-o situație de COMPOZIT cheie primară, la "prima parte" cheie este numit PARTIȚIE CHEIE (în acest exemplu key_part_one este partiția cheie) și cea de-a doua parte a cheii este CLUSTERING-CHEIE (în acest exemplu key_part_two)
Vă rugăm să rețineți că ambele partiții și gruparea cheie poate fi făcut prin mai multe coloane, aici's cum:
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)
);
În spatele acestor nume ...
În continuare informații de utilizare: DATASTAX DOCUMENTAȚIA
insert into stackoverflow_simple (key, data) VALUES ('han', 'solo');
select * from stackoverflow_simple where key='han';
tabelul de conținut
key | data
----+------
han | solo
COMPOZIT/COMPUS-CHEIE poate prelua "wide rânduri" (de exemplu, puteți interogare de doar partiția cheie, chiar dacă aveți de clustering cheile definite)
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';
tabelul de conținut
key_part_one | key_part_two | data
--------------+--------------+--------------------
ronaldo | 9 | football player
ronaldo | 10 | ex-football player
Dar puteți interoga cu cheie (ambele partiții și clustering) ...
select * from stackoverflow_composite
where key_part_one = 'ronaldo' and key_part_two = 10;
interogare de ieșire
key_part_one | key_part_two | data
--------------+--------------+--------------------
ronaldo | 10 | ex-football player
Important notă: partiția cheie este minim-specificator necesare pentru a efectua o interogare folosind o clauză where`. Dacă aveți un compozit partiție cheie, cum ar fi următoarele
de exemplu: CHEIA PRIMARĂ((col1, col2), col10, col4))
Puteți efectua interogare numai prin trecerea cel puțin atât col1 și col2, acestea sunt cele 2 coloane care definesc partiție cheie. "general" de regulă pentru a face interogare este că trebuie să treacă cel puțin toate partiție cheie coloane, atunci puteți adăuga, opțional, fiecare grupare cheie în ordinea în care au're set.
deci valabil interogări (cu excepția indici secundari)
Invalid:
Sper că acest lucru vă ajută.
Adăugând un răspuns sumar ca a acceptat una este destul de lungă. Termenii "randul" și "coloana" sunt utilizate în contextul CQL, nu cum Cassandra este de fapt puse în aplicare.
Exemple:
CHEIE PRIMARĂ (o)
: partiția cheie este "a".CHEIE PRIMARĂ (a, b)
: partiția cheie este "a", gruparea cheie este "b".CHEIE PRIMARĂ ((a, b))
: compozit partiție cheie este (a, b)
.CHEIE PRIMARĂ (a, b, c)
: partiția cheie este "a", compozit clustering cheie este (b, c)
.CHEIE PRIMARĂ ((a, b), c)
: compozit partiție cheie este (a, b)
, gruparea cheie este "c".CHEIE PRIMARĂ ((a, b), c, d)
: compozit partiție cheie este (a, b)
, compozit clustering cheie este (c, d)
.CREATE TABLE Cass (
id int PRIMARY KEY,
name text
);
Create Table Cass (
id int,
name text,
PRIMARY KEY(id)
);
În CQL, ordinea în care coloanele sunt definite pentru CHEIA PRIMARĂ contează. Prima coloană din cheie se numește partiție cheie având proprietatea că toate rândurile de partajare aceeași partiție cheie (chiar pe masa de fapt) sunt stocate pe același fizice nod. De asemenea, introducere/actualizare/stergere pe rânduri de partajare aceeași partiție cheie pentru un anumit tabel sunt efectuate atomic și în izolare. Rețineți că este posibil să aibă un compozit partiție cheie, adică o partiție cheie format din mai multe coloane, folosind un set suplimentar de paranteze pentru a defini coloane care formează o partiție cheie.
Partiționare și Clustering CHEIA PRIMARĂ definiție este alcătuită din două părți: Partiția Cheie și Gruparea Coloane. Prima parte maps pentru motorul de stocare rând cheie, în timp ce al doilea este utilizat pentru a grupa coloane într-un rând.
CREATE TABLE device_check (
device_id int,
checked_at timestamp,
is_power boolean,
is_locked boolean,
PRIMARY KEY (device_id, checked_at)
);
Aici device_id este partitia cheie și checked_at este cluster_key.
Putem avea mai multe cluster-cheie precum partiție cheie care depinde de declarație.
Cheie primară: Este compus din partitia cheie(s) [și opțional clustering chei(sau coloane)]
Partiție Cheie: valoarea hash de Partiție cheie este folosit pentru a determina specifice nod într-un cluster pentru a stoca date
Clustering Cheie: Este folosit pentru a sorta datele în fiecare dintre partitii(sau responsabil de nod și-l's replici)
Compus Cheie Primară: Cum a spus mai sus, gruparea cheile sunt opționale într-o Cheie Primară. Dacă nu sunt't menționat, l's un simplu cheie primară. Dacă gruparea cheile sunt menționate, l's un Compus cheie primară.
Compozit Partiție Cheie: Folosind doar o singură coloană ca o partiție cheie, ar putea duce la gama larga de rând probleme (depinde de caz de utilizare/date de modelare). Prin urmare partiția cheie este uneori specificat ca o combinație de mai mult de o coloană.
În ceea ce privește confuzia dintre care unul este obligatorie, care pot fi omise, etc. într-o interogare, incercand imaginați-vă Cassandra ca un gigant HashMap ajută. Deci, într-un HashMap, puteți't de a prelua valorile fără Cheie.
Aici, Partiție chei juca rolul de cheie. Așa că fiecare interogare trebuie să le aibă specificat. Fără de care Cassandra a câștigat't știu ce nod pentru a căuta.
La clustering chei (coloane, care sunt opționale) ajuta în continuare îngustarea interogare de căutare după Cassandra afla specifice nod(și's replici), responsabil pentru asta specifice Partiție cheie.
În scurtă sens:
Partiție Cheie nu este nimic, dar identificare pentru un rând, că identificarea de cele mai multe ori este o singură coloană (numit Cheie Primară) uneori, o combinație de mai multe coloane (numite Compozit Partiție Cheie).
Cluster cheie nu este nimic, dar Indexare & Sortarea. Cluster chei depinde de câteva lucruri:
Ce coloane utilizați în cazul în care clauza cu excepția cheie primară coloane.
Dacă aveți foarte mare de înregistrări, apoi pe ceea ce privesc pot împărți data pentru gestionarea ușoară. De exemplu, am date de 1 milion un populația județului înregistrări. Deci pentru gestionarea ușoară, am cluster de date bazate pe stat și după al pin-ului și așa mai departe.
De remarcat, va folosi, probabil, aceste loturi, mai mult decât în concepte similare în relaționale lume (compozit chei).
Exemplu - să presupunem că aveți pentru a găsi ultima N utilizatorii care s-au alăturat recent grupului de utilizatori X. Cum ai face acest lucru în mod eficient dat citește predomină în acest caz? De genul asta (de la oficial Cassandra ghid):
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)
Aici, partiționare cheie este compus în sine și clustering cheie este un alăturat data. Motivul pentru care o clustering cheie este un alăturați-vă data este că rezultatele sunt deja sortate (și stocate, ceea ce face căutări rapide). Dar de ce nu am folosi un compus cheie pentru partiționare cheie? Pentru că mereu am dori să citesc cât mai puține partiții posibil. Cum de a pune join_date acolo ajută? Acum, utilizatorii din același grup și același alăturați-vă data va locui într-o singură partiție! Acest lucru înseamnă că va citi întotdeauna cât mai puține partiții posibil (în primul rând începe cu cele mai noi, apoi trece la mai în vârstă și așa mai departe, mai degrabă decât să sari între ele).
În fapt, în cazuri extreme, de asemenea, trebuie să utilizați hash a unui join_date, mai degrabă decât o join_date singur - așa că, dacă ai de interogare pentru ultimele 3 zile, de multe ori cei împărtășesc același hash și, prin urmare, sunt disponibile din aceeasi partitie!
Cheia primară în Cassandra, de obicei, constă din două părți - cheie de partiționare și Gruparea coloane.
primary_key((partition_key), clustering_col )
Partiție cheie - prima parte a cheii primare. Scopul principal al unei partiții, cheia este de a identifica nodul care stochează special rând.
CREAȚI TABELUL phone_book ( phone_num int, numele text, varsta int, orașul text, CHEIE PRIMARĂ ((phone_num, numele), varsta);
Aici, (phone_num, numele) este partiția cheie. În timp ce introducerea de date, valoarea hash a partiției cheia este generată și de această valoare decide care nod rând ar trebui să meargă în.
Ia în considerare o 4 nod de cluster, fiecare nod are o gamă de valori hash se poate stoca. (Scrie) INTRODUCE ÎN phone_book VALORI (7826573732, 'Joey', 25, 'New York');
Acum, valoarea hash a partiției cheie este calculat prin Cassandra partiționare. spune, valoare hash(7826573732, 'Joey') → 12 , acum, acest rând va fi introdusă în Nodul C.
(Citește) SELECTAȚI * DE la phone_book În cazul în CARE phone_num=7826573732 și numele='Joey';
Acum, din nou, valoarea hash a partiției cheie (7826573732,'Joey') este calculată, care este de 12 în cazul nostru, care locuiește în Nodul C, din care citește este de făcut.
Nu poate fi mai mult de o partiție cheie și gruparea coloane într-o cheie primară în funcție de interogarea de rezolvare.
primary_key((pk1, pk2), col 1,col2)
În proiectarea bazelor de date, un compus cheie este un set de superkeys care nu este minim.
Un compus cheie este un set care conține un compus cheie și cel puțin un atribut care nu este un superkey
Având în tabel: ANGAJATI {employee_id, prenumele, prenumele}
Posibil superkeys sunt:
{employee_id}
{employee_id, firstname}
{employee_id, firstname, surname}
{employee_id} este singurul minim superkey, care face, de asemenea, singurul candidat cheie, având în vedere că {firstname} și {nume} nu garantează unicitatea. Deoarece o cheie primară este definită ca un alese de candidat cheie, și doar o singură cheie candidat există în acest exemplu, {employee_id} este minim superkey, singurul candidat cheie, și singura posibilă cheie primară.
Lista exhaustivă de chei compuse este:
{employee_id, firstname}
{employee_id, surname}
{employee_id, firstname, surname}
Singurul compozit cheia este {employee_id, prenumele, prenumele} deoarece cheia conține un compus cheie ({employee_id,firstname}) și un atribut care nu este un superkey ({nume}).