Pengelolaan nilai default kunci utama

Halaman ini membahas strategi yang akan digunakan untuk menghasilkan nilai kunci utama di tabel menggunakan ekspresi nilai default. Informasi di halaman ini berlaku untuk database dialek GoogleSQL dan database dialek PostgreSQL. Strategi ini memiliki manfaat sebagai berikut:

  • Mencegah hotspot
  • Menyederhanakan migrasi dari database lain
  • Enkapsulasi logika kunci di database sehingga Anda tidak perlu khawatir mengelolanya di aplikasi
  • Pada umumnya, menggantikan kebutuhan untuk membuat dan mengelola urutan Anda sendiri

Metode untuk membuat kunci utama secara otomatis

Untuk membuat nilai kunci utama secara otomatis, Anda dapat menggunakan strategi berikut di kolom yang memiliki ekspresi DEFAULT:

  • Fungsi UUID yang menghasilkan nilai UUID Versi 4.
  • Objek skema, SEQUENCE, yang memiliki opsi bit_reversed_positive. SEQUENCE tersedia untuk GoogleSQL dan PostgreSQL.

Metode untuk membuat kunci utama secara otomatis

Bagian ini menjelaskan cara membuat UUID dan urutan yang dibalik bit secara otomatis untuk digunakan sebagai nilai kunci utama.

ID Unik Universal (UUID)

Spanner dapat otomatis membuat string UUID Versi 4 untuk digunakan sebagai kunci utama. UUID berfungsi dengan baik untuk aplikasi dan tabel baru dengan banyak baris. Kunci tersebut didistribusikan secara merata di seluruh ruang kunci yang mencegah hotspot dalam skala besar. Pembuatan UUID dapat menghasilkan sejumlah besar nilai (2122) dan setiap nilai secara efektif unik. Misalnya, Anda akan memerlukan nilai 2,71×1018 untuk probabilitas tabrakan 50%, atau 1 miliar per detik selama 86 tahun. Hal ini memastikan nilai unik saat Anda menggunakannya dalam tabel besar. UUID bersifat unik, baik Anda membuatnya di database maupun di klien. Sebaiknya gunakan UUID jika memungkinkan. Anda dapat dengan aman menggabungkan UUID yang dibuat klien dan Spanner dalam tabel yang sama jika UUID yang dibuat klien diserialisasi sebagai huruf kecil, sesuai dengan RFC 4122.

Untuk kolom yang memerlukan nilai default, Anda dapat menggunakan fungsi GENERATE_UUID untuk membuatnya. Contoh berikut menunjukkan cara membuat tabel dengan kolom kunci FanId memiliki GENERATE_UUID di kolom nilai sebagai nilai defaultnya. Contoh ini menggunakan 36 karakter untuk atribut GoogleSQL STRING dan PostgreSQL varchar karena UUID memiliki 36 karakter. Saat Anda menggunakan pernyataan INSERT with THEN RETURN untuk menyisipkan ke dalam tabel Fans, GENERATE_UUID akan menghasilkan dan menampilkan nilai UUID untuk 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);

Pernyataan ini menampilkan hasil yang mirip dengan berikut ini:

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

Untuk informasi selengkapnya tentang fungsi GENERATE_UUID(), lihat halaman referensi GoogleSQL atau PostgreSQL.

IDENTITY kolom

Dengan kolom IDENTITY, Anda dapat otomatis membuat nilai bilangan bulat untuk kolom kunci dan non-kunci. Kolom IDENTITY tidak mengharuskan pengguna untuk mempertahankan urutan yang mendasarinya secara manual, atau mengelola hubungan antara kolom dan urutan yang mendasarinya. Saat kolom identitas yang dibuat otomatis dihapus, urutan yang mendasarinya juga akan otomatis dihapus.

Anda dapat menggunakan kolom IDENTITY dengan memberikan nilai bilangan bulat awal saat membuat urutan, atau membiarkan Spanner membuat urutan bilangan bulat untuk Anda. Untuk memberikan nilai bilangan bulat awal, Anda harus menggunakan opsi START COUNTER WITH dan menggunakan nilai awal INT64 positif. Spanner menggunakan nilai ini untuk menetapkan nilai berikutnya untuk penghitung urutan internal yang dihasilkan secara otomatis dan membalikkan bit nilai sebelum menyisipkannya ke dalam kolom ini.

Di Spanner, kolom IDENTITY didukung di GoogleSQL dan PostgreSQL.

GoogleSQL

Contoh berikut menunjukkan cara menggunakan kolom IDENTITY untuk membuat kolom kunci utama bilangan bulat yang dibuat otomatis untuk SingerId saat membuat tabel baru menggunakan perintah CREATE TABLE:

CREATE TABLE Singers (
  SingerId INT64 GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
  Name STRING(MAX),
  Rank INT64
) PRIMARY KEY (SingerId);

Anda juga dapat menentukan awal penghitung untuk kolom menggunakan opsi START_WITH_COUNTER. Dalam contoh berikut, kolom bilangan bulat yang dibuat secara otomatis dibuat untuk SingerId yang memiliki nilai positif yang dibalik bit-nya dan penghitung internal yang dimulai dari 1.000.

CREATE TABLE Singers (
  SingerId INT64 GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE START COUNTER WITH 1000),
  Name STRING(MAX),
  Rank INT64
) PRIMARY KEY (SingerId);

PostgreSQL

Contoh berikut menunjukkan cara menggunakan kolom IDENTITY untuk membuat kolom bilangan bulat yang dibuat otomatis untuk SingerId saat membuat tabel baru menggunakan perintah CREATE TABLE:

CREATE TABLE Singers (
  SingerId bigint GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
  Name text,
  PRIMARY KEY (SingerId)
);

Anda juga dapat menentukan awal penghitung untuk kolom menggunakan opsi START COUNTER WITH. Dalam contoh berikut, kolom bilangan bulat yang dibuat secara otomatis dibuat untuk SingerId yang menghasilkan nilai positif yang dibalik bit-nya dan penghitung internal, sebelum pembalikkan bit, dimulai dari 1.000.

CREATE TABLE Singers (
  SingerId bigint GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE START COUNTER WITH 1000),
  Name text,
  PRIMARY KEY (SingerId)
);

SERIAL dan AUTO_INCREMENT

Spanner mendukung SERIAL di PostgreSQL dan AUTO_INCREMENT di GoogleSQL yang merupakan alias DDL untuk kolom IDENTITY dan digunakan untuk membuat kolom bilangan bulat unik. Anda harus menetapkan opsi database default_sequence_kind terlebih dahulu sebelum menggunakan SERIAL atau AUTO_INCREMENT. Anda dapat menggunakan pernyataan SQL berikut untuk menetapkan opsi default_squence_kind database:

GoogleSQL

ALTER DATABASE db SET OPTIONS (default_sequence_kind = 'bit_reversed_positive');

CREATE TABLE Singers (
  id INT64 AUTO_INCREMENT PRIMARY KEY,
  name STRING(MAX),
)

PostgreSQL

ALTER DATABASE db SET spanner.default_sequence_kind = 'bit_reversed_positive';

CREATE TABLE Singers (
  id serial PRIMARY KEY,
  name text
);

Perhatikan bahwa karena SERIAL dan AUTO_INCREMENT dipetakan ke kolom IDENTITY, Anda tidak akan melihatnya saat melakukan serialisasi skema. Untuk skema ini, output GetDatabaseDDL adalah:

GoogleSQL

ALTER DATABASE db SET OPTIONS (default_sequence_kind = 'bit_reversed_positive');

CREATE TABLE Singers (
  id INT64 GENERATED BY DEFAULT AS IDENTITY,
  name STRING(MAX),
) PRIMARY KEY (id);

PostgreSQL

ALTER DATABASE db SET spanner.default_sequence_kind = 'bit_reversed_positive';

CREATE TABLE Singers (
  id bigint GENERATED BY DEFAULT AS IDENTITY NOT NULL,
  name character varying,
  PRIMARY KEY(id)
);

Urutan bit-reverse

Urutan bit terbalik adalah objek skema yang menghasilkan urutan bilangan bulat dan membalikkannya. Objek ini menggunakan inversi bit pada penghitung Spanner internal pribadi untuk memastikan keunikan. Nilai yang dibalik bit yang dihasilkan membantu menghindari hotspot dalam skala besar saat digunakan dalam kunci utama.

Di Spanner, Anda menggunakan pernyataan DDL SEQUENCE bersama dengan atribut bit_reversed_positive untuk membuat, mengubah, atau menghapus urutan yang menghasilkan nilai positif yang dibalik bit (GoogleSQL atau PostgreSQL).

Setiap urutan mempertahankan kumpulan penghitung internal dan menggunakannya untuk menghasilkan nilai. Penghitung urutan memberikan input ke algoritma pembalikan bit.

Saat Anda menentukan kolom dengan ekspresi DEFAULT yang menggunakan fungsi GET-NEXT-SEQUENCE-VALUE GoogleSQL atau fungsi nextval PostgreSQL sebagai nilai defaultnya, Spanner akan otomatis memanggil fungsi tersebut dan memasukkan nilai output yang dibalik bit ke dalam kolom. Urutan bit-reversed sangat berguna untuk kunci utama, karena nilai bit-reversed didistribusikan secara merata di seluruh ruang kunci sehingga tidak menyebabkan hotspot.

Contoh berikut menunjukkan cara membuat urutan bit-reversed dan tabel dengan kolom kuncinya menggunakan urutan sebagai nilai default:

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

Kemudian, Anda dapat menggunakan pernyataan SQL berikut untuk menyisipkan dan menampilkan nilai kunci utama:

GoogleSQL

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

PostgreSQL

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

Pernyataan ini menampilkan hasil yang mirip dengan berikut ini:

SingerId
3458764513820540928

Skenario untuk menggunakan UUID dan urutan sebagai nilai default untuk kunci utama

Skenario untuk UUID dan urutan mencakup hal berikut:

  • Aplikasi baru
  • Migrasi

Bagian berikut menjelaskan setiap skenario.

Aplikasi baru

Jika aplikasi yang ada memerlukan kunci INT64 di GoogleSQL, atau kunci bigint di PostgreSQL, Spanner menawarkan objek skema urutan positif yang dibalik bit (PostgreSQL atau GoogleSQL). Jika tidak, untuk aplikasi baru, sebaiknya Anda menggunakan ID Unik Universal (UUID). Untuk mengetahui informasi selengkapnya, lihat Menggunakan ID Unik Universal (UUID).

Migrasi

Untuk migrasi tabel ke Spanner, Anda memiliki beberapa opsi:

  • Jika menggunakan UUID di database sumber, di Spanner, Anda dapat menggunakan kolom kunci dalam jenis STRING dan fungsi GENERATE_UUID() (GoogleSQL atau PostgreSQL) sebagai nilai defaultnya.
  • Jika menggunakan kunci utama bilangan bulat, dan aplikasi Anda hanya memerlukan kunci yang unik, Anda dapat menggunakan kolom kunci di INT64 dan menggunakan urutan positif yang dibalik bit untuk nilai default kunci utama. Lihat Memigrasikan kolom kunci yang dibalik bit.
  • Spanner tidak mendukung cara untuk menghasilkan nilai monoton.

    Jika Anda menggunakan kunci monoton, seperti jenis SERIAL PostgreSQL, atau atribut AUTO_INCREMENT MySQL, dan Anda memerlukan kunci monoton baru di Spanner, Anda dapat menggunakan kunci komposit. Untuk mengetahui informasi selengkapnya, lihat Menukar urutan kunci dan Meng-hash kunci unik dan menyebarkan operasi tulis di seluruh shard logis.

  • Jika aplikasi Anda secara manual membalikkan bit kunci INT64 di kunci GoogleSQL atau bigint di PostgreSQL, Anda dapat menggunakan urutan positif yang dibalik bitnya (GoogleSQL atau PostgreSQL) dan membuatnya menghasilkan nilai kunci baru untuk Anda. Untuk mengetahui informasi selengkapnya, lihat Memigrasikan kolom kunci yang dibalik bit.

Langkah selanjutnya