Создайте схему Cassandra для суперстолбца с метаданными - PullRequest
3 голосов
/ 28 ноября 2011

Я хочу следующую структуру в моей базе данных с 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}
];

Это вообще возможно?

Было бы еще лучше, если бы я мог поместить суперколонку в другую суперколонку. Таким образом, супер-столбец «адреса» может содержать несколько супер-столбцов «адрес» со столбцами: «улица», «почтовый индекс» и т. Д.

1 Ответ

7 голосов
/ 29 ноября 2011

Метаданные столбцов в супер-столбцах уже применяются к самим вложенным столбцам. В вашем примере вы установили 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.

...