Создайте схему Кассандры для суперколонки с метаданными
Я хочу следующую структуру в моей базе данных с помощью 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 ответ
Метаданные столбцов в супер-столбцах уже применяются к самим вложенным столбцам. В вашем примере вы установили 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}
];
Стоит отметить, что эти метаданные будут применяться ко всем супер столбцам в строке. Поэтому, если у вас есть несколько суперстолбцов с подстолбцом с именем "город", проверка будет применяться ко всем из них.
Также отмечу, что использование супер-столбцов, как правило, не рекомендуется, так как они имеют ряд недостатков. Все подколонки в суперстолбце необходимо десериализовать при чтении одного подстолбца, и вы не можете установить вторичные индексы для суперстолбцов. Они также поддерживают только один уровень вложенности.
http://www.datastax.com/docs/1.0/ddl/column_family
Для достижения произвольного уровня вложенности вы можете использовать CompositeType в качестве компаратора столбцов в обычном семействе столбцов. К сожалению, на данный момент не так много документации по CompositeType. Я бы посоветовал просмотреть источник дополнительной информации src/java/org/apache/cassandra/db/marshal/CompositeType.java.