Gestione dei valori predefiniti della chiave primaria

Questa pagina illustra le strategie da utilizzare per generare le coppie chiave-valore primarie utilizzando le espressioni di valore predefinite. Queste strategie presentano le seguenti caratteristiche: vantaggi:

  • Impedisci l'hotspotting
  • Semplifica le migrazioni da altri database
  • Incapsulare la logica chiave nel database in modo da non doverti preoccupare 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 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 versione 4 da utilizzare come chiave primaria. Gli UUID funzionano bene per nuove applicazioni e tabelle con molte righe. Sono distribuiti più o meno uniformemente nello spazio chiave che previene l'hotspotting su larga scala. UUID può creare un numero elevato di valori (2122) e ogni valore è effettivamente unico. Ad esempio, avresti bisogno 2, 71 × 1018 valori per una probabilità di collisione del 50% oppure 1 miliardo al secondo per 86 anni. Ciò garantisce valori univoci quando lo utilizzi e tabelle di grandi dimensioni. Gli UUID sono univoci indipendentemente dal fatto che vengano generati nel database o di alto profilo. Ti consigliamo di utilizzare gli UUID, se possibile. Puoi combinare in tutta sicurezza generati dal client e da Spanner nella stessa tabella se generati dal client vengono serializzati in lettere minuscole, in conformità con RFC 4122.

Per una colonna che richiede valori predefiniti, puoi utilizzare GENERATE_UUID per generarle. L'esempio seguente mostra come creare una tabella in cui il valore della colonna chiave FanId è GENERATE_UUID come valore predefinito. L'esempio utilizza 36 caratteri per la query Attributi STRING e PostgreSQL varchar perché gli UUID hanno 36 caratteri. Quando utilizzi l'istruzione INSERT with THEN RETURN per inserire nell'elemento 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 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 ambiente interno Spanner per garantire l'univocità. Il risultato valori invertiti a bit aiuta a evitare l'hotspoting su larga scala quando utilizzato in una chiave primaria.

In Spanner, utilizzi istruzioni DDL SEQUENCE insieme alla Attributo bit_reversed_positive per creare, modificare o rilasciare un che produce valori positivi invertiti a 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 il parametro GoogleSQL GET-NEXT-SEQUENCE-VALUE o Funzione 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 tra la chiave in modo che non causino hotspot.

L'esempio seguente mostra come creare una sequenza invertita di bit e una tabella dove la sua 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 valore-chiave:

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 in PostgreSQL, Spanner offre il valore positivo (PostgreSQL o GoogleSQL). Altrimenti, per i nuovi applicazioni, ti consigliamo di utilizzare UUID (Universally Unique Identifier). Per Per ulteriori informazioni, consulta l'articolo Utilizzare un UUID (Universally Unique Identifier).

Migrazioni

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

Passaggi successivi