2014-01-14 3 views
0

나는 비슷한 카산드라 데이터베이스에서 중첩 된 데이터 모델을 만들기 위해 노력하고 있어요 :카산드라 중첩 키 - 값. 더 나은 솔루션?

Forums = { 
    forum001: { 
     name: "General News", 
     topics: { 
      topic000001: { 
       subject: "This is what I think", 
       date: "2012-08-24 10:12:13", 
       posts: { 
        post20120824.101213: { username: "tom", content: "Blah blah", datetime: "2012-08-24 10:12:13" } 
        post20120824.101513: { username: "dick", content: "Blah blah blah", datetime: "2012-08-24 10:15:13" } 
        post20120824.103213: { username: "harry", content: "Blah blah", datetime: "2012-08-24 10:32:13" } 
       } 
      }, 
      topic000002: { 
       subject: "OMG Look at this", 
       date: "2012-08-24 10:42:13", 
       posts: { 
        post20120824.104213: { username: "tom", content: "Blah blah", datetime: "2012-08-24 10:42:13" } 
        post20120824.104523: { username: "dick", content: "Blah blah blah", datetime: "2012-08-24 10:45:23" } 
        post20120824.104821: { username: "harry", content: "Blah blah", datetime: "2012-08-24 10:48:21" } 
       } 
      } 
     } 
    }, 
    forum002: { 
     name: "Specific News", 
     topics: { 
      topic000003: { 
       subject: "Whinge whine", 
       date: "2012-08-24 10:12:13", 
       posts: { 
        post20120824.101213: { username: "tom", content: "Blah blah", datetime: "2012-08-24 10:12:13" } 
        post20120824.101513: { username: "dick", content: "Blah blah blah", datetime: "2012-08-24 10:15:13" } 
       } 
      } 
     } 
    } 
} 

데이터의 기본 디자인은 서로 내에 중첩 된지도의 무리입니다. 이 데이터 구조를 쿼리하는 것이 어렵다는 이유로이 방법이 합리적이지 않다고 읽었습니다. 이러한 방식으로 데이터를 구조화하기 위해이 문제에 대한 더 나은 해결책은 무엇입니까?

+0

당신이 나에게 정밀도의 비트를 줄 수는 카산드라에서이 지속 얼마나 : 천 시간) 이베이에서이 두 부분 기사인가? blob, 수퍼 컬럼 (API 만 남아 있고 실제로 복합 소재 임) 또는 Composables? 또는 위의 혼합? 여기에 입력 한 스키마의 키, 열 이름 또는 열은 무엇입니까? –

+0

이전에 올바르게 구조화하는 방법을 알아 내려고했지만 아직이 구조체를 설계하지 않았습니다. 위의 구조 모델은 개념적으로 생각한 것이지만 기능과 속도면에서 우선적으로 걱정하고 싶습니다. 나는 데이터베이스에서 응답 한해야 할 주요 질문은 다음과 같습니다 이 는 희망이 기능의 I와, 조금 도움 "나에게 [시간 1] 및 [TIME2] forumID = [ID]와 사이의 모든 게시물을 부여" 데이터베이스에서 필요 없다. – user2356226

+0

많은 도움을 주셔서 감사합니다 ... 나는 답변을 게시 할 것입니다. –

답변

1

정렬 할 수있는 모든 범위 (예 : 날짜의 경우)를 사용하여 쿼리하려면 column_name에 있어야합니다. 내가 포럼을 만들 것

먼저 행 키를 IDS와 column_family은 다음과 같이 보일 것이다 : 당신이 달의 모든 게시물의 범위 post::201203* ~ post::201204*에 열을 반환하도록 요청해야 이로부터

*Row*: "forum001"<br> 
=> *column*: "name" - *value*: "General News"<br> 
=> *column*: "post::20120824101213::[some_uuid]" - *value*: "[serialized blob of data representing everything in the post]"<br> 

을 예를 들어 3 월.

기억해야 할 점은 행이 카산드라 클러스터에 무작위로 저장된다는 것입니다 (권장되는 카산드라의 기본 설정을 유지하는 경우). 같은 행의 열은 동일한 노드에 있고 정렬되므로 값 범위에 사용할 수 있습니다.

열 이름에 대해 필자는 열에 직렬화 된 개체의 형식을 접두사로 사용합니다 (같은 방법으로 여러 형식을 가질 수 있음).

  • ISO format date + a random UUID : 그럼 당신은 열 이름에 날짜 표현하는 방법에 몇 가지 선택을 가지고있는 ISO 형식이 디버깅을 위해 가독성 제공하고 문자열로 정렬을, 추가 된 UUID는의 고유성을 보장 할 수있다 열 이름 (또는 트래픽이 많은 기간에 실수로 덮어 쓸 수도 있음)
  • TimeUUID : 한 번에 정렬 및 고유성을 부여하지만, 사용자는 자신을 cassandra 콘솔 도구에서 직접 말할 수 없습니다.

당신은 비정규에게

좋은 읽기 (나는 이것을를 붙여 넣은 생각 쿼리 기준 (작성자, 날짜, 크기, ...) 모든 종류의 다른 행 이름을 사용하므로 사용해야합니다
Cassandra Data Modeling Best Practices, Part 1
Cassandra Data Modeling Best Practices, Part 2

+0

도움을 많이 주셔서 감사합니다. 확실히 조사 할 것입니다. – user2356226