Cassandra UUID vs avantages et inconvénients de TimeUUID

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

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

TIMEUUID colonnes TIMEUUID sont d’abord sortingées par leurs composants de temps, puis par leurs octets bruts, tandis que les colonnes UUID sont d’abord sortingées par leur version, puis toutes les deux par leur composant time et enfin par leurs octets bruts. Curieusement, les implémentations de sorting des composants temporels sont dupliquées entre UUIDType et TimeUUIDType dans le code Cassandra, à l’exception des mises en forme différentes.

Je pense à la question UUID vs. TIMEUUID principalement comme documentation: si vous choisissez TIMEUUID vous dites que vous TIMEUUID choses dans un ordre chronologique, et que ces choses peuvent se produire en même temps, donc un simple horodatage ne suffit pas . Utiliser UUID dit que vous ne vous souciez pas de l’ordre (même si, en pratique, les colonnes seront classées par heure si vous insérez des UUID dans la version 1), vous voulez simplement vous assurer que les identifiants sont uniques.

Même si l’utilisation de NOW() pour générer des valeurs UUID est pratique, il est également très surprenant que d’autres personnes lisent votre code.

Cela n’a probablement pas beaucoup d’importance dans le schéma général, mais le sorting 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 vous-même les UUID, optez pour une autre version.

Un TimeUUID est un ancien UUID simple selon la documentation .

Un UUID est simplement une valeur de 128 bits . Pensez-y comme un nombre incroyablement grand.

Les bits particuliers peuvent être déterminés par l’une quelconque de plusieurs méthodes. La méthode originale consistait à prendre l’ adresse MAC du matériel réseau de l’ordinateur, en combinant la date et l’heure actuelles, ainsi qu’un nombre arbitraire et un nombre aléatoire. Squish 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 les dates et / ou les adresses MAC comme ingrédients. Le point étant: toutes les valeurs UUID n’ont pas une valeur date-heure incorporée.

Le document Cassandra se réfère à tort à son TimeUUID comme étant un “UUID Type 1”. Le terme correct est la version 1 UUID . Cette version est parfois appelée “version temporelle”.


Un petit conseil

Cassandra semble identifier cette version spécifique d’UUID dans le but d’extraire la partie date et heure des 128 bits. Extraire la date et l’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 des ordinateurs peuvent être réinitialisées et que (b) les UUID générés ultérieurement peuvent en fait enregistrer une date-heure antérieure à celle des UUID précédents. Une autre raison pour ne pas extraire la date et l’heure d’un UUID est que vous pourriez avoir des UUID qui n’ont pas été générés par la méthode time. Par conséquent, vous allez créer une valeur de date / heure basée sur des bits qui ne représentent pas la date de la création. Une troisième raison est que lorsque le code de programmation est ultérieurement refactoré, l’UUID peut être généré à un moment différent de l’enregistrement de la firebase database. L’utilisation de la date et de l’heure de l’UUID serait donc trompeuse.

Si vous devez suivre l’historique de la date et de l’heure, faites-le explicitement. Créez un champ date-heure dans vos données. Au fait, suivez cette date-heure en UTC , mais c’est un autre sujet.

Tout compte fait, il faut en générer pour les croire. Les timeuuids sont des versions / niveau 1 UUID semble seulement randomiser les 8 premiers caractères comme vous pouvez le voir ci-dessous, donc il y a une chance de conflit, mais timeuuid est quand même préférable à l’utilisation de timestamp lui-même. Si le hasard est important, utiliser UUID version / niveau 4 est un meilleur choix avec une collision presque improbable .

Donc, si vous ne vous souciez pas de l’unicité des partitions et que vos partitions contiennent des données de séries chronologiques étendues avec des écritures élevées et que vous ayez besoin d’un identifiant unique pour chaque événement (temps), la 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