Maison >base de données >tutoriel mysql >Stratégie de génération d'ID de clé primaire de base de données

Stratégie de génération d'ID de clé primaire de base de données

藏色散人
藏色散人avant
2019-08-15 14:21:303625parcourir

Avant-propos :  

L'ID système unique est un problème que nous rencontrons souvent lors de la conception d'un système. Voici quelques stratégies courantes de génération d'ID.

Quantity ID de séquence

● UUID

● GUID

● COMB

● Flocon de neige

Premier auto- ID d'incrémentation Afin de répondre aux besoins de bases de données distinctes, différents points de départ seront utilisés sous le principe de l'incrémentation automatique. Cependant, cela est extrêmement gênant lorsqu'une expansion de la base de données est nécessaire. Par exemple, lorsque nous concevons pour la première fois la base de données d'un certain système, il y aura 10 tables dans la base de données. Ensuite, nous avons besoin de différents identifiants pour le contenu de chaque table. Nous pouvons utiliser différentes formes non croissantes, par exemple, la première table. est 1, 11, 21, 31. . . Le deuxième tableau est 2, 12, 22, 32. . . Le troisième tableau est 3, 13, 23, 33. . . La dixième table est 10, 20, 30. . . Mais le problème est que si un jour je trouve que les 10 tables de ce système ne suffisent plus, et que je souhaite ajouter une autre table, comment les clés primaires doivent-elles être allouées à ce moment-là ? De plus, si vous souhaitez fusionner des données de plusieurs bases de données, mais pour cette méthode simple de génération d'identifiants, la possibilité de duplication est très élevée, donc une duplication se produira presque certainement. Évidemment, l’évolutivité de la méthode précédente sera médiocre.

Par rapport à l'ID à incrémentation automatique, l'UUID est plus pratique pour générer une clé primaire unique (lorsque la quantité de données est très importante, il existe une possibilité de duplication), mais en raison du désordre de l'UUID, les performances n'est pas aussi bon que l'ID à incrémentation automatique et le stockage de chaînes, un grand espace de stockage et une faible efficacité des requêtes. Clé : L'inconvénient de l'utilisation de uuid est la faible efficacité des requêtes !

COMB augmente l'ordre des identifiants générés par rapport à l'UUID, et l'efficacité de l'insertion et de la requête est améliorée. Cet article propose une analyse simple.

Sonwflake est la stratégie de génération de clé primaire de Twitter, qui peut être considérée comme une amélioration de COMB, utilisant un entier de 64 bits au lieu d'une chaîne de 128 bits. La composition de l'ID est la suivante : le premier 0 + un préfixe temporel de 41 bits + une identification de nœud de 10 bits + un numéro de séquence de 12 bits pour éviter la concurrence.

Partie 1 : ID de séquence


Séquence ou champ d'incrémentation automatique de la base de données, la manière la plus courante. Il est maintenu par la base de données et est unique à la base de données.

Avantages :

Code simple et pratique, performances acceptables.

Les identifiants numériques sont naturellement triés, ce qui est utile pour la pagination ou les résultats qui doivent être triés.

Inconvénients :

Différentes bases de données ont une syntaxe et une implémentation différentes, qui doivent être traitées lors de la migration de la base de données ou lors de la prise en charge de plusieurs versions de bases de données.

Dans le cas d'une seule base de données ou d'une séparation lecture-écriture ou d'un maître et de plusieurs esclaves, une seule base de données maître peut être générée. Il existe un risque de défaillance unique.

Il est difficile de se développer lorsque les performances ne peuvent pas répondre aux exigences.

Ce sera assez pénible si plusieurs systèmes doivent être fusionnés ou si une migration de données est impliquée.

Il y aura des problèmes lors de la division des tables et des bases de données.

Plan d'optimisation :

Pour le point unique de la bibliothèque principale, s'il existe plusieurs bibliothèques Maître, le numéro de départ fixé par chaque bibliothèque Maître est différent et l'étape la taille est la même, ce qui peut être le nombre de maîtres.

Par exemple : Master1 génère 1, 4, 7, 10, Master2 génère 2,5,8,11 et Master3 génère 3,6,9,12. Cela génère efficacement des identifiants uniques dans le cluster et réduit considérablement la charge sur les opérations de base de données de génération d'identifiants.

Partie 2 : UUID


Gestion npm https://www.npmjs.com/package/uuid

Moyens courants, 128 morceaux. Il peut être généré à l’aide d’une base de données ou d’un programme et est généralement unique au monde.

Un UUID est un identifiant unique au monde de 128 bits, généralement représenté par une chaîne de 32 octets. Il peut garantir l'unicité du temps et de l'espace, également appelé GUID, le nom complet est : UUID - Universally Unique IDentifier, appelé UUID en Python.

Il utilise l'adresse MAC, l'horodatage, l'espace de noms, le nombre aléatoire, le nombre pseudo-aléatoire pour garantir l'unicité de l'ID généré.

L'UUID dispose principalement de cinq algorithmes, c'est-à-dire cinq méthodes pour l'implémenter.

(1), uuid1()

—basé sur l'horodatage. Généré à partir de l'adresse MAC, de l'horodatage actuel et d'un nombre aléatoire. L'unicité globale peut être garantie, mais l'utilisation de MAC pose également des problèmes de sécurité. L'IP peut être utilisé à la place du MAC dans le réseau local.

(2), uuid2()

Basé sur l'environnement informatique distribué DCE (cette fonction n'existe pas en Python). L'algorithme est le même que uuid1, sauf que les 4 premières positions de l'horodatage sont remplacées par POSIX UID. Cette méthode est rarement utilisée en pratique.

(3), uuid3()

Valeur de hachage MD5 basée sur le nom. Il est obtenu en calculant la valeur de hachage MD5 du nom et de l'espace de noms, garantissant l'unicité des différents noms dans le même espace de noms et l'unicité des différents espaces de noms, mais le même nom dans le même espace de noms génère le même uuid.

(4), uuid4()

basé sur des nombres aléatoires. Obtenu à partir de nombres pseudo-aléatoires, il existe une certaine probabilité de répétition, et cette probabilité peut être calculée.

(5), uuid5()

Valeur de hachage SHA-1 basée sur le nom. L'algorithme est le même que uuid3, sauf que l'algorithme Secure Hash Algorithm 1 est utilisé.

Avantages :

Code simple et pratique.

Le seul au monde, il peut gérer cela sereinement en cas de migration de données, de fusion de données système ou de modifications de bases de données.

Inconvénients :

Il n'y a pas de tri et on ne peut pas garantir que la tendance augmente.

L'UUID est souvent stocké à l'aide de chaînes et l'efficacité des requêtes est relativement faible.

L'espace de stockage est relativement important S'il s'agit d'une base de données massive, vous devez tenir compte de la capacité de stockage.

La quantité de données transférées est importante

Illisible.

Solution d'optimisation :

Afin de résoudre le problème de l'UUID illisible, vous pouvez utiliser la méthode UUID vers Int64.

Partie 3 : GUID


GUID : Il s'agit de l'implémentation par Microsoft de la norme UUID. Il existe diverses autres implémentations de l'UUID, pas seulement du GUID. Les avantages et les inconvénients sont les mêmes que ceux de l'UUID.

Partie 4 : COMB


Le type COMB (combiner) est une idée de conception unique à la base de données et peut être compris comme un GUID amélioré, qui combine le GUID et l'heure système pour offrir de meilleures performances d'indexation et de récupération.

Il n'y a pas de type COMB dans la base de données, il a été conçu par Jimmy Nilsson dans son article "The Cost of GUIDs as Primary Keys".

L'idée de base de conception du type de données COMB est la suivante : étant donné que les données UniqueIdentifier ont une faible efficacité d'indexation en raison de leur irrégularité, ce qui affecte les performances du système, pouvons-nous conserver le préfixe de UniqueIdentifier par combinaison ? 10 octets, et les 6 derniers octets sont utilisés pour représenter l'heure (DateTime) à laquelle le GUID a été généré. De cette manière, nous combinons les informations temporelles avec UniqueIdentifier, ce qui augmente l'ordre tout en conservant l'unicité de UniqueIdentifier. , améliorant ainsi l'efficacité de l'index.

Avantages :

Résolvez le problème du désordre UUID et fournissez l'algorithme Comb (guid/horodatage combiné) dans sa méthode de génération de clé primaire. Réservez 10 octets du GUID et utilisez les 6 autres octets pour représenter l’heure à laquelle le GUID a été généré (DateTime).

Les performances sont meilleures que l'UUID.

Partie 5 : L'algorithme de flocon de neige de Twitter


Snowflake est l'algorithme de génération d'identifiant distribué open source de Twitter, et le résultat est un identifiant long. L'idée principale est la suivante : utiliser 41 bits comme nombre de millisecondes, 10 bits comme ID de machine (5 bits sont le centre de données, 5 bits comme ID de machine) et 12 bits comme numéro de série en millisecondes (ce qui signifie que chaque nœud peut générer 4096 ID), et il y a un bit de signe à la fin, qui est toujours 0. L'algorithme du flocon de neige peut être modifié en fonction des besoins de votre propre projet. Par exemple, estimez le nombre de futurs centres de données, le nombre de machines dans chaque centre de données et le nombre de simultanéités possibles en une milliseconde unifiée pour ajuster le nombre de bits requis dans l'algorithme.

Avantages :

Ne dépend pas de la base de données, est flexible et pratique, et a de meilleures performances que la base de données.

L'ID augmente avec le temps sur une seule machine.

Inconvénients :

est incrémentiel sur une seule machine, mais en raison de l'environnement distribué impliqué, les horloges de chaque machine ne peuvent pas être complètement synchronisées, et peut-être parfois il peut Il peut y avoir des situations dans lesquelles l'accroissement global n'est pas atteint.

6. Utilisez

C'est vraiment pratique à utiliser :

npm install uuid --save

Ensuite, vous pouvez l'utiliser !

  const uuidv1 = require(‘uuid/v1‘);
  console.log(‘随机uuid字符串‘, uuidv1());

De cette façon, nous pouvons imprimer la chaîne uuid. C'est différent à chaque fois.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer