2013-07-14 2 views
1

사용 사례는 다음과 같습니다. 여러 타사 소스의 데이터를 저장하고 쿼리해야합니다. 내가 가지고있는 유일한 사전 정의 된 스키마 지식은 추가 소스 구성 요소 인 (E, A, V, S)이있는 Entity-Attribute-Value 튜플로 구성된다는 것입니다. 어떤 속성이 존재하는지 미리 알지 못합니다 (실제 속성 자체를 사용하는 것은 문제가됩니다). 조합 (E,A,V)은 고유해야하고, 그래서 저는 복합 키가이 모델하는 가장 좋은 방법이 될 것 같은 것을 사용하여 생각, 그래서 우리는이 얻을 :Cassandra 1.2에서 동일한 테이블에 대해 두 개의 개별 복합 키를 모델링하는 방법은 무엇입니까?

:

CREATE TABLE t1 (
     E text, 
     A text, 
     V text, 
     S text, 
     PRIMARY KEY(E, A, V) 
); 

이 같은 쿼리를 물어 저를 가능하게 할 것이다

  • 주어진 E, 모두가 속성 그들이
  • 주어진 E와 발생하는 V 및 소스 S 값 표시, 모든 V.에게

계획을 제공하는 것은 MIRR를 만드는 것입니다 S 주어진

  • , 모든 E, A, V를 보여 모든 엔티티 E를 보여

    • 주어진 A와 V. 값 : 다른이 테이블의 ORS는 나는 또한 양식의 쿼리에 응답 할 수 있도록 복합 키를 주문 튜플.

    등 (사실 미러 테이블은 인덱스의 역할을하며 전체 인덱싱을 얻으려면 효과적으로 동일한 데이터의 6 개 사본이 필요합니다. 아직 그 접근법의 확장성에 대해서는 확실하지 않지만, 그러나 그것은 내가 추측하는 분리 된 질문이다).

    그러나 지금까지 내가 고민하고있는 부분은 다음과 같습니다. V 사실 여러 속성을 가진 개체입니다. 이것이 관계형 모델 인 경우 Vidtype 필드와 value 필드로 매핑하는 관계를 가리키는 외래 키 필드가됩니다. 그러나 외래 키 (및 그와 함께하는 조인)를 없애는 것은 BigTable 방식의 요점이며 내 테이블에 이것을 통합하는 방법을 찾고 있습니다 t1. 물론

    , 나는 이런 식으로 뭔가를 할 수 :

    CREATE TABLE t1 (
         E text, 
         A text, 
         V_id text, 
         S text, 
         V_type text, 
         V_value text, 
         PRIMARY KEY(E, A, V_id) 
    ); 
    

    그러나 내가 보는 문제는이 V의 ID, 유형과 값 사이의 (inverse-) 함수 관계를 캡처하는 데 실패한다는 것입니다 :와 위의 표는, 내가 예를 들어, 얻을 수 :

    E | A | V_id | V_type | V_value 
    ---+----+------+--------+-------- 
    a1 | b1 | 1 | X  | foo 
    a1 | b1 | 2 | X  | foo 
    a1 | b2 | 1 | Y  | bar 
    

    나는 반대 V_id, 유형과 가치 제공을 보장 할 수 있도록하려면 고유하고 있지만. 내가 뭘했는지는 이전 Cassandra 버전에서 중첩 된 슈퍼 컬럼이 될 것이라고 생각하지만 CQL3에서 필요한 것을 얻기 위해 노력하고 있습니다.

    필자는 컬렉션 유형을 간략하게 살펴 보았지만 사용 사례에 맞지 않는 것 같습니다.

    누구나 모델을 만드는 더 좋은 방법을 제안 할 수 있습니다. 이상적으로는 (E, A, V)을 검색하고 가능한 한 적은 수의 쿼리를 검색 할 수 있기를 원합니다. 또는 나는 단지 그것을 overthinking하고 나는 현재 사실 괜찮습니다 (물론 응용 프로그램 수준에서 고유성을 시도하고 확인할 수 있습니다) 접근 방식입니까?

  • +0

    'd'는 무엇입니까? '(a, b, c_type, c_value)'를 얻고 싶다면'd'가 어디에 들어 맞을까요? 나는 당신이 방금'a','b','c''와'd'가 실제로 무엇인지 말해 주면 대답하기가 훨씬 쉬울 것이라고 생각합니다. 그것이 너무 추상적이어서. – Theo

    +0

    @ Thehe 나는 그것을보다 구체적으로 만들기 위해 질문을 수정했다. –

    답변

    1

    t1을 비정규 화하고 특정 v_id에 대한 속성을 저장할 수있는 새 테이블을 만들 수 있습니다. 이렇게하면 SQL과 동등한 조인을 얻을 수 있습니다.

    CREATE TABLE t2 (
         V_id text PRIMARY KEY, 
         type text, 
         value text, 
        ); 
    

    카산드라에 매핑 SQL 작업에 아주 좋은 읽기있다 : v_id이 고유 가정, 새 테이블은 다음과 같은 구조를 가질 수 http://maxgrinev.com/2010/07/12/do-you-really-need-sql-to-do-it-all-in-cassandra/enter link description here

    +0

    나는 이것을 생각했지만 필자는 본질적으로 두 개의 쿼리, 즉'E, A, V_id'를 검색 한 다음 주어진 쿼리에 대해'V_type, V_value'를 검색하는 두 번째 쿼리를 수행한다는 것을 의미합니다. 'V_id'. 또는 나는 무엇인가 놓치고 있냐? –

    +1

    예! 이 방법으로 두 가지 쿼리를 수행 할 것이지만 작업하기 쉽고 깨끗한 구조를 얻을 수 있습니다. –

    +0

    bw를 현재 구조와 함께 사용하면 고유 값을 가져 오려면 기본 키를 다시 고려해야합니다. cassandra는 기본 키의 일부인 변수에 변경 사항이있을 때 새로운 항목을 작성하고 동일한 기본 키 (기본 키의 모든 부분)가있는 항목을 덮어 씁니다. 귀하의 경우에는 기본 키의 일부인 A와 A가 다르기 때문에 v_type과 v_value가 중복됩니다. –

    관련 문제