2010-03-09 3 views
4

만 다음 두 ... 다음 테이블 구조로하여 조회되는A는 MySQL의 데이터/질의 세트 등가 산드 표현으로는

CREATE TABLE foo_objects (
    id int NOT NULL AUTO_INCREMENT, 
    foo_string varchar(32), 
    metadata_string varchar(128), 
    lookup_id int, 
    PRIMARY KEY (id), 
    UNIQUE KEY (foo_string), 
    KEY (lookup_id), 
); 

을 ... 500 천만 열 MySQL의 테이블을 고려 번역 쿼리 ...

# lookup by unique string key, maximum of one row returned 
SELECT * FROM foo_objects WHERE foo_string = ?; 
# lookup by numeric lookup key, may return multiple rows 
SELECT * FROM foo_objects WHERE lookup_id = ?; 

이러한 쿼리가 주어지면 Cassandra를 사용하여 주어진 데이터 세트를 어떻게 표현할 수 있습니까?

(1) 전통의 일종이다 :

답변

2

은 두 가지 옵션이 당신의 foo는 개체를 하나의 CF (columnfamily), foo는 당 하나의 행, 필드 당 하나의 열이 있습니다. 그런 다음 두 개의 인덱스 CF를 만듭니다. 여기서 하나의 행 키는 문자열 값이고 다른 행 키는 lookup_id입니다. 인덱스 행의 열은 fooid입니다. 따라서 인덱스 CF에서 GET을 수행하면 ID의 MULTIGET이 반환됩니다.

id를 lookup_id와 동일하게 만들려면 관리 할 색인이 하나 더 적어야합니다.

Digg의 lazyboy (http://github.com/digg/lazyboy)와 같은 고급 클라이언트는 인덱스 CF 유지 관리를 자동화합니다. 카산드라는 자동으로 (아직) 이것을하지 않습니다.

(2)는 (1)과 비슷하지만 전체 foo 객체를 색인 행의 하위 열에 복제합니다 (즉, 색인 최상위 열은 수퍼 열입니다). 실제로 foo id 자체로 질의하지 않는다면, 그것을 자신의 CF에 전혀 저장할 필요가 없습니다.