2016-08-17 1 views
0

오케, 어쩌면 내가 여기있는 바보 같은 것을 시도하고 있으며 오류는 이미 나에게 힌트를 주었다. 그러나 C *에서 사용자 정의 유형을 가질 수 있습니까?그 자체를 포함하는 사용자 정의 형식

이렇게 결과가됩니다.

CREATE TYPE udt (
    id uuid, 
    child frozen <udt>, 
    childeren list <frozen <udt>> 
); 

InvalidRequest: code=2200 [Invalid query] message="Unknown type space.udt" 

유형을 선언해야한다고 생각합니다. 내부에서 사용하기 전에. 그래서 자연스럽게 나는 이와 같은 것을 시도 할 것입니다.

CREATE TYPE udt (
    id uuid 
); 

ALTER TYPE udt ADD child frozen <udt>; 
--ALTER TYPE udt ADD children list <frozen <udt>>; 

InvalidRequest: code=2200 [Invalid query] message="Cannot add new field child of type space.udt to type space.udt as this would create a circular reference" 

이 오류 메시지는 내가이 문제가 이해 관계형 데이터베이스에서이 게시물 Cassandra 2.1: Recursion by nesting UDT's

후보고로 인해 CASSANDRA-10339을 도입하지만, 왜 안 C *이이 문제를 처리 할 수 ​​있습니다. 데이터는 어쨌든 참조되지 않으므로 C * 자체에서 "순환 참조"가 발생합니다. 그러나 왜 여기에 문제가 있습니까? 데이터가 어떻게 구성되어야 하는지를 설명합니다. 나에게 그것은 객체 구조가 그 자체 내에서 반복되는 json 객체와 같을 것이다.

누군가 나에게이 질문을하는 경우 "왜 이걸 원 하겠니?"라고 대답 할 것입니다.

그래서 실제 사례는 일종의 의사 결정 트리입니다. 그래서 나는 사용자 정의 타입이 question 인 테이블 questionaire을 가지고있었습니다. 이 질문은 다음 질문에 대한 질문입니다. 유형이 question 인 예와 종류가없는 두 가지 속성이 될 수 있습니다. 이것은 내가하려고하는 것을 명확하게 해명합니다.

답변

1

Cassandra가 이러한 작업을 지원하지 않으면 아마도 UDT 대신 일반 텍스트 열에 json 문자열로 데이터 구조를 저장하려고합니다.

+0

체인 문제가 이론적으로 무한한 것으로 보이는 경우 이러한 종류의 저장소는 매우 비효율적 일 수 있습니다. 게다가, 두 가지 질문은 적어도 이론적으로는 다음 질문으로 이어질 수 있습니다. 이 경우에는 json 문자열에 중복을 저장하는 것도 비효율적입니다. – adutra

+0

나는이 aproach가 하나의 json 내에 중복 된 데이터를 저장해야한다고 동의하지 않는다. ID를 다른 질문에 대한 참조로 저장하면 충분합니다. 따라서이 표현에서 무한한 일련의 질문들도 가능합니다. –

+0

이것은 내가 생각해 낸 대안 중 하나였습니다. 그러나 질문은 왜 C *에서 가능하지 않은지에 관한 것입니다. 그래도 나는 udt 또는 json에서 데이터가 무한 할 수 있다는 것을 알지 못합니다. 나는 그것이 유한 한 것이 아니라 어떤 경우에도 무한 데이터를 저장/처리 할 수 ​​없다는 것을 이해합니다. – pjanssen

1

카산드라에서는 원형 UDT 참조를 사용할 수 없습니다. 자세한 설명은 CASSANDRA-10339을 참조하십시오.

질문을 UDT가 아닌 테이블로 모델링해야합니다. 물론, 다음 질문을하기 위해 매번 쿼리를 실행해야하지만 다른 대안은 없습니다.

+0

내가 카산드라를 정확하게 이해했다면 이것은 일종의 반 패턴이다. – pjanssen