2012-04-28 3 views
1

내가 카산드라의 표준 열 가족이하고자하는 POJO의 한 단면 :카산드라 사용자 유지 CF 인덱스

분명히
class Person { 
string key 
string name 
string dob 
List<String> phones 
List<String> ids } 

내 키가 내 차 인덱스입니다. 목록을 작성하는 방법? 그것들을 위해 새로운 CF를 만들거나 그것들을 모두 컬럼으로 추가해야합니까?
좋아, 그래서 나는 또한 평등을 통해 검색 할 수 있습니다. 얻을 사람이 어디 전화 = 1,112,223,333 받을 사람이 어디 FIRSTNAME = 알과 DOB = YYYY-MM-DD

내가 내장 보조 인덱스 밖으로 그래서 그 규칙 않습니다 대부분 고유의 모든 열이 약 100 백만 사람을 말하는거야?

"내 기본 키는 전화이고 열 이름은 개인 CF의 기본 키입니다.

그러나 전화를 삭제해야 할 경우 key = 1234로 지정하면 휴대 전화의 CF 색인을 어떻게 유지 관리합니까? TIA Jurgyman

+0

인당 정한 전화 번호는 몇 개입니까? 전화 번호와 사람 사이에 일대일 매핑이 있습니까? 아니면 둘 이상의 사람에게 전화 번호가 속해있을 수 있습니까? –

+0

전화 번호가 많을 경우 ... 남편과 아내가 모두 집 번호와 동일하게 표시됩니다. –

+0

하나의 아이디어는 전화 번호를 Person CF의 phone 열에 JSON String으로 저장하는 것입니다. 전화 번호를 삭제할 때 주어진 키를 사용하여 행을 쿼리합니다. 1234 전화 열의 항목을 제거하고 색인 CF의 해당 행을 제거합니다. –

답변

3

우선, 보조 인덱스가 낮은 카디널리티 (예 : 반복되는 값이 많은 경우)에서 잘 작동하기 때문에 보조 색인은 적합하지 않습니다. 전화 번호가이를 만족하지 않습니다. 그들은 기술적으로 작동하지만 클러스터 크기가 커질수록 비효율적입니다.

보조 인덱스가없는 양방향 조회가 필요한 경우 가장 좋은 방법은 자체 인덱스를 유지하는 것입니다. 이는 데이터를 읽는 데 필요한 방식으로 데이터를 작성하는 일반적인 디자인 철학을 따릅니다. RDBMS 세계에서 오면 정상화에 익숙해 져 있으므로 익숙해 져야합니다.

나는 당신이 놓친 부분이 전화 번호를 당신의 사람 CF와 색인의 양쪽에 저장하고 싶어한다고 생각합니다. 이렇게하면 사람들을위한 전화와 휴대 전화 사용자를 볼 수 있습니다. 휴대 전화를 추가/제거해야하는 경우 두 곳에서 동시에 수행 할 수 있습니다. DBMS와 관계를 유지하는 논리를 응용 프로그램으로 옮기고 있습니다.

+0

"데이터"를 열 이름으로 사용하는 사람들의 예를 보았습니다 ... 특히 "인덱스"유형의 CF에서. 그 일에 이득이 있습니까? (아마도 IO, getValue 호출이 없다). 내 목록 속성 중 하나가 10k 개까지 올라갈 수 있다면 ... 열로 모두 추가하지 말고 10 또는 100을 값에 넣고 다음과 같은 열 이름을 사용합니다. attr_10 attr_20 attr_30 (여기서 10 개의 값이 분리됩니다. 값 필드에 있음). –

+1

@ AlanJurgensen은 카산드라가 주변에 있었기 때문에 카산드라 모델에서 인기있는 접근 방식이었습니다. 그러나 Cassandra 1.1에는 CQL 언어에 대한 추가 기능이있어 이러한 종류의 "대체 된"또는 "옆으로 향하는"데이터 모델을 쉽게 처리 할 수 ​​있습니다. http : //www.datastax를 참조하십시오.com/dev/blog/schema-in-cassandra-1-1을 참고하십시오. –