2013-02-27 4 views
0

저는 카산드라에서 간단한 모델링 작업을 받았습니다. 거의 전적으로 SQL 배경에서 오는, 그러나, 나는 그것을 알아내는 데 약간의 어려움을 겪고있다.카산드라에서 다음 유스 케이스를 처리할까요?

기본적으로 우리는 주기적으로 해당 업데이트를 듣고있는 피드 목록을 가지고 있습니다. RSS, JSON, ATOM, XML 등 (피드에 따라 다름) 일 수 있습니다.

우리가 원하는 것은 각 피드의 새 항목을 주기적으로 확인하고 데이터를 몇 가지 형식 (예 : JSON 및 RSS)으로 변환 한 다음이를 Cassandra 상점에 저장하는 것입니다.

그래서, RBDMS에서, 구조는 유사 뭔가를 다음과 같습니다

Feed: 
feedId 
name 
URL 

FeedItem: 
feedItemId 
feedId 
title 
json 
rss 
created_time 

카산드라의 데이터는 대한 항목의 X 금액을 받고 같은 간단한 일을 용이하게하는 것을 모델링하는 방법에 관해서는 내가 혼란 스러워요 생성 된 내림차순의 특정 피드 (가장 일반적인 쿼리 일 수 있음).

나는이 예에서 피드 키를 가지고 시간 기반 UUID로 created_time을 저장하는 복합 키를 언급했지만 아직 약간 혼란 스럽다는 것을 알게되었다.

예를 들어 기본적으로 피드 ID가 일련의 행이 있다고 가정 해 보겠습니다. 각 행의 내부에는 위에서 언급 한 것처럼 다양한 열을 저장합니다. 문제는 실제 데이터가 어디로 이동합니까 (JSON, RSS, 제목)? 해당 '레코드'에 대한 모든 데이터를 열 값으로 저장해야합니까?

복합 키 아이디어가 마음에 들면 넓은 행과 좁은 (짧은?) 행이 혼동 스럽긴하지만 각 레코드에 다른 데이터를 저장하려고합니다. 두 개를 병합하는 방법을 모르겠습니다. 함께 ...

답변

1

하나의 열 패밀리에 모든 것을 저장할 수 있습니다. 그러나 각 FeedItem의 데이터가 매우 큰 경우 각 FeedItem의 데이터를 다른 열 패밀리로 나눌 수 있습니다.

예를 들어, 피드 familyfor 1 열이있을 수 있으며 그 키의 열은

Feeds # column family 
    FeedId1 #key 
     time-stamp-1-feed-item-id1 #columns have no value, or values are enough info 
     time-stamp-2-feed-item-id2 #to show summary info in a results list 

피드의 열을 빠르게 공급에서 마지막 N 아이템을 얻을 수 있습니다, FeedItem IDS, 같은 수 있습니다 피드의 마지막 N 개 항목을 쿼리 할 때, 각 FeedItem에 대해 모든 데이터를 가져올 필요가 없습니다. 아무것도 가져 오지 않거나 요약 만합니다.

그런 다음 당신은 당신의 SQL 배경에 따라 당신에게 이해하기 쉽게해야한다 CQL을 사용

FeedItems # column family 
    feed-item-id1 # key 
     rss # 1 column for each field of a FeedItem 
     title # 
     ... 
1

실제 FeedItem 데이터를 저장하기 위해 다른 열 가족을 사용할 수 있습니다.

카산드라 (일반적으로 NoSQL)는 매우 빠르며 관련 테이블을 피드 용으로 사용하면 실질적인 이점을 얻지 못합니다. 그러면 어쨌든 JOIN을 수행 할 수 없습니다. 당연히 두 테이블을 만들 수는 있지만, 응용 프로그램 코드 내에서 데이터를 연결 관리해야합니다.

CREATE TABLE FeedItem (
    feedItemId ascii PRIMARY KEY, 
    feedId ascii, 
    feedName ascii, 
    feedURL ascii, 
    title ascii, 
    json ascii, 
    rss ascii, 
    created_time ascii); 

가 여기에 내가 모든 것을 아스키 필드를 사용 :

당신은 같은 것을 사용할 수 있습니다.feedItemId 또는 created_time에 대해 다른 데이터 유형을 사용하도록 선택할 수 있으며 사용 가능한 데이터 유형은 here이며 사용중인 언어 및 클라이언트에 따라 투명하게 처리되거나 작동하게하려면 더 많은 작업이 필요합니다.

일부 보조 인덱스를 추가 할 수 있습니다.

SELECT * FROM FeedItem where feedId = '123'; 

인덱스 생성하려면 : 당신이 뭔가 같은 특정 feedId에서 항목 피드를 검색하려는 경우 예를 들어,

CREATE INDEX FeedItem_feedId ON FeedItem (feedId); 

정렬/주문, 슬프게도을, 그것은 카산드라 쉬운 일이 아니다 . 어쩌면 herehere을 읽는 것이 어디에서 찾을지를 알 수있는 단서를 제공 할 수 있으며, 실제로는 사용하려는 카산드라 버전에 따라 다릅니다.

관련 문제