3

我想在我的数据库中使用 cassandra -cli 的以下结构

例如,我有一个人的地址,地址包含邮政编码、门牌号等示意图,如下所示:

name: "address",
value: {
    city: {name: "city", value: "San Francisco"},
    street: {name: "street", value: "555 Union Street"},
    zip: {name: "zipcode", value: "94105"},
}

我知道如何创建超列和普通列。但我想使用 column_metadata 来指定超列中的列的外观。所以最终会是这样的:

Create column family person
with comparator = UTF8Type
and key_validation_class=UTF8Type
and default_validation_class = UTF8Type
and compression_options =
{sstable_compression:SnappyCompressor, chunk_length_kb:64}
and column_metadata = [
{column_type: super, column_name: address, validation_class: UTF8Type
column_metadata =[
{column_name: city, validation_class: UTF8Type}
{column_name: Street, validation_class: UTF8Type}
{column_name: zip, validation_class: UTF8Type}
{column_name: housnumber, validation_class: LongType}
];

这是可能吗?

如果我可以将一个超级列放在另一个超级列中,那就更好了。这样,超级列“地址”可以包含多个超级列“地址”,列:“street”、“zip”等。

4

1 回答 1

7

超级列上的列元数据已经应用于子列本身。在您的示例中,您将 super 列的 validation_class 设置为 UTF8Type。这实际上没有意义,因为超级列的值是列本身而不是 UTF8。超级列名称已根据您设置为 UTF8Type 的比较器类型进行验证和排序。

所以你需要的是:

column_metadata = [
  {column_name: city, validation_class: UTF8Type}
  {column_name: Street, validation_class: UTF8Type}
  {column_name: zip, validation_class: UTF8Type}
  {column_name: housnumber, validation_class: LongType}
];

值得注意的是,此元数据将应用于该行中的所有超级列。因此,如果您有多个带有名为“city”的子列的超级列,则验证将适用于所有这些列。

我还要注意,通常不鼓励使用超级列,因为它们有几个缺点。超级列中的所有子列在读取一个子列时都需要反序列化,并且不能在超级列上设置二级索引。它们也只支持一层嵌套。

http://www.datastax.com/docs/1.0/ddl/column_family#about-super-columns

要实现任意级别的嵌套,您可以使用 CompositeType 作为常规列族上的列比较器。不幸的是,目前没有太多关于 CompositeType 的文档。我建议查看源代码以获取更多信息 src/java/org/apache/cassandra/db/marshal/CompositeType.java。

于 2011-11-29T05:45:18.480 回答