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
, conbit_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 hotspot su larga scala quando utilizzato in una chiave primaria.
In Spanner, utilizzi istruzioni DDL SEQUENCE
insieme al
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:
- Se usi gli UUID nel database di origine, su Spanner,
puoi usare una colonna chiave nel tipo
STRING
eGENERATE_UUID()
(GoogleSQL o PostgreSQL) come valore predefinito. - Se utilizzi una chiave primaria con numeri interi e l'applicazione ha bisogno solo del
chiave sia univoca, puoi usare una colonna chiave in
INT64
e utilizzare una sequenza positiva per il valore predefinito della chiave primaria. Consulta Migrazione delle colonne delle chiavi con invertito del bit. Spanner non supporta un modo per generare valori monotonici.
Se utilizzi una chiave monotonica, ad esempio il tipo PostgreSQL
SERIAL
, oppure dell'attributoAUTO_INCREMENT
MySQL e hai bisogno di nuove chiavi monotoiche su Spanner, puoi utilizzare una chiave composita. Consulta Scambia l'ordine delle chiavi e esegui l'hashing della chiave univoca e distribuisci le scritture tra gli shard logici.Se la tua applicazione esegue manualmente l'inversione bit della chiave
INT64
in GoogleSQL obigint
in PostgreSQL, puoi utilizzare una sequenza positiva invertita di più (GoogleSQL o PostgreSQL) e che generi nuove coppie chiave-valore te. Consulta Migrazione delle colonne delle chiavi con invertito del bit.
Passaggi successivi
- Scopri di più sull'utilizzo delle sequenze con un controllo dell'accesso granulare.
- Scopri di più sulle istruzioni DDL
SEQUENCE
per GoogleSQL o PostgreSQL. - Scopri di più sulle funzioni di sequenza in GoogleSQL o PostgreSQL.
- Scopri di più sulle sequenze in INFORMATION_SCHEMA in GoogleSQL oppure PostgreSQL.
- Scopri di più sulle opzioni di sequenza in INFORMATION_SCHEMA per GoogleSQL.