哦,也许我在这里尝试一些愚蠢的事情,我得到的错误已经给了我一个暗示我的意思。但是可以在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-10339之后报告了Cassandra 2.1: Recursion by nesting UDT's,因此引入了此错误消息
在关系数据库中我理解这是一个问题,但为什么C *不能处理这个问题。无论如何数据都没有引用自身,所以我希望在C *本身内发生“循环引用”。但为什么这里有问题呢?它仅描述了数据的结构。对我而言,它就像一个json对象,其中对象结构在其自身内重复。
如果有人问我这个问题,我可能会回答“你为什么要这个?”
因此,现实世界的例子将是一种决策树。所以我有一个表questionaire
,它有一个用户定义的类型question
。这个问题包含了接下来要问的问题。对于question
类型,这可以是两个属性,如果是,则没有问题。这有希望澄清我正在努力做的事情。
答案 0 :(得分:1)
如果Cassandra不支持此类操作,那么您可能希望将数据结构存储为常规文本列(而不是UDT)中的json字符串。
答案 1 :(得分:1)
使用Cassandra无法进行循环UDT引用,有关解释,请参阅CASSANDRA-10339。
您应该将问题建模为表格,而不是UDT。当然,您每次都必须发出一个查询以获得下一个问题,但我没有看到任何其他选择。