web-dev-qa-db-fra.com

Cassandra UUID vs TimeUUID avantages et inconvénients

Étant donné que TimeUUID vous permet d'utiliser now() dans CQL, y a-t-il des raisons pour lesquelles vous ne voudriez pas simplement continuer et utiliser toujours TimeUUID au lieu de l'ancien UUID?

42
Jacob

UUID et TIMEUUID sont stockés de la même manière dans Cassandra, et ils ne représentent vraiment que deux implémentations de tri différentes.

Les colonnes TIMEUUID sont triées d'abord par leurs composants temporels, puis par leurs octets bruts, tandis que les colonnes UUID sont triées d'abord par leur version, puis si les deux sont la version 1 par leur composant temporel, et enfin par leurs octets bruts. Curieusement, les implémentations de tri des composants temporels sont dupliquées entre UUIDType et TimeUUIDType dans le code Cassandra, à l'exception d'une mise en forme différente.

Je pense à la question UUID vs TIMEUUID principalement comme documentation: si vous choisissez TIMEUUID vous dites que vous stockez les choses dans l'ordre chronologique, et que ces choses peut se produire en même temps, donc un simple horodatage ne suffit pas. L'utilisation de UUID indique que vous ne vous souciez pas de l'ordre (même si en pratique les colonnes seront ordonnées par le temps si vous y mettez des UUID de version 1), vous voulez juste vous assurer que les choses ont des ID uniques.

Même si utiliser NOW() pour générer des valeurs UUID est pratique, il est également très surprenant pour les autres personnes lisant votre code.

Cela n'a probablement pas beaucoup d'importance dans le grand schéma des choses, mais le tri des UUID non-version 1 est un peu plus rapide que la version 1, donc si vous avez une colonne UUID et générez les UUID vous-même, optez pour une autre version .

58
Theo

Un TimeUUID est un vieux UUID simple selon documentation .

A UUID est simplement un valeur de 128 bits . Considérez-le comme un nombre incroyablement élevé.

Les bits particuliers peuvent être déterminés par l'une quelconque de plusieurs méthodes. La méthode originale impliquait de prendre adresse MAC du matériel réseau de l'ordinateur, combinant la date et l'heure actuelles, plus un nombre arbitraire et un nombre aléatoire. Écrasez tout cela ensemble pour obtenir un numéro pratiquement unique.

Plus tard, pour diverses raisons (sécurité, confidentialité), d'autres méthodes ont été inventées pour assembler les bits lors de la génération d'une valeur UUID. Ces autres méthodes omettent la date-heure et/ou l'adresse MAC comme ingrédient. Le point étant: toutes les valeurs UUID n'ont pas de valeur date-heure incorporée.

Le document Cassandra fait référence de manière incorrecte à son TimeUUID étant un "UUID de type 1". Le terme correct est Version 1 UUID. Cette version est parfois appelée "version temporelle".


Un petit conseil

Cassandra semble identifier cette version spécifique de l'UUID dans le but d'extraire la partie date et heure des 128 bits. Extraire la date-heure d'un UUID est une mauvaise idée .

D'une part, l'UUID n'a jamais été destiné à être utilisé pour un tel suivi de l'historique. En effet, la spécification pour UUID reconnaît spécifiquement que (a) les horloges informatiques peuvent être réinitialisées et à cet effet (b) les UUID générés plus tard peuvent en fait enregistrer une date-heure antérieure aux UUID précédents. Une autre raison pour ne pas extraire la date-heure d'un UUID est que vous pouvez très bien avoir des UUID qui n'ont pas été générés par la méthode time, donc vous allez créer une valeur de données-heure basée sur des bits qui ne représentent pas en fait la date-heure de la création. Une troisième raison est que lorsque le code de programmation est ultérieurement refactorisé, l'UUID peut être généré à une heure différente de l'enregistrement de la base de données, donc l'utilisation de la date-heure de l'UUID serait trompeuse.

Si vous devez suivre l'historique date-heure, faites-le explicitement. Créez un champ date-heure dans vos données. Soit dit en passant, suivez cette date-heure dans UTC , mais c'est un autre sujet.

24
Basil Bourque

Cela dit, vous devez en générer pour les croire. Les timeuuides sont la version/niveau 1 UUID semble seulement randomiser les 8 premiers caractères comme vous pouvez le voir ci-dessous, donc, il y a un risque de conflit, mais quand même timeuuid est meilleur que d'utiliser l'horodatage lui-même. Si le caractère aléatoire de l'uuid est important, l'utilisation de l'UUID de la version/niveau 4 est un meilleur choix avec presque collision improbable .

Ainsi, il semble que si vous ne vous souciez pas de l'unicité entre les partitions et que vos partitions sont des données de séries chronologiques à large rangée avec des écritures élevées et ont besoin d'un identifiant unique pour chaque événement (heure), c'est un bon choix qui a également l'avantage de grouper , pagination, etc.,.

insert into test_tuuid(1, now())
insert into test_tuuid(1, now())
insert into test_tuuid(1, now())
insert into test_tuuid(1, now())

49cbda60-961b-11e8-9854-134d5b3f9cf8
49d1a6c1-961b-11e8-9854-134d5b3f9cf8
49d59e61-961b-11e8-9854-134d5b3f9cf8
49d8d2b1-961b-11e8-9854-134d5b3f9cf8
1
kisna