2011-11-28 4 views
3

Je veux la structure suivante dans ma base de données avec le cassandra -cliCréer un schéma Cassandra pour une super-colonne avec des métadonnées

par exemple, j'ai une personne ayant une adresse et l'adresse contient un code postal, numéro de maison etc schématique il ressemble à ceci:

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

Je sais comment créer une supercolonne et des colonnes normales. Mais je veux utiliser column_metadata pour spécifier à quoi ressemblent les colonnes d'une supercolonne. Alors qui finirait par quelque chose comme ceci:

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

Est-ce possible?

Ce serait encore mieux si je peux mettre une super colonne dans une autre super colonne. De cette façon, la super colonne "addresses" pourrait contenir plusieurs super colonnes "address" avec des colonnes: "street", "zip", etc.

Répondre

7

Les métadonnées de colonne sur les super colonnes s'appliquent déjà aux sous-colonnes elles-mêmes. Dans votre exemple, vous définissez une validation_class pour la super-colonne à UTF8Type. Cela n'a pas vraiment de sens puisque les valeurs de la super colonne sont des colonnes elles-mêmes non UTF8. Les super noms de colonnes sont déjà validés et triés en fonction du type de comparateur que vous avez défini sur UTF8Type.

Donc ce que vous avez besoin est:

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

Il convient de noter que ces métadonnées appliquera à tous les super-colonnes de la ligne. Donc, si vous avez plusieurs super colonnes avec une sous-colonne nommée "ville", la validation s'appliquera à toutes les colonnes.

Je noterai également que l'utilisation de super colonnes est généralement déconseillée car elles présentent plusieurs inconvénients. Toutes les sous-colonnes d'une super colonne doivent être désérialisées lors de la lecture d'une sous-colonne et vous ne pouvez pas définir d'index secondaires sur les super-colonnes. Ils ne prennent également en charge qu'un seul niveau d'imbrication.

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

Pour atteindre un niveau arbitraire de l'imbrication, vous pouvez utiliser CompositeType comme comparateur de colonne sur une famille régulière de la colonne. Malheureusement, il n'y a pas beaucoup de documentation sur CompositeType pour le moment. Je suggère de regarder par-dessus la source pour plus d'informations src/java/org/apache/cassandra/db/marshal/CompositeType.java.

+0

J'ai découvert qu'il n'est pas possible de mélanger des colonnes régulières et super-colonnes. Quel dommage. Mais merci pour l'explication sur les métadonnées de colonne s'applique directement aux sous-colonnes. Je ne le savais pas. – Rubenski

Questions connexes