Gestione dei valori predefiniti della chiave primaria

Questa pagina illustra le strategie da utilizzare per generare valori chiave primaria nella tabella utilizzando le espressioni di valori predefiniti. Queste strategie presentano i seguenti vantaggi:

  • Impedisci l'hotspotting
  • Semplifica le migrazioni da altri database
  • Incapsulare la logica chiave nel database in modo da non doverti preoccupare di gestirla nella tua applicazione

Puoi utilizzare le strategie seguenti in una colonna che contiene DEFAULT espressioni:

  • Una funzione UUID che genera valori UUID versione 4.
  • Un oggetto schema, SEQUENCE, con un'opzione bit_reversed_positive. SEQUENCE è disponibile sia per GoogleSQL che per PostgreSQL.

Metodi per generare automaticamente le chiavi primarie

UUID (Universally Unique Identifier)

Spanner può generare automaticamente una stringa UUID 4 da usare come chiave primaria. Gli UUID funzionano bene per nuove applicazioni e tabelle con molte righe. Sono distribuiti in modo più uniforme nello spazio chiave, evitando l'hotspot su larga scala. La generazione di UUID può creare un numero elevato di valori (2122) e ogni valore è effettivamente univoco. Ad esempio, sarebbero necessari 2, 71 × 1018 valori per una probabilità di collisione del 50% o 1 miliardo al secondo per 86 anni. In questo modo vengono garantiti valori univoci quando lo utilizzi in tabelle di grandi dimensioni. Gli UUID sono univoci indipendentemente dal fatto che vengano generati nel database o nel client. Ti consigliamo di utilizzare gli UUID, se possibile. Puoi combinare in modo sicuro gli UUID generati dal client e da Spanner nella stessa tabella se questi ultimi sono serializzati in lettere minuscole, in conformità allo standard RFC 4122.

Per una colonna che richiede valori predefiniti, puoi utilizzare la funzione GENERATE_UUID per generarli. L'esempio seguente mostra come creare una tabella in cui la colonna chiave FanId ha GENERATE_UUID nella colonna dei valori come valore predefinito. L'esempio utilizza 36 caratteri per gli attributi GoogleSQL STRING e PostgreSQL varchar perché gli UUID hanno 36 caratteri. Quando utilizzi l'istruzione INSERT with THEN RETURN per l'inserimento nella tabella Fans, GENERATE_UUID genera e restituisce un valore UUID per 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);

L'istruzione restituisce un risultato simile al seguente:

FanId
6af91072-f009-4c15-8c42-ebe38ae83751

Per saperne di più sulla funzione GENERATE_UUID(), consulta la pagina di riferimento di GoogleSQL o PostgreSQL.

Sequenza invertita con i bit

Una sequenza invertita a bit è un oggetto di schema che produce una sequenza di numeri interi e li inverte a bit. Questo oggetto utilizza l'inversione di bit su un contatore Spanner interno privato per garantire l'univocità. I valori invertiti a bit risultanti aiutano a evitare l'hotspot su larga scala quando vengono utilizzati in una chiave primaria.

In Spanner, utilizzi le istruzioni DDL SEQUENCE insieme all'attributo bit_reversed_positive per creare, modificare o eliminare una sequenza che produce valori positivi invertiti di bit (GoogleSQL o PostgreSQL).

Ogni sequenza mantiene un insieme di contatori interni e li utilizza per generare un valore. Il contatore di sequenze fornisce l'input all'algoritmo di inversione di bit.

Quando definisci una colonna con un'espressione DEFAULT che utilizza la funzione GoogleSQL GET-NEXT-SEQUENCE-VALUE o PostgreSQL nextval come valore predefinito, Spanner chiama automaticamente la funzione e inserisce i valori di output invertiti a bit nella colonna. Le sequenze invertite con i bit sono particolarmente utili per le chiavi primarie, perché i valori invertiti a bit vengono distribuiti uniformemente nello spazio delle chiavi in modo da non causare hotspot.

L'esempio seguente mostra come creare una sequenza invertita di bit e una tabella in cui la relativa colonna chiave utilizza la sequenza come valore predefinito:

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)
);

Puoi quindi utilizzare la seguente istruzione SQL per inserire e restituire il valore della chiave primaria:

GoogleSQL

INSERT INTO Singers (Name) VALUES ('Melissa Garcia')
THEN RETURN SingerId;

PostgreSQL

INSERT INTO Singers (name) VALUES ('Melissa Garcia')
RETURNING (SingerId);

L'istruzione restituisce un risultato simile al seguente:

SingerId
3458764513820540928

Scenari di utilizzo di UUID e sequenze come valori predefiniti per le chiavi primarie

Gli scenari per gli UUID e le sequenze includono i seguenti:

  • Nuove applicazioni
  • Migrazioni

Le sezioni seguenti descrivono ogni scenario.

Nuove applicazioni

Se la tua applicazione esistente richiede chiavi INT64 in GoogleSQL o bigint chiavi in PostgreSQL, Spanner offre l'oggetto schema sequenza positiva invertita (PostgreSQL o GoogleSQL). In caso contrario, per le nuove applicazioni, ti consigliamo di utilizzare l'Universally Unique Identifier (UUID). Per maggiori informazioni, consulta Utilizzare un UUID (Universally Unique Identifier).

Migrazioni

Per le migrazioni delle tabelle a Spanner, hai alcune opzioni:

Passaggi successivi