使用元数据为超级列创建Cassandra架构

Rub*_*ski 3 schema command-line-interface cassandra super-columns

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

例如,我有一个人的地址,地址包含一个zipcode,housenumber等原理图,它看起来像这样:

name: "address",
value: {
    city: {name: "city", value: "San Francisco"},
    street: {name: "street", value: "555 Union Street"},
    zip: {name: "zipcode", value: "94105"},
}
Run Code Online (Sandbox Code Playgroud)

我知道如何创建超列和普通列.但我想使用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}
];
Run Code Online (Sandbox Code Playgroud)

这是可能吗?

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

nic*_*ley 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}
];
Run Code Online (Sandbox Code Playgroud)

值得注意的是,此元数据将应用于行中的所有超级列.因此,如果您有多个超级列,其子列名为"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.