다음 key
유형 간의 차이점을 이해하기 위해 인터넷 주변의 기사를 읽었습니다 . 그러나 나는 이해하기가 어려워 보인다. 예는 확실히 이해를 돕는 데 도움이됩니다.
primary key,
partition key,
composite key
clustering key
다음 key
유형 간의 차이점을 이해하기 위해 인터넷 주변의 기사를 읽었습니다 . 그러나 나는 이해하기가 어려워 보인다. 예는 확실히 이해를 돕는 데 도움이됩니다.
primary key,
partition key,
composite key
clustering key
답변:
이것에 대해 많은 혼란이 있습니다. 가능한 한 간단하게 만들 것입니다.
기본 키는 테이블에서 데이터를 검색하는 데 사용되는 하나 이상의 열을 나타내는 일반적인 개념입니다.
기본 키는 단순 하거나 인라인으로 선언 될 수도 있습니다 .
create table stackoverflow_simple (
key text PRIMARY KEY,
data text
);
즉, 단일 열로 만들어집니다.
그러나 기본 키는 더 많은 열에서 생성 된 COMPOSITE (일명 COMPOUND ) 일 수도 있습니다 .
create table stackoverflow_composite (
key_part_one text,
key_part_two int,
data text,
PRIMARY KEY(key_part_one, key_part_two)
);
COMPOSITE 기본 키 의 상황에서 키의 "첫 번째 부분"은 PARTITION KEY (이 예에서는 key_part_one 은 파티션 키)이고 키의 두 번째 부분은 CLUSTERING KEY입니다 (이 예에서는 key_part_two ).
파티션과 클러스터링 키는 더 많은 열로 만들 수 있습니다 . 방법은 다음과 같습니다.
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)
);
이 이름 뒤에 ...
추가 사용 정보 : DATASTAX DOCUMENTATION
insert into stackoverflow_simple (key, data) VALUES ('han', 'solo');
select * from stackoverflow_simple where key='han';
테이블 내용
key | data
----+------
han | solo
COMPOSITE / COMPOUND KEY 는 "와이드 행"을 검색 할 수 있습니다 (즉, 클러스터링 키가 정의되어 있어도 파티션 키만으로 쿼리 할 수 있음)
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';
테이블 내용
key_part_one | key_part_two | data
--------------+--------------+--------------------
ronaldo | 9 | football player
ronaldo | 10 | ex-football player
그러나 모든 키 (파티션 및 클러스터링)로 쿼리 할 수 있습니다 ...
select * from stackoverflow_composite
where key_part_one = 'ronaldo' and key_part_two = 10;
쿼리 출력
key_part_one | key_part_two | data
--------------+--------------+--------------------
ronaldo | 10 | ex-football player
중요 사항 : 파티션 키는을 사용하여 쿼리를 수행하는 데 필요한 최소 지정자 where clause
입니다. 다음과 같이 복합 파티션 키가있는 경우
예 : PRIMARY KEY((col1, col2), col10, col4))
최소한 col1과 col2를 모두 전달하여 쿼리를 수행 할 수 있습니다. 이들은 파티션 키를 정의하는 2 개의 열입니다. 쿼리를 만드는 "일반적인"규칙은 최소한 모든 파티션 키 열을 전달해야한다는 것입니다. 각 클러스터링 키를 설정된 순서대로 선택적으로 추가 할 수 있습니다.
유효한 쿼리는 ( 보조 인덱스 제외 )
유효하지 않습니다 :
도움이 되었기를 바랍니다.
수락 된 답변으로 요약 답변을 추가하는 것은 꽤 길다. "행"및 "열"이라는 용어는 Cassandra가 실제로 구현되는 방식이 아니라 CQL과 관련하여 사용됩니다.
예 :
PRIMARY KEY (a)
: 파티션 키는 a
입니다.PRIMARY KEY (a, b)
: 파티션 키는 a
클러스터링 키입니다 b
.PRIMARY KEY ((a, b))
: 복합 파티션 키는 (a, b)
입니다.PRIMARY KEY (a, b, c)
: 파티션 키는 a
복합 클러스터링 키입니다 (b, c)
.PRIMARY KEY ((a, b), c)
: 복합 파티션 키는 (a, b)
클러스터링 키입니다 c
.PRIMARY KEY ((a, b), c, d)
: 복합 파티션 키는 (a, b)
복합 클러스터링 키입니다 (c, d)
.cassandra에서 기본 키, 파티션 키, 복합 키, 클러스터링 키의 차이점은 항상 약간의 혼란을 초래합니다. Cassandra 데이터베이스 액세스에는 CQL (Cassandra Query Language)을 사용합니다. 참고 :-답변은 Cassandra의 업데이트 된 버전에 따른 것입니다. 기본 키 :-
CREATE TABLE Cass (
id int PRIMARY KEY,
name text
);
Create Table Cass (
id int,
name text,
PRIMARY KEY(id)
);
CQL에서 PRIMARY KEY에 대해 열이 정의되는 순서가 중요합니다. 키의 첫 번째 열을 동일한 파티션 키를 공유하는 모든 행 (실제 테이블 에서조차도)이 동일한 물리적 노드에 저장되는 속성이있는 파티션 키라고합니다. 또한 주어진 테이블에 대해 동일한 파티션 키를 공유하는 행에 대한 삽입 / 업데이트 / 삭제는 원자 적으로 수행됩니다. 파티션 키를 형성하는 열을 정의하기 위해 추가 괄호 세트를 사용하여 복합 파티션 키, 즉 여러 열로 구성된 파티션 키를 가질 수 있습니다.
파티셔닝 및 클러스터링 PRIMARY KEY 정의는 파티션 키와 클러스터링 열의 두 부분으로 구성됩니다. 첫 번째 부분은 스토리지 엔진 행 키에 매핑되고 두 번째 부분은 행의 열을 그룹화하는 데 사용됩니다.
CREATE TABLE device_check (
device_id int,
checked_at timestamp,
is_power boolean,
is_locked boolean,
PRIMARY KEY (device_id, checked_at)
);
여기서 device_id는 파티션 키이고 checked_at는 cluster_key입니다.
선언에 따라 파티션 키뿐만 아니라 여러 개의 클러스터 키를 가질 수 있습니다.
기본 키 : 파티션 키 (S)로 구성된다 [및 선택적 클러스터링 키 (또는 열)]
파티션 키 : 분할 키의 해시 값은 데이터 저장하는 클러스터 내의 특정 노드를 결정하는 데 사용되는
클러스터링 키 : 데 사용되는 각 파티션 (또는 책임있는 노드와 복제본)의 데이터 정렬
복합 기본 키 : 위에서 말한 것처럼 클러스터링 키는 기본 키에서 선택 사항입니다. 언급되지 않은 경우 간단한 기본 키입니다. 클러스터링 키가 언급되면 복합 기본 키입니다.
복합 파티션 키 : 하나의 열을 파티션 키로 사용하면 광범위한 행 문제 가 발생할 수 있습니다 (사용 사례 / 데이터 모델링에 따라 다름). 따라서 파티션 키는 때때로 둘 이상의 열 조합으로 지정됩니다.
어느 것이 필수인지 혼란 스럽거나 쿼리에서 건너 뛸 수있는 것과 관련하여 Cassandra를 거대한 HashMap으로 상상해보십시오 . 따라서 HashMap에서는 Key가 없으면 값을 검색 할 수 없습니다.
여기서 파티션 키 는 해당 키의 역할을합니다. 따라서 각 쿼리에는이를 지정해야합니다. Cassandra가 없으면 검색 할 노드를 알 수 없습니다. 클러스터링 키를 더 카산드라는 특정 노드를 발견 한 후 쿼리 검색을 축소 (그리고 그것의 복제본)에 도움 특정에 대한 책임 (선택 사항 열) 파티션 키 .
간단히 말해서 :
파티션 키 는 행의 식별 에 지나지 않습니다. 대부분의 경우 식별은 단일 열 ( 기본 키 )이고 때로는 여러 열의 조합 ( 복합 파티션 키 )입니다.
클러스터 키 는 인덱싱 및 정렬에 지나지 않습니다 . 클러스터 키는 몇 가지 사항에 따라 다릅니다.
기본 키 열을 제외하고 where 절에서 사용하는 열
만약 당신이 매우 큰 기록을 가지고 있다면 어떤 문제에 대해 쉽게 관리 할 수 있도록 날짜를 나눌 수 있습니다. 예를 들어, 카운티 인구 기록이 1 백만 건에 이릅니다. 따라서 쉬운 관리를 위해 상태 및 핀 코드 이후 등을 기준으로 데이터를 클러스터링합니다.
주목해야 할 것은 관계형 세계 (복합 키)의 유사한 개념보다 많은 것들을 사용할 것입니다.
예-최근에 사용자 그룹 X에 가입 한 마지막 N 명의 사용자를 찾아야한다고 가정합니다.이 경우 어떻게 효율적으로 읽기를 수행 할 수 있습니까? (공식 카산드라 가이드에서 ) :
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)
여기서 파티션 키 는 복합적인 것이며 클러스터링 키 는 결합 된 날짜입니다. 클러스터링 키 가 결합 날짜 인 이유는 결과가 이미 정렬 되어 저장되어 조회가 빠르기 때문입니다. 그러나 왜 파티션 키에 복합 키를 사용 합니까? 때문에 우리는 항상 가능한 한 적은 수의 파티션으로 읽고 싶어 . 거기 에 join_date 를 넣는 것이 어떻게 도움이됩니까? 이제 동일한 그룹과 동일한 가입 날짜의 사용자가 단일 파티션에 상주합니다! 즉, 가능한 한 적은 수의 파티션을 읽습니다 (먼저 새로운 파티션으로 시작한 다음 파티션간에 점프하지 않고 이전 파티션으로 이동).
사실, 극단적 인 경우에 당신은 또한의 해시를 사용해야합니다 join_date (A)보다 오히려 join_date 은 지난 3 일 동안 조회 할 경우 너무 자주 그 주 같은 해시 따라서 동일한 파티션에서 사용할 수 있는지 - 혼자!
Cassandra의 기본 키는 일반적으로 파티션 키와 클러스터링 열의 두 부분으로 구성됩니다.
primary_key ((partition_key), clustering_col)
파티션 키-기본 키의 첫 번째 부분. 파티션 키의 주요 목표는 특정 행을 저장하는 노드를 식별하는 것입니다.
CREATE TABLE phone_book (phone_num int, 이름 텍스트, age int, 도시 텍스트, PRIMARY KEY ((phone_num, name), age);
여기서 (phone_num, name)은 파티션 키입니다. 데이터를 삽입하는 동안 파티션 키의 해시 값이 생성되며이 값은 행으로 들어가야하는 노드를 결정합니다.
4 노드 클러스터를 고려하면 각 노드에는 저장할 수있는 해시 값의 범위가 있습니다. (쓰기) INSERT INTO phone_book VALUES (7826573732, 'Joey', 25, 'New York');
이제 파티션 키의 해시 값은 Cassandra 파티 셔너에 의해 계산됩니다. 예를 들어, hash value (7826573732, 'Joey') → 12이면 이제이 행이 노드 C에 삽입됩니다.
(읽기) SELECT * FROM phone_book WHERE phone_num = 7826573732 및 name = 'Joey';
이제 다시 파티션 키 (7826573732, 'Joey')의 해시 값이 계산되는데,이 경우 읽기가 수행되는 노드 C에 상주하는 12입니다.
해결하려는 쿼리에 따라 기본 키에 둘 이상의 파티션 키 및 클러스터링 열이있을 수 있습니다.
primary_key ((pk1, pk2), 열 1, 열 2)
데이터베이스 디자인에서 복합 키는 최소한의 슈퍼 키 세트입니다.
복합 키는 복합 키와 수 퍼키가 아닌 하나 이상의 속성을 포함하는 세트입니다.
주어진 테이블 : EMPLOYEES {employee_id, firstname, surname}
가능한 슈퍼 키는 다음과 같습니다.
{employee_id}
{employee_id, firstname}
{employee_id, firstname, surname}
{employee_id}는 유일한 최소 수 퍼키이며 또한 {firstname}과 {surname}이 (가) 고유성을 보장하지 않는 유일한 후보 키입니다. 기본 키는 선택된 후보 키로 정의되며이 예제에는 하나의 후보 키만 있으므로 {employee_id}는 최소 수 퍼키, 유일한 후보 키 및 유일한 기본 키입니다.
복합 키의 전체 목록은 다음과 같습니다.
{employee_id, firstname}
{employee_id, surname}
{employee_id, firstname, surname}
복합 키 ({employee_id, firstname})와 수 퍼키 ({surname})가 아닌 속성을 포함하므로 유일한 복합 키는 {employee_id, firstname, surname}입니다.