首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cassandra 2.1:通过嵌套UDT的递归

问Cassandra 2.1:通过嵌套UDT的递归
EN

Stack Overflow用户
提问于 2015-03-13 16:49:37
回答 2查看 926关注 0票数 2

我在玩用户定义的类型,发现你可以这样做:

代码语言:javascript
复制
cqlsh:test> CREATE TYPE ping(time timestamp);
cqlsh:test> CREATE TYPE pong(time timestamp, ping frozen <ping>);
cqlsh:test> ALTER TYPE ping ADD pong frozen <pong>;


cqlsh:test> DESC TYPE ping ;

CREATE TYPE test.ping (
    time timestamp,
    pong frozen<pong>
);

cqlsh:test> DESC TYPE pong ;

CREATE TYPE test.pong (
    time timestamp,
    ping frozen<ping>
);

这与任何用例都相关吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-15 09:30:47

这是在开发一个密切相关的Java驱动票证时遇到的。

模式似乎是递归的,但当您实际尝试插入数据时,这种方法不起作用:

代码语言:javascript
复制
// (using int instead of time for the sake of clarity)
cqlsh:test> create type ping(pingid int);
cqlsh:test> create type pong(pongid int, ping frozen<ping>);
cqlsh:test> alter type ping ADD pong frozen<pong>;
cqlsh:test> create table foo(ping frozen<ping> primary key);

// These are OK:

cqlsh:test> insert into foo(ping) values( {pingid:1} );

cqlsh:test> insert into foo(ping) values(
    { pingid:1, 
      pong: { pongid:2, 
              ping: {pingid: 3}}} );

// But notice what happens when you nest one more level:

cqlsh:test> insert into foo(ping) values(
    { pingid:1, 
      pong: { pongid:2, 
              ping: {pingid: 3, 
                     pong: {pongid: 4}}}} );
InvalidRequest: code=2200 [Invalid query] message="Unknown field 'pong' in value of user
defined type ping"

看起来,在定义ping时使用的pong是一个“副本”,它没有看到ALTER语句的效果。因此,我的猜测是,递归是不允许的,并有一个缺失的检查。当我得到卡桑德拉开发者的确认后,我会更新我的答案。

一个有趣的副作用是,在此之后既不能删除ping,也不能删除pong:)

编辑:--这确实是ALTER TYPE不应该允许的。见卡桑德拉-10339。

票数 2
EN

Stack Overflow用户

发布于 2015-03-14 05:52:19

好吧,我还没有看到/听说过这些用例中的任何一个,但是您可以使用这样的结构来存储树或链接列表(尽管Cassandra已经支持列表,所以我不知道会有什么好处)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29037733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档