2016-12-02 2 views
2

Je dois stocker une structure de tampon de protocole dans Cassandra 3.x. Il est défini dans un fichier .proto comme:Est-il légitime de stocker des tuples CQL avec des composants NULL dans Cassandra 3.x

message Attribute 
{ 
    required string key = 1; 
    oneof value { 
     int64 integerValue = 2; 
     float floatValue = 3; 
     string stringValue = 4; 
    } 
} 

Pour stocker plusieurs Attributes je pensais à cette définition de CQL.

CREATE TABLE ... attributes: map<text, tuple<int, float, text> ... 

et dans chaque tuple 2 de 3 composants serait en fait null. Je n'ai pas encore testé cette syntaxe mais y a-t-il des inconvénients à utiliser cette approche? Peut-être existe-t-il un meilleur moyen, c'est-à-dire des types définis par l'utilisateur?

Répondre

1

Essayons cela. Je vais commencer par une table simple, contenant une colonne de type valuemapmap<text,tuple<int,float,text> que vous avez ci-dessus:

CREATE TABLE tupleTest (
    key text, 
    value text, 
    valuemap map<text, FROZEN<tuple<int,float,text>>>, 
    PRIMARY KEY (key)); 

Je vais INSERT quelques données:

INSERT INTO tupletest (key,value,valuemap) VALUES ('1','A',{'a':(0,0.0,'hi')}); 
INSERT INTO tupletest (key,value,valuemap) VALUES ('2','B',{'b':(0,null,'hi')}); 
INSERT INTO tupletest (key,value,valuemap) VALUES ('3','C',{'c':(null,null,'hi')}); 

Et puis je vais SELECT il, juste pour voir:

[email protected]:stackoverflow> SELECT * FROM tupletest ; 

key | value | valuemap 
-----+-------+--------------------------- 
    3 |  C | {'c': (None, None, 'hi')} 
    2 |  B | {'b': (0, None, 'hi')} 
    1 |  A |  {'a': (0, 0, 'hi')} 

(3 rows) 

La principale crainte au sujet explicitement INSERT valeurs NULL dans ing Cassandra, est que « non colonnes "rmal", ils créent réellement des pierres tombales. Mais puisque nous ne définissons pas une colonne entière à NULL, simplement un élément dans un tuple (imbriqué dans une carte), ce n'est pas le cas. En fait, ils montrent None. Et quand je regarde les SSTables sous-jacents, je ne vois pas non plus de preuve qu'une pierre tombale a été écrite.

Normalement, je dirais que INSERT explicitement NULL dans Cassandra est une idée terrible et terrible. Mais dans ce cas, cela ne devrait pas vous causer de problèmes. Maintenant, quant à savoir si cela est considéré comme "légitime" ou une bonne pratique ... eh bien, mes sens de modélisation de données ne sont pas approuvés. Je trouverais une autre façon de représenter l'absence d'une valeur dans un type de tuple, car quelqu'un (le développeur qui vous suit) pourrait voir cela et interpréter cela comme étant "ok" pour explicitement INSERT NULL dans les autres valeurs de colonne.

+0

Bonne réponse Aaron, merci. Je n'ai jamais vu le type 'valuemap' avant et il n'est pas non plus documenté sur la page des types de données CQL 3.3. Savez-vous où je peux trouver quelques détails sur ce type? – reikje

+0

@reikje 'valuemap' n'est pas un type c'est un nom de colonne d'une carte qui contient un tuple imbriqué à l'intérieur. Désolé pour la confusion là-bas. – Aaron

+0

Je vois, eu un peu confus à cause de la carte-suffixe :) – reikje