Administración de valores predeterminados de la clave primaria

En esta página, se analizan las estrategias que puedes usar para generar valores de clave primaria en tu tabla con expresiones de valor predeterminadas. Estas estrategias tienen los siguientes beneficios:

  • Cómo evitar la generación de hotspots
  • Simplifica las migraciones desde otras bases de datos
  • Encapsula la lógica de clave en la base de datos para que no tengas que preocuparte por administrarla en tu aplicación.

Puedes usar las siguientes estrategias en una columna que tenga expresiones DEFAULT:

  • Una función de UUID que genera valores de UUID de la versión 4
  • Un objeto de esquema, SEQUENCE, que tiene una opción bit_reversed_positive. SEQUENCE está disponible para GoogleSQL y PostgreSQL.

Métodos para generar claves primarias automáticamente

Identificador único universal (UUID)

Spanner puede generar de forma automática una string de versión 4 de UUID para usarla como clave primaria. Los UUID funcionan bien para aplicaciones y tablas nuevas con muchas filas. Se distribuyen de manera casi uniforme en el espacio de claves, lo que evita la generación de hotspots a gran escala. La generación de UUID puede crear una gran cantidad de valores (2122) y cada valor es efectivamente único. Por ejemplo, necesitarías valores de 2.71 × 1018 para una probabilidad del 50% de colisión o 1, 000 millones por segundo durante 86 años. Esto garantiza valores únicos cuando los uses en tablas grandes. Los UUID son únicos, ya sea que los generes en la base de datos o en el cliente. Te recomendamos que uses UUIDs siempre que sea posible. Puedes combinar de forma segura los UUIDs generados por el cliente y los que genera Spanner en la misma tabla si estos se serializan en minúsculas, de acuerdo con la RFC 4122.

Para una columna que necesita valores predeterminados, puedes usar la función GENERATE_UUID a fin de generarlos. En el siguiente ejemplo, se muestra cómo crear una tabla en la que la columna de clave FanId tiene GENERATE_UUID en la columna de valores como su valor predeterminado. En el ejemplo, se usan 36 caracteres para los atributos STRING de GoogleSQL y varchar de PostgreSQL porque los UUID tienen 36 caracteres. Cuando usas la declaración INSERT with THEN RETURN para insertarla en la tabla Fans, GENERATE_UUID genera y muestra un valor de 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);

Esta sentencia muestra un resultado similar al siguiente:

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

Para obtener más información sobre la función GENERATE_UUID(), consulta la página de referencia de GoogleSQL o PostgreSQL.

Secuencia invertida de bits

Una secuencia invertida de bits es un objeto de esquema que produce una secuencia de números enteros y los revierte los bits. Este objeto usa la reversión de bits en un contador de Spanner interno privado para garantizar la exclusividad. Los valores invertidos de bits resultantes ayudan a evitar la generación de hotspots a gran escala cuando se usa en una clave primaria.

En Spanner, debes usar declaraciones DDL SEQUENCE junto con el atributo bit_reversed_positive para crear, modificar o descartar una secuencia que produzca valores positivos con inversión de bits (GoogleSQL o PostgreSQL).

Cada secuencia mantiene un conjunto de contadores internos y los usa para generar un valor. El contador de secuencias proporciona la entrada al algoritmo de inversión de bits.

Cuando defines una columna con una expresión DEFAULT que usa la función GET-NEXT-SEQUENCE-VALUE de GoogleSQL o nextval de PostgreSQL como su valor predeterminado, Spanner llama de forma automática a la función y coloca los valores de resultado invertidos en la columna. Las secuencias invertidas de bits son especialmente útiles para las claves primarias, ya que los valores invertidos de bits se distribuyen de manera uniforme en el espacio de claves para que no causen hotspots.

En el siguiente ejemplo, se muestra cómo crear una secuencia invertida de bits y una tabla en la que su columna de clave usa la secuencia como valor predeterminado:

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

Luego puedes usar la siguiente instrucción de SQL para insertar y mostrar el valor de la clave primaria:

GoogleSQL

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

PostgreSQL

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

Esta sentencia muestra un resultado similar al siguiente:

SingerId
3458764513820540928

Situaciones en las que se usan UUIDs y secuencias como valores predeterminados para claves primarias

Las situaciones de UUIDs y secuencias incluyen lo siguiente:

  • Aplicaciones nuevas
  • Migraciones

En las siguientes secciones, se describe cada situación.

Aplicaciones nuevas

Si tu aplicación existente requiere claves INT64 en GoogleSQL o claves bigint en PostgreSQL, Spanner ofrece el objeto de esquema de secuencia positiva inversa de los bits (PostgreSQL o GoogleSQL). De lo contrario, para las aplicaciones nuevas, te recomendamos que uses un identificador único universal (UUID). Para obtener más información, consulta Usa un identificador único universal (UUID).

Migraciones

Para la migración de tablas a Spanner, tienes las siguientes opciones:

¿Qué sigue?