Cette page présente les stratégies à utiliser pour générer des valeurs de clé primaire dans votre à l'aide d'expressions de valeur par défaut. Ces stratégies présentent les avantages suivants :
- Empêcher le hotspotting
- Simplifier les migrations à partir d'autres bases de données
- Encapsulez la logique de clé dans la base de données pour ne pas avoir à vous soucier sur leur gestion dans votre application
Vous pouvez utiliser les stratégies suivantes dans une colonne contenant des expressions DEFAULT
:
- Fonction UUID qui génère des valeurs d'UUID version 4.
- Objet de schéma,
SEQUENCE
, avec une optionbit_reversed_positive
.SEQUENCE
est disponible à la fois pour GoogleSQL et PostgreSQL.
Méthodes pour générer automatiquement des clés primaires
Identifiant unique universel (UUID)
Spanner peut générer automatiquement une chaîne UUID de version 4 à utiliser comme clé primaire. Les UUID sont adaptés aux nouvelles applications et aux tables comportant de nombreuses lignes. Ils sont répartis de manière à peu près uniforme dans l'espace de clés, ce qui évite les points chauds à grande échelle. UUID génération peut créer un grand nombre de valeurs (2122) et chaque valeur est effectivement unique. Par exemple, vous auriez besoin 2, 71 × 1018 pour une probabilité de collision de 50 % 1 milliard par seconde pendant 86 ans. Cela garantit des valeurs uniques lorsque vous l'utilisez dans les grandes tables. Les UUID sont uniques, que vous les génériez dans la base de données ou dans client. Nous vous recommandons d'utiliser des UUID lorsque cela est possible. Vous pouvez mélanger en toute sécurité les UUID générés par le client et Spanner dans la même table si Les UUID générés par le client sont sérialisés en minuscules, conformément aux RFC 4122.
Pour une colonne qui a besoin de valeurs par défaut, vous pouvez utiliser GENERATE_UUID
pour les générer. L'exemple suivant montre comment créer
Une table dans laquelle la colonne de clé FanId
contient GENERATE_UUID
comme valeur
sa valeur par défaut. L'exemple utilise 36 caractères pour les attributs STRING
Google SQL et varchar
PostgreSQL, car les UUID comportent 36 caractères.
Lorsque vous utilisez l'instruction INSERT with THEN RETURN
pour insérer des données dans la table Fans
, GENERATE_UUID
génère et renvoie une valeur UUID pour FanId
.
GoogleSQL
CREATE TABLE Fans (
FanId STRING(36) DEFAULT (GENERATE_UUID()),
Name STRING(MAX),
) PRIMARY KEY (FanId);
PostgreSQL
CREATE TABLE Fans (
FanId varchar(36) DEFAULT spanner.generate_uuid(),
Name text,
PRIMARY KEY (FanId)
);
GoogleSQL
INSERT INTO Fans (Name) VALUES ('Melissa Garcia')
THEN RETURN FanId;
PostgreSQL
INSERT INTO fans (name) VALUES ('Melissa Garcia')
RETURNING (fanid);
Cette instruction renvoie un résultat semblable à celui-ci :
FanId |
---|
6af91072-f009-4c15-8c42-ebe38ae83751 |
Pour en savoir plus sur la fonction GENERATE_UUID()
, consultez la documentation GoogleSQL
ou PostgreSQL.
Séquence inversée
Une séquence inversée sur les bits est un objet de schéma qui produit une séquence de entiers et les inverse sur les bits. Cet objet utilise l'inversion de bits sur un compteur Spanner interne et privé pour garantir l'unicité. Le résultat valeurs inversées par bit permet d'éviter le hotspotting à grande échelle lorsqu'il est utilisé dans une clé primaire.
Dans Spanner, vous utilisez des instructions DDL SEQUENCE
avec l'attribut bit_reversed_positive
pour créer, modifier ou supprimer une séquence qui produit des valeurs positives inversées (GoogleSQL ou PostgreSQL).
Chaque séquence dispose d'un ensemble de compteurs internes et les utilise pour générer un . Le compteur de séquence fournit l'entrée à l'algorithme d'inversion de bits.
Lorsque vous définissez une colonne avec une expression DEFAULT
qui utilise le langage GoogleSQL
GET-NEXT-SEQUENCE-VALUE
ou
la fonction nextval
PostgreSQL comme valeur par défaut, Spanner
appelle automatiquement la fonction et place les valeurs de sortie inversées sur les bits dans
la colonne. Les séquences inversées sont particulièrement utiles pour les clés primaires, car les valeurs inversées sont réparties uniformément dans l'espace de clés afin qu'elles ne provoquent pas de points chauds.
L'exemple suivant montre comment créer une séquence avec inversion des bits et une table où sa colonne clé utilise la séquence comme valeur par défaut:
GoogleSQL
CREATE SEQUENCE SingerIdSequence OPTIONS (
sequence_kind="bit_reversed_positive"
);
CREATE TABLE Singers (
SingerId INT64 DEFAULT (GET_NEXT_SEQUENCE_VALUE(SEQUENCE SingerIdSequence)),
Name STRING(MAX),
Rank INT64,
) PRIMARY KEY (SingerId);
PostgreSQL
CREATE SEQUENCE SingerIdSequence bit_reversed_positive;
CREATE TABLE Singers (
SingerId bigint DEFAULT nextval('SingerIdSequence'),
Name text,
PRIMARY KEY (SingerId)
);
Vous pouvez ensuite utiliser l'instruction SQL suivante pour insérer et renvoyer la valeur de clé primaire :
GoogleSQL
INSERT INTO Singers (Name) VALUES ('Melissa Garcia')
THEN RETURN SingerId;
PostgreSQL
INSERT INTO Singers (name) VALUES ('Melissa Garcia')
RETURNING (SingerId);
Cette instruction renvoie un résultat semblable à celui-ci:
SingerId |
---|
3458764513820540928 |
Scénarios d'utilisation des UUID et des séquences comme valeurs par défaut pour les clés primaires
Les scénarios pour les UUID et les séquences incluent les suivants :
- Nouvelles applications
- Migrations
Les sections suivantes décrivent chaque scénario.
Nouvelles applications
Si votre application existante nécessite des clés INT64
dans GoogleSQL ou des clés bigint
dans PostgreSQL, Spanner propose l'objet de schéma de séquence positive inversée (PostgreSQL ou GoogleSQL). Sinon, pour les nouvelles applications, nous vous recommandons d'utiliser un identifiant unique universel (UUID). Pour
Pour en savoir plus, consultez Utiliser un identifiant unique universel (UUID).
Migrations
Pour migrer des tables vers Spanner, vous disposez de plusieurs options :
- Si vous utilisez des UUID dans votre base de données source, sur Spanner, vous pouvez utiliser une colonne de clé de type
STRING
et la fonctionGENERATE_UUID()
(GoogleSQL ou PostgreSQL) comme valeur par défaut. - Si vous utilisez une clé primaire sous forme de nombre entier et que votre application n'a besoin que du
pour qu'elle soit unique, vous pouvez utiliser une colonne de clé dans
INT64
et utiliser un bit inversé une séquence positive pour la valeur par défaut de la clé primaire. Consultez la page Migrer des colonnes de clé inversées sur bits. Spanner ne permet pas de générer des valeurs monotones.
Si vous utilisez une clé monotone, telle que le type
SERIAL
PostgreSQL ou l'attributAUTO_INCREMENT
MySQL, et que vous avez besoin de nouvelles clés monotones sur Spanner, vous pouvez utiliser une clé composite. Consultez Permuter l'ordre des clés et Hacher la clé unique et répartir les écritures sur des segments logiques.Si votre application inverse manuellement votre clé
INT64
dans GoogleSQL ou votre clébigint
dans PostgreSQL, vous pouvez utiliser une séquence positive inversée (GoogleSQL ou PostgreSQL) et lui demander de générer de nouvelles valeurs de clé. Consultez la page Migrer des colonnes de clé inversées sur bits.
Étape suivante
- En savoir plus sur l'utilisation des séquences avec un contrôle précis des accès
- Découvrez les instructions LDD
SEQUENCE
pour GoogleSQL ou PostgreSQL. - Découvrez les fonctions de séquence dans GoogleSQL ou PostgreSQL.
- Découvrez les séquences dans INFORMATION_SCHEMA dans GoogleSQL ou PostgreSQL.
- Découvrez les options de séquence dans INFORMATION_SCHEMA pour GoogleSQL.