source

카산드라의 파티션 키, 합성 키, 클러스터링 키의 차이?

factcode 2023. 10. 1. 22:02
반응형

카산드라의 파티션 키, 합성 키, 클러스터링 키의 차이?

의 를 읽고 .key타이프. 하지만 저는 이해하기 힘들 것 같아요.예는 분명히 이해력을 높이는 데 도움이 될 것입니다.

primary key,
partition key, 
composite key 
clustering key

주변에 혼란이 많습니다, 최대한 간단하게 진행하도록 하겠습니다.

기본 키는 표에서 데이터를 검색하는 데 사용되는 하나 이상의 열을 나타내는 일반적인 개념입니다.

기본 키는 심플하고 인라인으로 선언될 수도 있습니다.

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

그것은 한 개의 열로 만들어졌다는 것을 의미합니다.

그러나 기본 키는 더 많은 열에서 생성된 COMPRATE(일명 COMPRATE)일 수도 있습니다.

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

COMPATIC primary key의 상황에서 키의 "첫 번째 부분"을 PARTITION KEY(이 에서 key_part_one은 파티션 키)라고 하고 두 번째 부분을 CLASTING 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)      
  );

이 이름 뒤에...

  • 파티션 키는 노드 간의 데이터 배포를 담당합니다.
  • 클러스터링 키는 파티션 내의 데이터 정렬을 담당합니다.
  • 기본 는 단일 필드 키 테이블의 파티션 키와 같습니다(즉, 단순).
  • Composite/Compound Key는 단지 임의의 다중 열 키입니다.

추가 사용 정보: DATAX DOCUTION


Small usage and content examples
***SIMPLE*** KEY:
insert into stackoverflow_simple (key, data) VALUES ('han', 'solo');
select * from stackoverflow_simple where key='han';

테이블 내용

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

복합/복합는 "넓은 행"을 검색할 수 있습니다(즉, 클러스터링 키가 정의되어 있더라도 파티션 키만으로 쿼리할 수 있습니다).

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를 모두 전달해야 쿼리를 수행할 수 있는데, 이것이 파티션 키를 정의하는 두 개의 열입니다.쿼리를 만드는 "일반적인" 규칙은 최소한 모든 파티션 키 열을 전달한 다음 각 클러스터링 키를 설정된 순서대로 선택적으로 추가할 수 있습니다.

따라서 유효한 쿼리는 다음과 같습니다(보조 인덱스 제외).

  • col1 과 col2
  • col1 과 col2 과 col10
  • col1 과 col2 과 col10 과 col4

올바르지 않음:

  • col1 과 col2 과 col4
  • col1과 col2를 모두 포함하지 않는 것.

요약 답변을 수락된 답변으로 추가하는 것은 상당히 깁니다.CQL에서 "행"과 "열"이라는 용어는 Cassandra가 실제로 구현되는 방식이 아니라 사용됩니다.

  • 기본 키는 행을 고유하게 식별합니다.
  • 복합 키는 여러 열로 구성된 키입니다.
  • 파티션 키는 행 집합, 즉 파티션을 찾기 위한 주 조회입니다.
  • 클러스터링 키는 파티션 키가 아닌 기본 키의 부분이며 파티션 내에서 순서를 정의합니다.

예:

  • 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).

카산드라에서 기본 키, 파티션 키, 합성 키, 클러스터링 키의 차이는 항상 약간의 혼란을 일으킵니다.그래서 저는 아래에서 설명하고 서로의 의견을 연결하려고 합니다.카산드라 데이터베이스 액세스를 위해 CQL(카산드라 쿼리 언어)을 사용합니다.참고: - 정답은 카산드라의 업데이트 버전에 따른 것입니다.

기본 키: - 카산드라에서 기본 키를 사용하는 방법은 두 가지가 있습니다.


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

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

CQL에서는 기본 키에 대해 열이 정의되는 순서가 중요합니다.키의 첫 번째 열은 동일한 파티션 키를 공유하는 모든 행이 동일한 물리적 노드에 저장되는 속성을 가진 파티션 키라고 합니다.또한 주어진 테이블에 대해 동일한 파티션 키를 공유하는 행에 대한 삽입/업데이트/삭제는 원자적으로 분리되어 수행됩니다.추가 괄호 집합을 사용하여 파티션 키를 구성할 열을 정의하는 복합 파티션 키(즉, 여러 열로 구성된 파티션 키)를 가질 수 있습니다.

파티셔닝클러스터링 기본 키 정의는 파티셔닝 키와 클러스터링 열의 두 부분으로 구성됩니다.첫 번째 부분은 스토리지 엔진 행 키에 매핑되는 반면, 두 번째 부분은 열을 일렬로 그룹화하는 데 사용됩니다.

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입니다.

우리는 선언에 따라 여러 개의 클러스터 키뿐만 아니라 파티션 키도 가질 수 있습니다.

기본 키: 파티션 키 [및 선택적 클러스터링 키(또는 열)]로 구성됩니다.
파티션 키:파티션 키의 해시 값은 데이터를 저장할 클러스터의 특정 노드를 결정하는 데 사용됩니다.

클러스터링 키: 각 파티션(또는 책임 노드와 해당 복제본)의 데이터를 정렬하는 데 사용됩니다.

복합 기본 키: 위에서 설명한 바와 같이 기본 키에서 클러스터링 키는 선택 사항입니다.언급되지 않았다면 단순한 기본 키입니다.클러스터링 키가 언급되면 Compound primary 키입니다.

복합 파티션 키: 하나의 열만 파티션 키로 사용하면 넓은 행 문제가 발생할 수 있습니다(사용 사례/데이터 모델링에 따라 다름).따라서 파티션 키는 두 개 이상의 열 조합으로 지정되기도 합니다.

쿼리에서 어떤 것이 필수인지, 어떤 것이 건너뛸 수 있는지 등에 대한 혼동관련하여 카산드라를 거대해시맵으로 상상하는 것이 도움이 됩니다.따라서 해시맵에서는 키가 없으면 값을 검색할 수 없습니다.

여기서 파티션 키가 해당 키의 역할을 합니다.따라서 각 쿼리에는 해당 쿼리를 지정해야 합니다.카산드라가 없다면 어떤 노드를 찾아야 할지 모를 겁니다.

클러스터링 키(선택사항인 열)는 카산드라가 특정 파티션 를 담당하는 특정 노드(및 해당 복제본)를 발견한 후 쿼리 검색 범위를 더 좁히는 데 도움이 됩니다.

간단히 말하면 다음과 같습니다.

파티션 키는 행에 대한 식별 정보일 뿐이며, 대부분의 경우 식별 정보는 단일 열(Primary Key)로 불리며, 때로는 여러 열(Composite Partition Key)의 조합(Composite Key)으로 표시됩니다.

클러스터 키인덱싱 & 소팅에 불과합니다.클러스터 키는 몇 가지 사항에 따라 달라집니다.

  1. where 절에서 기본 키 열을 제외하고 사용할 열.

  2. 기록이 매우 크신다면 관리가 쉽도록 날짜를 나눌 수 있을까요?예를 들어, 저는 카운티 인구 100만 명에 대한 자료를 가지고 있습니다.따라서 관리가 용이하도록 상태 및 후 핀코드 등을 기반으로 데이터를 클러스터링합니다.

참고할 가치가 있습니다. 여러분은 아마도 관계형 세계(복합 키)에서 비슷한 개념보다 더 많은 그러한 많은 것을 사용할 것입니다.

예제 - 사용자 그룹 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만 사용하는 것이 아니라 join_date의 해시를 사용해야 합니다. 그래서 지난 3일 동안 쿼리하면 동일한 해시를 공유하므로 동일한 파티션에서 사용할 수 있습니다!

기본 키(Primary Key): 많은 데이터베이스와 마찬가지로 테이블의 고유 키이며, 기본적으로 테이블의 모든 두 레코드에 대해 기본 키는 동일할 수 없습니다.데이터베이스(이 경우 Cassandra)는 모든 상황에서 이 조건이 사실인지 확인하도록 설계되었습니다.따라서 PK1을 기본 키로 레코드를 작성하려고 하면 동일한 키 PK1을 가진 레코드가 이미 존재하면 덮어쓰게 되고 그렇지 않으면 새 레코드가 생성됩니다.

파티션 키(Partition Key): 분산 데이터베이스(단일 테이블의 데이터를 파티션이라고 하는 여러 부분으로 나눕니다)의 구성입니다.그런 다음 분배 전략(일반적으로 파티션 키의 해시)을 사용하여 노드 간에 파티션을 분산하여 무한 확장 기능을 얻습니다.그럼에도 불구하고 파티션 키는 레코드가 어떤 파티션에 속할지를 결정하는 레코드의 열 집합입니다.따라서 파티션 키는 분산된 노드 클러스터에 걸쳐 레코드의 물리적 위치를 결정합니다.

클러스터링 키: 클러스터링 키는 특정 파티션의 레코드 순서를 결정합니다.따라서 파티션에 10K 레코드가 있는 경우 클러스터링 키를 통해 이러한 10K가 물리적으로 정렬된 방식으로 저장되는 순서가 결정됩니다.

예:

전자상거래 웹사이트의 판매 이벤트를 저장할 수 있는 테이블이 카산드라에 있다고 가정해 보겠습니다.

[order_id, item_id, quantity, amount, payment_id, status, order_time, PRIMARY KEY( (order_id, item_id), order_time)] with clustering ORDER BY (order_time DESC);

자, 자, 여기.

과 같습니다.((order_id, item_id), order_time)그리고 그것은 테이블에 있는 레코드의 독특함을 결정할 것입니다.

는 다음과 같습니다.(order_id, item_id), 에서 이합니다.

과 같습니다.order_time 레코드는 됩니다에 순서가 .order_time내림차순으로그래서 만약에 당신이.Limit 1특정 파티션에 대한 cql 쿼리는 항상 최대 타임스탬프가 있는 레코드를 얻을 수 있습니다.

복합 키는 테이블의 기본 키가 단일 열이 아니라 여러 열임을 지정하는 용어일 뿐입니다.

기본 키는 파티션 키와 클러스터링 키의 조합입니다.

한 말씀 드리고 싶은데요, 어떤 대답도 제게 실질적인 의미를 이해하는 데 도움이 되지 않았기 때문입니다.

Partition key 데이터의 고유성을 기준으로 데이터를 그룹화합니다.같은 키를 가진 모든 사람은 같은 파티션에 들어갑니다.

Clustering key, 반면, 파티션 내부의 행을 고유하게 식별합니다.

예를 들어, 테이블이 있습니다.

CREATE TABLE temperature_readings (
  sensor_id text,
  time timestamp,
  temperature float,
  PRIMARY KEY (sensor_id, time)
)

sensor_idtime.

sensor_id는 파티션 키이고time클러스터링 키입니다.

우리는 많은 행들을 같은 것으로 로드할 수 있습니다.sensor_id그리고 그것들은 같은 파티션에 저장될 것이고, 그것들은 그것들에 의해 분류될 것입니다.time. 각 센서에 대해 "함께 그룹화"됩니다(그리고 물리적으로 동일한 카산드라 노드에 저장됨).

이런 상상을 하고 있습니다.

+-----------+------------+--------------
| sensor_id | time       | other row data...
+-----------+------------+--------------
|  1        | 1682615843 |
|           +------------+
|           | 1682615848 |
|           +------------+
|           | 1682615890 |
+-----------+------------+
|  2        | 1682615111 |
|           +------------+
|           | 1682615123 |
+-----------+------------+
| 99909     | 1682615688 |
|           +------------+


 and so on...           
                        

(실제 데이터가 디스크에 물리적으로 저장된다는 점에서 정확하지는 않지만)

면책 사항:이 답변은 DynamoDB에 고유한 것이지만, 둘 다 NoSQL 데이터베이스이기 때문에 개념은 카산드라에도 적용됩니다.

테이블을 작성할 때 테이블 이름 외에 테이블의 기본 키를 지정해야 합니다.기본 키는 테이블의 각 항목을 고유하게 식별하므로 두 항목이 동일한 키를 가질 수 없습니다.

DynamoDB는 두 가지 종류의 기본 키를 지원합니다.

파티션 키 – 파티션 키로 알려진 속성 하나로 구성된 간단한 기본 키입니다.

DynamoDB는 파티션 키의 값을 내부 해시 함수의 입력으로 사용합니다.해시 함수의 출력에 따라 항목이 저장될 파티션(DynamoDB 내부의 물리적 스토리지)이 결정됩니다.

파티션 키만 있는 테이블에서는 두 항목이 동일한 파티션 키 값을 가질 수 없습니다.

파티션 키 및 정렬 키복합 기본 키라고 하는 이 유형의 키는 두 가지 속성으로 구성됩니다.첫 번째 속성은 파티션 키이고, 두 번째 속성은 정렬 키입니다.

DynamoDB는 파티션 키 값을 내부 해시 함수의 입력으로 사용합니다.해시 함수의 출력에 따라 항목이 저장될 파티션(DynamoDB 내부의 물리적 스토리지)이 결정됩니다.파티션 키 값이 같은 모든 항목은 정렬 키 값별로 정렬된 순서대로 함께 저장됩니다.

파티션 키와 정렬 키가 있는 테이블에서 두 항목의 파티션 키 값이 동일할 수 있습니다.그러나 이 두 항목은 서로 다른 정렬 키 값을 가져야 합니다.

복합 기본 키는 데이터를 조회할 때 추가적인 유연성을 제공합니다.예를 들어 아티스트에 대한 값만 제공하는 경우 DynamoDB는 해당 아티스트의 모든 곡을 검색합니다.특정 아티스트의 곡 일부만 검색하려면 곡 제목에 대한 값 범위와 함께 아티스트에 대한 값을 제공할 수 있습니다.

참고: 항목의 파티션 키를 해시 속성이라고도 합니다.해시 속성이라는 용어는 DynamoDB에서 파티션 키 값에 따라 데이터 항목을 파티션에 균등하게 분배하는 내부 해시 함수를 사용한 데서 유래합니다.

항목의 정렬 키를 범위 속성이라고도 합니다.범위 속성이라는 용어는 DynamoDB가 물리적으로 같은 파티션 키를 가진 항목을 정렬된 키 값에 따라 정렬된 순서로 함께 저장하는 방식에서 유래합니다.

참조 - https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.PrimaryKey

카산드라는 파티션이라고도 하는 관련 행 그룹을 나타내기 위해 복합 키(또는 복합 키)라고 하는 특수한 유형의 기본 키를 사용합니다.복합 키는 파티션 키와 선택적인 클러스터링 열 집합으로 구성됩니다.파티션 키는 행이 저장되는 노드를 결정하는 데 사용되며, 그 자체가 여러 개의 열로 구성될 수 있습니다.

언급URL : https://stackoverflow.com/questions/24949676/difference-between-partition-key-composite-key-and-clustering-key-in-cassandra

반응형