Vous pouvez créer un tableau comme celui
CREATE TABLE dynamic_columns
partitionKey bigint,
column_name text,
column_value_text text,
column_value_boolean boolean,
column_value_bigint bigint,
column_value_uuid uuid,
column_value_timestamp timestamp,
....
PRIMARY KEY((partitionKey), column_name)
);
Le PartitionKey est ici pour indiquer sur quelle machine (s) vos données seront être stockés dans le cluster
la colonne en cluster column_name
stocke l'étiquette de votre colonne dynamique. Ensuite, nous avons une liste de normale colonnes, une pour chaque type de données (bigint, UUID, timestamp ....)
Prenons et exemple:
INSERT INTO dynamic_columns(partitionKey, column_name, column_value_text)
VALUES(1, 'firstname', 'John DOE');
INSERT INTO dynamic_columns(partitionKey, column_name, column_value_boolean)
VALUES(1, 'validity_state', true);
INSERT INTO dynamic_columns(partitionKey, column_name, column_value_timestamp)
VALUES(1, 'validity_date', '2016-03-13 12:00:00+0000');
L'idée est que nous définissons une liste de column_value, un pour chaque type existant dans Cassandra mais nous insérons seulement des données dans la colonne de type appropriée, comme les exemples ci-dessus.
Pour l'interrogation, vous devez créer un index sur chaque colonne de type. Exemple:
CREATE INDEX ON dynamic_columns(column_value_boolean);
CREATE INDEX ON dynamic_columns(column_value_text);
CREATE INDEX ON dynamic_columns(column_value_boolean);
....
Si vous pouvez passer à Cassandra 3.4, il y a une meilleure mise en œuvre de l'index secondaire appelé SASI, voici la syntaxe pour la création d'index:
// All data types EXCEPT text
CREATE CUSTOM INDEX ON types(column_value_boolean)
USING 'org.apache.cassandra.index.sasi.SASIIndex'
WITH OPTIONS = {'mode': 'SPARSE'};
// Text data type
CREATE CUSTOM INDEX ON types(column_value_text)
USING 'org.apache.cassandra.index.sasi.SASIIndex'
WITH OPTIONS = {
'mode': 'PREFIX',
'analyzer_class' : 'org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer',
'case_sensitive': 'false'
};
Ensuite, vous pouvez interroger vos colonnes facilement:
//Give me col1 where value = 'val1'
SELECT * FROM dynamic_columns
WHERE partitionKey=1
AND column_name='col1'
AND column_value_text='val1';
//Give me 'validity_state' = true
SELECT * FROM dynamic_columns
WHERE partitionKey=1
AND column_name='validity_state'
AND column_value_boolean=true;
Remarque: vous devez toujours fournir partitionKey valeur dans votre SELECT sinon Cassandra va effectuer un balayage complet de cluster dans le pire des cas et tuer votre performance. Avec l'SASI index depuis Cassandra 3.4, ce problème est moins critique, mais il est encore fortement recommandé de fournir PartitionKey lors de l'utilisation index secondaire
Pour plus d'informations sur l'importance de la clé de partition, lisez ceci: http://www.planetcassandra.org/blog/the-most-important-thing-to-know-in-cassandra-data-modeling-the-primary-key/
Oh, merci beaucoup. Est-ce un très bon modèle. –