web-dev-qa-db-fra.com

Quels sont les avantages ou les inconvénients de stocker json en tant que texte vs blob dans Cassandra?

Un problème avec blob pour moi est qu'en Java ByteBuffer (qui est mappé à blob dans cassandra) n'est pas sérialisable et ne fonctionne donc pas bien avec les EJB.

Considérant que le json est assez grand, quel serait le meilleur type pour stocker le json à Cassandra. Est-ce un texte ou un blob?

La taille du JSON est-elle importante pour décider du blob vs JSON?

S'il s'agissait d'une autre base de données comme Oracle, il est courant d'utiliser blob/clob. Mais dans Cassandra, où chaque cellule peut contenir jusqu'à 2 Go, est-ce important?

Veuillez considérer cette question comme le choix entre le texte et le blob pour ce cas, au lieu de trier des suggestions quant à l’utilisation de la colonne unique pour json.

12
pinkpanther

Je ne pense pas qu'il soit avantageux de stocker les données littérales JSON en tant que BLOB dans Cassandra. Au mieux, vos coûts de stockage sont identiques et, en général, les API sont moins pratiques pour travailler avec les types BLOB que pour travailler avec des chaînes/du texte. 

Par exemple, si vous utilisez leur API Java then, afin de stocker les données en tant que BLOB à l’aide d’un paramètre paramétré PreparedStatement, vous devez d’abord le charger dans un ByteBuffer, par exemple en plaçant vos données JSON dans un InputStream. . 

Sauf si vous traitez avec des extraits de code {très volumineux} _JSON qui vous obligent de toute façon à diffuser vos données en continu, le travail nécessaire pour accéder au type BLOB est considérable. Et que gagneriez-vous? Essentiellement rien.

Cependant, je pense qu’il est bon de demander ' Devrais-je stocker JSON en tant que texte ou gzip et stocker les données compressées sous la forme BLOB? '. 

Et la réponse à cette question dépend de la façon dont vous avez configuré Cassandra et votre table. En particulier, tant que vous utilisez Cassandra version 1.1 ou ultérieure, la compression est activée par défaut pour vos tables. Cela peut être suffisant, en particulier si vos données JSON sont relativement uniformes sur chaque ligne.

Toutefois, la compression intégrée de Cassandra est appliquée à l'échelle de la table plutôt qu'à des lignes individuelles. Vous pouvez donc obtenir un meilleur taux de compression en compressant manuellement vos données JSON avant le stockage, en écrivant les octets compressés dans un fichier ByteBuffer, puis en les envoyant à Cassandra en tant que BLOB.

Il s’agit donc essentiellement d’un compromis entre espace de stockage, commodité de programmation et utilisation du processeur. Je déciderais la question comme suit:

  1. Est-ce que minimiser la quantité de stockage consommée vous préoccupe la plus grande?
    • Si oui, compressez les données JSON et stockez les octets compressés sous la forme BLOB;
    • Sinon, passez à # 2.
  2. La compression intégrée de Cassandra est-elle disponible et activée pour votre table?
    • Si non (et si vous ne pouvez pas activer la compression), compressez les données JSON et stockez les octets compressés sous la forme BLOB;
    • Sinon, passez à # 3.
  3. Les données que vous stockez sont-elles relativement uniformes sur chaque ligne?
    • La réponse est probablement «oui» pour les données JSON. Dans ce cas, vous devez stocker les données sous forme de texte et laisser Cassandra gérer la compression.
    • Sinon, passez à # 4.
  4. Voulez-vous de l'efficacité ou de la commodité?
    • Efficacité; compresser les données JSON et stocker les octets compressés sous la forme BLOB
    • Commodité; compresser les données JSON, base64 les données compressées, puis stocker les données codées en base64 sous forme de texte.
15
aroth

Puisque les données ne sont pas binaires, il y a vraiment peu de raisons d'utiliser un OBject volumineux. Bien sûr, vous pouvez le faire, mais pourquoi? Le texte est plus facile à lire pour les humains et il n’ya pas vraiment de différence vitesse/taille (. 

Même dans d'autres bases de données, vous pouvez souvent stocker JSON sous forme de texte. Par exemple. Même MySQL a des champs de texte qui peuvent gérer assez peu de texte (LONGTEXT = 4Go). Oui, Oracle est en retard, mais j'espère qu'ils auront aussi un long champ de texte raisonnable.

Mais pourquoi voulez-vous stocker un objet Json entier sous forme de texte? Le json doit vraiment être normalisé et stocké sous la forme de plusieurs champs dans la base de données. 

0
Astrogat

Je dirais certainement que ce texte serait mieux qu'un blob pour stocker JSON. JSON est finalement du texte, donc ce type a du sens, mais il peut aussi y avoir une surcharge pour les blobs, car certains pilotes semblent exiger qu'ils soient convertis en Hex avant de les insérer. En outre, les blobs apparaissent sous forme de chaînes codées en base64 lors de l'utilisation de cqlsh. Vous ne pourrez donc pas vérifier facilement le contenu du fichier JSON stocké si vous en avez besoin à des fins de test. Je ne sais pas exactement comment les blobs sont stockés sur le disque, mais j'imagine que c'est très similaire au texte.

Cela dit, stocker des entrées volumineuses peut causer des problèmes et n'est pas recommandé . Cela peut causer des problèmes de partage et utiliser beaucoup de mémoire. Bien que FAQ fasse référence à des fichiers de plus de 64 Mo, l'expérience même des fichiers de quelques mégaoctets en moyenne peut entraîner des problèmes de performances lorsque vous commencez à en stocker un grand nombre. Si possible, il serait préférable d'utiliser un magasin d'objets si vous vous attendez à ce que le JSON ait une taille de mégaoctets et aux références de magasin à ce magasin situé dans Cassandra.

0
Jonathan