2016-08-17 4 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" 

このエラーメッセージは、この記事の後、私はこれが問題であるが、なぜC *これを処理することはできません理解して、リレーショナルデータベースでCassandra 2.1: Recursion by nesting UDT's

を報告されたため、CASSANDRA-10339に導入されます。とにかくデータが参照されていないので、C *自体の中で "循環参照"が起こっていると思います。しかし、なぜそれが問題なのですか?データの構造を記述するだけです。私にとっては、オブジェクト構造がそれ自身の中で繰り返されるjsonオブジェクトのようになります。

誰かが私にこの質問をしたら、私はおそらく「なぜあなたはこれを望んでいますか?」と答えるでしょう。

実際の例は、一種の決定木です。だから私はquestionのユーザー定義型のテーブルquestionaireを持っています。この質問には、次に質問する質問があります。これは、タイプがquestionのyesとno種類の質問の場合、2つの属性になります。これは私がしようとしていることをうまく明確にします。

答えて

1

Cassandraがこのような操作をサポートしていない場合は、データ構造を(UDTの代わりに)通常のテキスト列内にjson文字列として格納することをお勧めします。

+0

連鎖質問の数が理論的に無限であると思われる場合、この種のストレージは非常に非効率的である可能性があります。また、2つの質問は、少なくとも理論的には、次の同じ質問につながる可能性があります。この場合、json文字列に重複を格納することも非効率的です。 – adutra

+0

私は、このaproachは、1つのjson内に重複したデータを格納する必要があると考えています。他の質問への参照としてIDを格納するだけで十分です。したがって、無限の一連の質問もこの表現で可能です。 –

+0

これは私が思いついた選択肢の1つでした。しかし、なぜそれがC *では不可能なのかという疑問があります。それでも、私はudtやjsonの方が、データが無限になる可能性があるとは思わない。私はそれが有限ではないことを理解していますが、無限のデータを格納/ハンドリングすることはできません。 – pjanssen

1

Cassandraでは円形のUDT参照はできません。詳しくはCASSANDRA-10339を参照してください。

質問をUDTではなくテーブルとしてモデル化する必要があります。確かに、次回の質問をするたびにクエリを発行する必要がありますが、他の方法はありません。

+0

カッサンドラが正しく理解されていれば、これは一種のアンチパターンです – pjanssen

関連する問題