Gerenciamento de valores de chave padrão primária

Esta página discute as estratégias a serem usadas para gerar valores de chave primária em seu usando expressões de valor padrão. Essas estratégias têm os seguintes benefícios:

  • Evitar o uso excessivo do ponto de acesso
  • Simplifique migrações de outros bancos de dados
  • Encapsule a lógica da chave no banco de dados para que você não precise se preocupar sobre gerenciá-los no seu aplicativo

É possível usar as seguintes estratégias em uma coluna que tenha expressões DEFAULT:

  • Uma função UUID que gera valores de UUID versão 4.
  • Um objeto de esquema, SEQUENCE, que tem um bit_reversed_positive é a melhor opção. SEQUENCE está disponível para GoogleSQL e PostgreSQL.

Métodos para gerar chaves primárias automaticamente

Identificador universalmente exclusivo (UUID)

O Spanner pode gerar automaticamente uma string UUID versão 4 para usar como chave primária. UUIDs funcionam bem para novos aplicativos e tabelas com muitas linhas. Eles são distribuídos de maneira quase uniforme no espaço da chave, evita o uso excessivo do ponto de acesso em grande escala. UUID geração pode criar um grande número de valores (2122) e cada valor é efetivamente único. Por exemplo, você precisaria valores de 2, 71×1018 para 50% de probabilidade de colisão ou 1 bilhão por segundo durante 86 anos. Isso garante valores exclusivos quando usado em em tabelas grandes. Os UUIDs são únicos, não importa se você os gera no banco de dados ou no para o cliente. Recomendamos que você use UUIDs quando possível. Você pode misturar com segurança UUIDs gerados pelo cliente e pelo Spanner na mesma tabela se o UUIDs gerados pelo cliente são serializados como minúsculas, de acordo com RFC 4122;

Para uma coluna que precisa de valores padrão, use GENERATE_UUID. função para gerá-los. O exemplo a seguir mostra como criar uma tabela em que a coluna de chave FanId tem GENERATE_UUID no valor coluna como valor padrão. O exemplo usa 36 caracteres para o namespace os atributos STRING e varchar do PostgreSQL porque os UUIDs têm 36 caracteres. Quando você usa a instrução INSERT with THEN RETURN para inserir no Fans, GENERATE_UUID gera e retorna um valor UUID para 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);

Essa instrução retorna um resultado semelhante ao seguinte:

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

Para mais informações sobre a função GENERATE_UUID(), consulte a documentação do GoogleSQL ou PostgreSQL.

Sequência de bit invertido

Uma sequência invertida de bits é um objeto de esquema que produz uma sequência de números inteiros e a reversão em bits. Este objeto usa a reversão de bits em um objeto privado, contador interno do Spanner para garantir exclusividade. O resultado valores revertidos em bits ajuda a evitar uso excessivo do ponto de acesso em grande escala quando usada em uma chave primária.

No Spanner, você usa instruções DDL SEQUENCE junto com as bit_reversed_positive para criar, alterar ou descartar um que produz valores positivos com reversão de bits (GoogleSQL ou PostgreSQL).

Cada sequência mantém um conjunto de contadores internos e os usa para gerar uma . O contador de sequência fornece a entrada para o algoritmo de reversão de bits.

Quando você define uma coluna com uma expressão DEFAULT que usa a API GoogleSQL GET-NEXT-SEQUENCE-VALUE ou a Função nextval do PostgreSQL como valor padrão, Spanner chama automaticamente a função e coloca os valores de saída invertidos em bits em da coluna. As sequências invertidas de bits são especialmente úteis para chaves primárias, porque os valores invertidos em bits são distribuídos de maneira uniforme para evitar o uso excessivo do ponto de acesso.

O exemplo a seguir mostra como criar uma sequência invertida e uma tabela em que a coluna de chave usa a sequência como o valor padrão:

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

É possível usar a seguinte instrução SQL para inserir e retornar a instância primária chave-valor:

GoogleSQL

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

PostgreSQL

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

Essa instrução retorna um resultado semelhante ao seguinte:

SingerId
3458764513820540928

Cenários para usar UUIDs e sequências como valores padrão para chaves primárias

Os cenários para UUIDs e sequências incluem os seguintes:

  • Novos aplicativos
  • Migrações

As seções a seguir descrevem cada cenário.

Novos aplicativos

Se o aplicativo exigir chaves INT64 no GoogleSQL ou bigint no PostgreSQL, o Spanner oferece a função positiva objeto de esquema sequencial (PostgreSQL ou GoogleSQL). Caso contrário, para novos aplicativos, recomendamos o uso de Identificador universalmente exclusivo (UUID). Para Para mais informações, consulte Usar um identificador universal exclusivo (UUID).

Migrações

Para migrações de tabelas para o Spanner, você tem algumas opções:

A seguir