카산드라 열 패밀리/테이블에 대한 올바른 데이터 모델을 찾아 내 필요한 쿼리를 수행하는 데 어려움을 겪고 있습니다.Cassandra 데이터 정렬 범위 쿼리
금융 거래를 나타내는 단일 유형의 엔티티에 대한 데이터 만 저장하면됩니다. (정렬 쿼리에 적용) 주요 분야 :
- UUID : 거래 시간
- SOURCE_ID : 거래
- 타임 스탬프마다 고유 한 ID 문자열 (낮은 기수, 데이터 세트에서 일반적으로 < (10) 고유 값)
- destination_id : 문자열 (낮은 카디널리티 일반적 < 10 데이터 세트에서 고유 값)
- MERCHANT_ID : 문자열 (높은 카디널리티 ~ 100K 고유 값)
추가 필드가 있습니다 (총 약 20 개). 그러나 쿼리 나 주문에는 필요하지 않습니다.
- UUID
- 하여 날짜 범위에 의해, 주문 SOURCE_ID/destination_id의 정확한 값에 대한 MERCHANT_ID
UUID를 쿼리 기준 :
나는 다음과 같은 두 가지 방법으로 거래를 조회 할 필요가 날짜 범위 쿼리는 가능한 한 효율적이어야하지만 오프라인 프로세스로 매일 실행되므로 시간이 오래 걸릴 수 있습니다. 쿼리 시간이 no로 확장되는 방식을 이해하는 것이 좋습니다. 기록.
Cassandra는 파티션 키 구성에 영향을 줄 경우 2 개의 데이터 센터에서 4 개의 노드 클러스터로 설정됩니다. 나는 카산드라 2.0을 사용하고 있습니다.
Cassandra에 다소 익숙하기 때문에 합성 키, timeuuid, 슬라이스 쿼리 등을 읽었지만 다소 혼란 스럽습니다. 누구나 올바른 접근 방식을 제시하거나 올바른 방향으로 나를 가리킬 수 있다면 매우 감사하게 생각합니다.
감사합니다. 는 (참고, 내가 여기에 있으리라 믿고있어/destination_id이 요구 사항 모두를 의미 SOURCE_ID이 : 쿼리 2는 좀 더 복잡하다
create table tx_by_uuid (
tx_id uuid PRIMARY KEY,
tx_time timestamp,
source_id text,
dest_id text,
merchant_id text
)
:
답변 해 주셔서 감사합니다. 범위 쿼리를 지원하기 위해 제안 된 기본 키를 보는 것이 도움이되었습니다. 이전에 파티션 키의 타임 스탬프로 시도했는데 오류가 발생했습니다. 지금 내가 이해하고있는 것처럼 범위를 쿼리하기 위해 파티션 키를 제한해야합니다. 즉 단일 노드 만 쿼리하면됩니까? 또한 올바르게 이해했다면 예제에서 레코드가 두 테이블에 걸쳐 복제되어야합니다. 하나의 테이블로 UUID의 레코드에 효율적으로 액세스 할 수있는 방법이 있습니까? 높은 카디널리티로 인해 UUID의 보조 인덱스가 좋은 아이디어가 아니라고 가정합니다. – siwatson
카산드라에서는 효율적인 질의를 위해 다른 구조로 데이터를 복제하는 것만으로 충분합니다.) 그리고 당신은 높은 카디널리티에 대해 정확합니다. – stinkymatt
설명해 주셔서 감사합니다. 날짜 범위에서 레코드를 쿼리해야하지만 판매자 ID별로 결과를 쿼리해야한다는 제 요구 사항에 대한 또 다른 질문 - 동일한 tx_time 값을 가진 레코드에 대해 merchant_id의 주문 만 제안하는 기본 키. 즉, 내가 tx_by_merchant에 날짜 범위를 쿼리하면 실제로 tx_time에 의해 정렬 된 레코드를 얻습니다. 내 최고의 접근 방식을 날짜로 쿼리 및 임시 테이블에 merchant_id (고정 파티션 키)에 대한 색인을 생성 할 수있는 결과를 넣어? – siwatson