如何在 Cassandra 的另一个 UDT 中嵌套一个 UDT?

问题描述

我在 cassandra 中创建了以下用户定义类型 (UDT):

CREATE TYPE keyspace.location (
    latitude text,longitude text,accuracy text,address text
);

CREATE TYPE keyspace.person (
    name text,contact_no text,alternate_contact text
);

我想用这些来创建另一个 UDT

CREATE TYPE keyspace.pinpoint(
    user <person>,location <location>
);

解决方法

您需要将这些嵌套的 UDT 声明为 frozen<UDTName>,例如:

CREATE TYPE keyspace.pinpoint(
    user frozen<person>,location frozen<location>
);

但这意味着您将无法更新他们的各个字段 - 您只能更新整个字段,以及完整的 UDT 实例,例如,完整的 userlocation

,

您可以通过以这种方式将您的 UDT 指定为另一个 UDT 中的类型来嵌套 UDT:

CREATE TYPE keyspace.pinpoint (
    user person,location location
);

不要将它们括在 <> 方括号中,因为它们用于集合。

作为旁注,除非您别无选择,否则我个人不会嵌套 UDT。 UDT 不如原生列灵活。在嵌套的 UDT 中插入或更新数据会变得非常复杂且难以维护。

只要有可能,尽量使用通用的表定义。例如,不要定义类型 pinpoint,而是尝试使用具有本机列类型和聚集行的表。干杯!