2014-12-21 1 views
1

범위 쿼리하는 prodid의 INT, 상태 INT, PRIMARY KEY ((prodgroup), prodid는, 상태)카산드라 기본 키 디자인은 내가 열 가족에게</p> <p>prodgroup 텍스트를 디자인했다

데이터 모델을 수용하는 ID의 주어진 범위의 제품 그룹에서 제품의

  • 가져 오기 목록을 제품의

    • 가져 오기 목록을 수용하는 것입니다
    • 특정 제품의 세부 사항을 얻기
    • 비활성 제품 acive/활성 또는 비활성 제품의
    • 가져 오기 목록의
    • 업데이트 상태 (선택 * 제품의 경우 prodgroup = 'XYZ'를하는 prodid> 0 상태 = 0)

    마지막 쿼리를 제외하고는 디자인이 정상적으로 작동합니다. 카산드라가 제품 ID를 수정하지 않으면 상태를 쿼리 할 수 ​​없습니다. 나는 "PRIMARY KEY ((prodgroup), staus, productid)"키가있는 슈퍼 컬럼 패밀리를 정의하는 것이 효과적이라고 생각합니다. 다른 대안에 대한 전문가의 조언을 얻고 싶습니다.

  • 답변

    3

    파티션 키 (이 경우 그룹 ID)를 제공하는 경우 보조 인덱스에 이상적인 사용 사례입니다. 상태에 대한 2 차 Indea를 작성하면 상태에 대한 정확한 일치 여부를 쿼리 할 수 ​​있습니다. 파티션 키를 제공했는지 확인하십시오. 그렇지 않으면 클러스터의 모든 단일 노드로 쿼리가 이동하여 시간이 초과 될 수 있습니다. 당신이하고있는 것처럼 보이는 파티션 키를 제공한다면, 상태에 대한 2 차 인덱스는 당신이 당신의 쿼리를 수행하도록 허용해야합니다.

    또 다른 문제가 있습니다 ... 당신은 pk의 일부로 상태가 있습니다. 이는 제품에 대해 업데이트 할 수 없음을 의미합니다. 다른 상태에 대해서만 새 행을 만들 수 있습니다. 이것은 당신이 필요로하지 않을 가능성이 있습니다. 그렇다면 마지막 쿼리에서 필터링 허용을해야합니다 (이미 파티션으로 필터링 한 퍼펙트 히트는 아닙니다).

    사용 사례의 경우이 스키마와 쿼리를 사용합니다. 나는 모든 사용 사례를 다루고 생각 : 보조 인덱스 업데이트가 원자와 카산드라에 의해 관리되는

    create table products2(
        prodgroup text, 
        prodid int, 
        status int, 
        primary key (prodgroup, prodid) 
    ); 
    
    create index on products2 (status); 
    
    select * from products2 where prodgroup='groupname' and prodid>0 and status=0; 
    

    때문에, 한 파티션을 타격하고,이 멋지게 일 것이다.

    희망이 있습니다.