Gestion des valeurs par défaut des clés primaires

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 sont les suivantes : avantages:

  • 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 comportant des expressions DEFAULT:

  • Fonction UUID qui génère des valeurs d'UUID version 4.
  • Un objet de schéma, SEQUENCE, ayant un bit_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 d'UUID version 4 à utiliser comme clé primaire. Les UUID fonctionnent bien pour les nouvelles applications et tables avec plusieurs lignes. Ils sont à peu près uniformément répartis dans l'espace clé, empêche le hotspotting à 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 GoogleSQL Attributs varchar STRING et PostgreSQL, car les UUID comportent 36 caractères. Lorsque vous utilisez l'instruction INSERT with THEN RETURN pour insérer des données Fans, GENERATE_UUID génère et renvoie une valeur d'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 sur les bits

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 des bits sur une couche Cloud Spanner interne 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 LDD SEQUENCE avec les bit_reversed_positive pour créer, modifier ou insérer une séquence produisant des valeurs positives inversées sur les bits (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 sur les bits sont particulièrement utiles pour les touches primaires, car les valeurs inversées sur les bits sont réparties uniformément sur la clé afin d'éviter le hotspotting.

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 l'instruction principale clé-valeur:

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

Voici les scénarios pour les UUID et les séquences:

  • 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 bigint dans PostgreSQL, Spanner offre le modèle d'écriture positive (PostgreSQL ou GoogleSQL). Sinon, pour les nouvelles applications, nous vous recommandons d'utiliser Identifiant unique universel (UUID). Pour Pour en savoir plus, consultez Utiliser un identifiant unique universel (UUID).

Migrations

Pour migrer des tables vers Spanner, plusieurs options s'offrent à vous:

  • 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 GENERATE_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'attribut MySQL AUTO_INCREMENT et vous avez besoin de nouvelles clés monotones sur Spanner, vous pouvez utiliser une clé composite. Voir Intervertissez l'ordre des clés et hachez la clé unique et répartissez les écritures sur des segments logiques.

  • Si votre application inverse manuellement les bits de votre clé INT64 dans GoogleSQL ou bigint dans PostgreSQL, vous pouvez utiliser une séquence positive inversée sur les bits (GoogleSQL ou PostgreSQL) et qu'il génère de nouvelles valeurs de clé pour vous. Consultez la page Migrer des colonnes de clé inversées sur bits.

Étape suivante