Jeg har lest artikler rundt om på nettet for å forstå forskjellene mellom følgende key
-typer. Men det virker bare vanskelig for meg å forstå. Eksempler vil definitivt bidra til å gjøre forståelsen bedre.
primary key,
partition key,
composite key
clustering key
Det er mye forvirring rundt dette, så jeg skal prøve å gjøre det så enkelt som mulig.
Primærnøkkel er et generelt begrep som angir en eller flere kolonner som brukes til å hente data fra en tabell.
Primærnøkkelen kan være SIMPLE og til og med deklareres inline:
create table stackoverflow_simple (
key text PRIMARY KEY,
data text
);
Det betyr at den består av én enkelt kolonne.
Men primærnøkkelen kan også være COMPOSITE (også kalt COMPOUND), generert av flere kolonner.
create table stackoverflow_composite (
key_part_one text,
key_part_two int,
data text,
PRIMARY KEY(key_part_one, key_part_two)
);
I en situasjon med COMPOSITE primærnøkkel kalles den første delen av nøkkelen PARTITION KEY (i dette eksemplet er key_part_one partisjonsnøkkelen) og den andre delen av nøkkelen er CLUSTERING KEY (i dette eksemplet key_part_two).
Vær oppmerksom på at både partisjons- og klyngenøkkelen kan lages av flere kolonner, slik gjør du:
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)
);
Bak disse navnene ...
Mer informasjon om bruk: DATASTAX-DOKUMENTASJON
insert into stackoverflow_simple (key, data) VALUES ('han', 'solo');
select * from stackoverflow_simple where key='han';
tabellinnhold
key | data
----+------
han | solo
COMPOSITE/COMPOUND KEY kan hente "wide rows" (dvs. at du kan spørre etter bare partisjonsnøkkelen, selv om du har definert klyngenøkler).
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';
tabellinnhold
key_part_one | key_part_two | data
--------------+--------------+--------------------
ronaldo | 9 | football player
ronaldo | 10 | ex-football player
Men du kan spørre med alle nøkler (både partisjon og klynge) ...
select * from stackoverflow_composite
where key_part_one = 'ronaldo' and key_part_two = 10;
utdata fra spørringen
key_part_one | key_part_two | data
--------------+--------------+--------------------
ronaldo | 10 | ex-football player
Viktig merknad: partisjonsnøkkelen er den minste spesifikasjonen som trengs for å utføre en spørring ved hjelp av en where-klausul
.
Hvis du har en sammensatt partisjonsnøkkel, slik som følgende
f.eks: PRIMARY KEY((col1, col2), col10, col4))
.
Du kan bare utføre spørringen ved å oppgi minst både col1 og col2, som er de to kolonnene som definerer partisjonsnøkkelen. Den "generelle" regelen for å lage spørring er at du må sende minst alle partisjonsnøkkelkolonnene, så kan du eventuelt legge til hver klyngenøkkel i den rekkefølgen de er angitt.
så de gyldige spørsmålene er ( unntatt sekundære indekser )
Ugyldig:
Håper dette er til hjelp.
Å legge til et oppsummeringssvar som det aksepterte svaret er ganske langt. Begrepene "row" og "column" brukes i CQL-sammenheng, ikke slik Cassandra faktisk er implementert.
Eksempler:
PRIMARY KEY (a)
: Partisjonsnøkkelen er a
.PRIMARY KEY (a, b)
: Partisjonsnøkkelen er a
, grupperingsnøkkelen er b
.PRIMARY KEY ((a, b))
: Den sammensatte partisjonsnøkkelen er (a, b)
.PRIMARY KEY (a, b, c)
: Partisjonsnøkkelen er a
, den sammensatte grupperingsnøkkelen er (b, c)
.PRIMARY KEY ((a, b, c)
: Den sammensatte partisjonsnøkkelen er (a, b)
, klyngenøkkelen er c
.PRIMARY KEY ((a, b), c, d)
: Den sammensatte partisjonsnøkkelen er (a, b)
, den sammensatte klyngenøkkelen er (c, d)
.CREATE TABLE Cass (
id int PRIMARY KEY,
name text
);
Create Table Cass (
id int,
name text,
PRIMARY KEY(id)
);
I CQL er rekkefølgen kolonnene defineres i for PRIMARY KEY av betydning. Den første kolonnen i nøkkelen kalles partisjonsnøkkelen og har den egenskapen at alle rader som deler samme partisjonsnøkkel (også på tvers av tabellen) lagres på samme fysiske node. Dessuten utføres innsetting/oppdatering/sletting av rader som deler samme partisjonsnøkkel for en gitt tabell, atomisk og isolert. Merk at det er mulig å ha en sammensatt partisjonsnøkkel, dvs. en partisjonsnøkkel som består av flere kolonner, ved hjelp av et ekstra sett med parenteser for å definere hvilke kolonner som utgjør partisjonsnøkkelen.
**Partisjonering og klyngedannelse PRIMARY KEY-definisjonen består av to deler: partisjonsnøkkelen og grupperingskolonnene. Den første delen mappes til lagringsmotorens radnøkkel, mens den andre brukes til å gruppere kolonner i en rad.
CREATE TABLE device_check (
device_id int,
checked_at timestamp,
is_power boolean,
is_locked boolean,
PRIMARY KEY (device_id, checked_at)
);
Her er device_id partisjonsnøkkelen og checked_at klyngenøkkelen.
Vi kan også ha flere klyngenøkler og partisjonsnøkler, noe som avhenger av erklæringen.