기본 키 기본값 관리

이 페이지에서는 기본값 표현식을 사용하여 테이블의 기본 키 값을 생성하는 데 사용할 수 있는 전략을 설명합니다. 이러한 전략의 이점은 다음과 같습니다.

  • 부하 집중 방지
  • 다른 데이터베이스에서 마이그레이션 간소화
  • 데이터베이스의 키 로직을 캡슐화하여 애플리케이션에서 관리하기 용이함

DEFAULT 표현식이 있는 열에서 다음 전략을 사용할 수 있습니다.

  • UUID 버전 4 값을 생성하는 UUID 함수
  • bit_reversed_positive 옵션이 있는 스키마 객체 SEQUENCE. SEQUENCE는 GoogleSQL과 PostgreSQL에서 모두 사용할 수 있습니다.

기본 키를 자동으로 생성하는 방법

UUID(범용 고유 식별자)

Spanner는 기본 키로 사용할 UUID 버전 4 문자열을 자동으로 생성할 수 있습니다. UUID는 새 애플리케이션과 행이 많은 테이블에 적합합니다. 키스페이스 전체에 대략적으로 균일하게 분산되어 대규모 부하 집중을 방지합니다. UUID 생성은 많은 수의 값(2122)을 만들 수 있으며, 각 값은 사실상 고유합니다. 예를 들어 충돌 가능성이 50%인 경우 2.71×1018 값이 필요하거나, 86년 동안 초당 10억 개의 값이 필요합니다. 이렇게 하면 대규모 테이블에서 사용할 때 고유한 값이 보장됩니다. UUID는 데이터베이스에서 생성하든 클라이언트에서 생성하든 고유합니다. 가능하면 UUID를 사용하는 것이 좋습니다. 클라이언트에서 생성된 UUID가 RFC 4122에 따라 소문자로 직렬화되는 경우 클라이언트에서 생성된 UUID와 Spanner에서 생성된 UUID를 동일한 테이블에 안전하게 혼합할 수 있습니다.

기본값이 필요한 열의 경우 GENERATE_UUID 함수를 사용하여 기본값을 생성할 수 있습니다. 다음 예시는 FanId 키 열의 값 열에 기본값으로 GENERATE_UUID가 있는 테이블을 만드는 방법을 보여줍니다. 이 예시에서는 UUID가 36자이므로 GoogleSQL STRING 및 PostgreSQL varchar 속성에 36자를 사용합니다. INSERT with THEN RETURN 문을 사용하여 Fans 테이블에 삽입하면 GENERATE_UUIDFanId의 UUID 값을 생성하고 반환합니다.

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

이 문은 다음과 유사한 결과를 반환합니다.

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

GENERATE_UUID() 함수에 관한 자세한 내용은 GoogleSQL 또는 PostgreSQL 참조 페이지를 확인하세요.

비트 반전 시퀀스

비트 반전 시퀀스는 정수 시퀀스를 생성하고 비트 반전하는 스키마 객체입니다. 이 객체는 비공개 내부 Spanner 카운터에서 비트 반전을 사용하여 고유성을 보장합니다. 결과 비트 반전 값을 사용하면 기본 키에 사용될 때 대규모 부하 집중을 방지할 수 있습니다.

Spanner에서는 SEQUENCE DDL 문과 함께 bit_reversed_positive 속성을 사용하여, 비트 반전 양수 값(GoogleSQL 또는 PostgreSQL)을 생성하는 시퀀스를 생성, 변경, 또는 삭제합니다.

각 시퀀스는 내부 카운터 세트를 유지하고 이를 사용하여 값을 생성합니다. 시퀀스 카운터는 비트 반전 알고리즘에 입력을 제공합니다.

GoogleSQL GET-NEXT-SEQUENCE-VALUE 또는 PostgreSQL nextval 함수를 기본값으로 사용하는 DEFAULT 표현식으로 열을 정의하면 Spanner는 자동으로 함수를 호출하고 비트 반전 출력 값을 열에 넣습니다. 비트 반전 시퀀스는 부하 집중을 일으키지 않도록 키 공간에 균일하게 분산되기 때문에 기본 키에 특히 유용합니다.

다음 예시에서는 비트 반전 시퀀스와 키 열이 시퀀스를 기본값으로 사용하는 테이블을 만드는 방법을 보여줍니다.

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

그런 다음 다음 SQL 문을 사용하여 기본 키 값을 삽입하고 반환할 수 있습니다.

GoogleSQL

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

PostgreSQL

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

이 문은 다음과 유사한 결과를 반환합니다.

SingerId
3458764513820540928

UUID 및 시퀀스를 기본 키의 기본값으로 사용하는 시나리오

UUID 및 시퀀스의 시나리오는 다음과 같습니다.

  • 새 애플리케이션
  • 마이그레이션

다음 섹션에서는 각 시나리오를 설명합니다.

새 애플리케이션

기존 애플리케이션이 GoogleSQL에서는 INT64 키, PostgreSQL에서는 bigint 키를 요구하는 경우, Spanner는 비트 반전 양수 시퀀스 스키마 객체 (PostgreSQL 또는GoogleSQL)를 제공합니다. 그렇지 않으면 새 애플리케이션의 경우 범용 고유 식별자(UUID)를 사용하는 것이 좋습니다. 자세한 내용은 범용 고유 식별자(UUID) 사용을 참조하세요.

마이그레이션

테이블을 Spanner로 마이그레이션하는 방법에는 다음과 같은 몇 가지 옵션이 있습니다.

  • 소스 데이터베이스에서 UUID를 사용하는 경우 Spanner에서는 STRING 유형의 키 열과 GENERATE_UUID() 함수(GoogleSQL 또는PostgreSQL)를 기본 값으로 사용할 수 있습니다.
  • 정수 기본 키를 사용 중이고 애플리케이션에 고유한 키만 필요한 경우, INT64에 키 열을 사용하고 기본 키에 대해 기본값으로 비트 반전 포지티브 시퀀스를 사용할 수 있습니다. 비트 반전 키 열 마이그레이션을 참조하세요.
  • Spanner는 단조 값을 생성하는 방법을 지원하지 않습니다.

    PostgreSQL SERIAL 유형 또는 MySQL AUTO_INCREMENT 속성과 같은 단조 키를 사용 중이고 Spanner에서 새 단조 키가 필요한 경우에는 복합 키를 사용할 수 있습니다. 키 순서 변경고유 키를 해싱하고 쓰기를 논리적 샤드에 분산을 참조하세요.

  • 애플리케이션이 GoogleSQL의 INT64 키 또는 PostgreSQL의 bigint 키를 수동으로 비트 반전하는 경우 비트 반전 포지티브 시퀀스(GoogleSQL 또는 PostgreSQL)를 사용하고 새 키 값을 생성하게 할 수 있습니다. 비트 반전 키 열 마이그레이션을 참조하세요.

다음 단계