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}
];

これはまったく可能ですか?

スーパー カラムを別のスーパー カラムに入れることができればさらに良いでしょう。このようにして、スーパー列「住所」には、「番地」、「郵便番号」などの列を持つ複数のスーパー列「住所」を含めることができます。

4

1 に答える 1

7

スーパー列の列メタデータは、サブ列自体に既に適用されています。あなたの例では、スーパーカラムの 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」という名前のサブ列を持つ複数のスーパー列がある場合、検証はそれらすべてに適用されます。

また、いくつかの欠点があるため、スーパー カラムの使用は一般的にお勧めできません。スーパー カラムのすべてのサブカラムは、1 つのサブ カラムを読み取るときにデシリアライズする必要があり、スーパー カラムにセカンダリ インデックスを設定することはできません。また、1 レベルのネストのみをサポートします。

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 に答える