2016-07-19 1 views
2

J'ai environ ~ 20-30 colonnes que je devrais stocker dans ma famille de colonnes au total. Cependant, mes données viennent dans différentes variations. J'ai différents objets qui appartiennent ensemble logiquement mais n'ont pas les mêmes champs (champs que dans les noms de clés). Parfois, 5 champs sont fournis, parfois 7 champs et ainsi de suite. Tous partagent une partie des champs qui sont toujours fournis.Cassandra Data Modeling: Utiliser une carte ou avoir beaucoup de colonnes vides?

Une ligne I insérée dans cette famille de colonnes n'aura jamais toutes les colonnes remplies. Lors de l'utilisation d'une carte, je pourrais ajouter des clés/valeurs basées sur le type d'objet et n'aurai pas le surcoût possible qui est introduit par mon autre modèle.

Je suis préoccupé par le nombre de colonnes vides dans chaque rangée.

Un inconvénient possible de l'utilisation d'une carte est que you can't have an index for map keys and map values coexist.

Questions réunies:

  1. -vous me suggérer d'utiliser une carte ou tout simplement ajouter toutes les colonnes je besoin de ma famille de la colonne?
  2. Je suppose que l'interrogation des données basées sur des clés/valeurs dans la carte est beaucoup plus lente que l'accès «direct» à partir des colonnes. Est-ce correct?
  3. Quels sont les inconvénients quand j'ai beaucoup de colonnes vides pour chaque rangée? Aérien?
  4. Est-il possible d'avoir un type de valeur "générique" lors de l'utilisation d'une carte? Je veux stocker des données différentes, principalement des chaînes mais aussi des flottants et entiers. Dois-je utiliser un map<text,text> et afficher les valeurs dans mon application?

J'utilise Cassandra 3.0.8 | Spécification CQL 3.4.0 | protocole natif v4

de Merci

Répondre

2

Je pense que d'avoir des valeurs de colonnes rares est tout à fait bien puisque c'est l'une des raisons pour lesquelles BigTable et toutes les solutions liées mettant en œuvre le même modèle de données cartographiques rares ont été créés.

Je serai plus préoccupé par les limitations dans l'utilisation des collections cql à la place, comme indiqué dans un autre S.O. répondez here.

En ce qui concerne vos questions spécifiques:

  • je vais personnellement utiliser des colonnes simples.
  • Cela dépend du modèle d'accès. Avez-vous besoin de toutes les colonnes de la carte? Si ce n'est pas le cas, sachez que Cassandra récupérera la collection dans son ensemble, de sorte que vous obtiendrez toutes les données, même si elles ne sont pas nécessaires.
  • Je ne vois pas de frais généraux ici: les données seront stockées en ignorant les colonnes vides
  • jointive

Quoi qu'il en soit, vous pouvez trouver quelques informations sur les limitations de Cassandra here. C'est une vieille page, mais je suppose que vous pouvez les utiliser comme limites inférieures pour les valeurs mises à jour.

Espérons que ça aide.

+0

en utilisant des colonnes simples me forcer à un nombre strict de colonnes, non? Lorsque vous utilisez l'approche de collecte, je serais plus flexible lorsque de nouvelles colonnes sont ajoutées. Est-il même possible d'ajouter plus de colonnes à un schéma lorsque le schéma a déjà xx Go de données? – j9dy

+1

En utilisant des colonnes simples, je pense que vous devriez définir votre schéma avec le nombre maximum de colonnes que vous pouvez avoir. Cela ne présente aucun inconvénient, car si une rangée n'a pas de colonne particulière, elle ne gaspillera pas d'espace. Et vous pouvez toujours ajouter de nouvelles colonnes au schéma si vous en avez besoin. Comme indiqué dans la documentation [ici] (https://docs.datastax.com/en/cql/3.1/cql/cql_reference/alter_table_r.html), l'ajout d'une colonne au schéma ne valide pas les données passées. En utilisant une collection vous garderez votre schéma plus court, mais vous aurez l'inconvénient souligné dans la réponse. – riccamini

1

En fait, Map, Set, List ne sont que des sintax CQL pour les anciennes structures de données Cassndra, et les cartes stockées comme une ligne large habituelle.

Voici plusieurs Slides sur les types de CQL mapping