2016-06-20 2 views
0

전통적인 SQL 데이터베이스 대신 Cassandra를 사용하는 새로운 응용 프로그램을 설계하려고합니다. 클러스터링 및 수평 확장 기능은 특히 유스 케이스에 유용합니다.카산드라에 유연한 스키마 저장

필자는 서로 다른 레코드가 여러 개있는 상황이 있습니다. 예를 들어, 다른 스포츠 정보를 저장하는 경우, 두 팀, 선수, 하프 시간과 풀 타임 이후의 결과, 레드 카드, 옐로우 카드 등의 정보를 저장하는 축구 용으로 테니스 경기라면 두명의 상대방, 세트 수 등

각 스포츠 (로드가 있음)에 대한 테이블을 갖고 싶지는 않으며 매번 데이터베이스를 수정하지 않고도 새로운 스포츠를 추가하고 싶을 것입니다. . 이 정보가 레코드의 스포츠 유형에 따라 임의로 변경 될 수있는 곳에서 유연하게 유지하려고합니다.

카산드라에서 어떻게 이런 종류의 정보를 모델링하는 것이 가장 좋습니까? 나는 이것이 MongoDB와 같은 '문서'지향 데이터베이스가 아니라는 것을 알고 있습니다. 그러나 나머지 응용 프로그램에서는 Cassandra가 제공하는 '테이블과 같은'구조가 이상적입니다.

텍스트 필드에 JSON 문자열로 저장하고 응용 프로그램 수준에서 처리 할 수 ​​있다는 것을 알고 있습니다.하지만 JSON 문자열 안의 필드를 일괄 쿼리하기위한 미래의 요구 사항이 제한됩니다 (예 : 모든 일치 그에게는 특정한 심판이 있었다).

지도로 저장하는 또 다른 방법이 있다는 것을 알고 있습니다. 그러나 인덱스는 조금 제한된 것처럼 보입니다. 모든 예제에서는 값이 아닌 맵 키를 기반으로 인덱스를 찾는 것처럼 보입니다. 그리고 어떤 사람들은지도에서 색인의 사용을 너무 방해하는 것 같습니다.

어떤 옵션이 있습니까?

+0

"어떤 옵션이 있습니까?" 그럼 당신은 이미 그것을 대답했습니다. – OrangeDog

+0

저는 카산드라를 "테이블과 같은"것이 아니라 키 - 값 (실제로는 무엇인가)으로 생각할 것을 제안합니다. 또한 맵을 중첩 할 수는 없지만 불투명 한 JSON-as-text 필드를 사용할 수는 있습니다. – OrangeDog

+0

@OrangeDog JSON 구조체는 실제로는 평면 일 수 있으므로 문제는되지 않습니다. 내 질문은지도를 사용하여 위험한 길을 몰고 갈 것인지 여부, 내가 읽지 않은 단점이 있는지, 그리고 다른 옵션이 있는지 여부에 더 많은 것을 할 수 있습니다. – jbx

답변

0

나는 동일한 문제가있었습니다. 간단한 간계 : 키의 열과 값의 열을 만듭니다. 때로는 정적 열과 함께 사용할 수도 있습니다.

등 :

CREATE TABLE gameOverview (
     sportType text, sportPropertyIndex1 text static, sportPropertyIndex2 text static, sportPropertyIndex3 text static, 
     sportPropertyValue1 text, sportPropertyValue2 text, sportPropertyValue3 text, 
     PRIMARY KEY(sportType, sportPropertyValue1, sportPropertyValue2, sportPropertyValue3) 
    ) 

정적 열은 파티션 내에서 정적이다. 파티션이 너무 커지기 때문에 정적 열을 사용할 수없는 경우가 있습니다. (스포츠 타입이 너무 클 수 있음). 그런 다음 정적 컬럼을 사용하지 말고 응용 프로그램에서 이러한 컬럼을주의하십시오.

/e 왜 내가지도 대신 이것을 사용 했습니까? 값 인덱스를 만들 수도 있지만 보조 인덱스 일뿐입니다. 그러나 아는 바와 같이 보조 인덱스의 성능이 가장 좋지는 않습니다. 이 솔루션을 사용하면 기본 색인의 이점을 사용할 수 있지만지도의 유연성도 있습니다.

+0

하지만이 경우 수동으로 속성 키를 하드 코딩하지 않습니까? 일부에는 20 개의 필드가 있고 일부는 30 개의 필드가있을 수 있습니다. 나는 모든 분야를 만드는 것을 피하고 싶다. 예를 들어 관계형 데이터베이스를 사용하고 있다면 3 개의 필드, 게임 ID, 속성 키 및 값을 가진'game_info'라는 별개의 일대 다 테이블을 가질 수 있습니다.'select * from game_info는 game_id = 1'입니다. 모든 필드의 인덱스를 작성하면 일부 조인 트릭을 사용하여 경기장 XYZ에서 모든 게임을 즐길 수 있습니다. – jbx

관련 문제