Halaman ini membahas strategi yang dapat digunakan untuk membuat nilai kunci utama dalam tabel Anda menggunakan ekspresi nilai default. Strategi-strategi ini memiliki manfaat berikut:
- Mencegah hotspotting
- Menyederhanakan migrasi dari database lain
- Mengenkapsulasi logika kunci dalam database sehingga Anda tidak perlu khawatir mengelolanya dalam aplikasi
Anda dapat menggunakan strategi berikut di kolom yang memiliki DEFAULT
ekspresi:
- Fungsi UUID yang menghasilkan nilai UUID Versi 4.
- Objek skema,
SEQUENCE
, yang memiliki opsibit_reversed_positive
.SEQUENCE
tersedia untuk GoogleSQL dan PostgreSQL.
Metode untuk membuat kunci utama secara otomatis
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. Tabel sementara kurang lebih didistribusikan secara seragam di seluruh ruang kunci, sehingga mencegah hotspotting dalam skala besar. Pembuatan UUID dapat membuat nilai dalam jumlah besar (2122) dan setiap nilai pada dasarnya unik. Misalnya, Anda memerlukan nilai 2,71×1018 untuk 50% kemungkinan tabrakan, 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 klien. Sebaiknya gunakan UUID jika memungkinkan. Anda dapat dengan aman menggabungkan UUID yang dibuat klien dan Spanner di 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 menghasilkannya. Contoh berikut menunjukkan cara membuat
tabel dengan kolom kunci FanId
memiliki GENERATE_UUID
dalam kolom
nilai sebagai nilai defaultnya. Contoh ini menggunakan 36 karakter untuk atribut STRING
GoogleSQL dan varchar
PostgreSQL karena UUID memiliki 36 karakter.
Saat Anda menggunakan pernyataan INSERT with THEN RETURN
untuk disisipkan ke
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 mengembalikan hasil yang mirip dengan yang berikut ini:
FanId |
---|
6af91072-f009-4c15-8c42-ebe38ae83751 |
Untuk mengetahui informasi selengkapnya tentang fungsi GENERATE_UUID()
, lihat halaman referensi GoogleSQL
atau PostgreSQL.
Urutan bit-reversed
Urutan terbalik bit adalah objek skema yang menghasilkan urutan bilangan bulat dan membalikkannya. Objek ini menggunakan pembalikan bit pada penghitung Spanner internal pribadi untuk memastikan keunikannya. Nilai yang dibalik ke bit yang dihasilkan membantu menghindari hotspotting dalam skala besar saat digunakan dalam kunci utama.
Di Spanner, Anda menggunakan pernyataan DDL SEQUENCE
beserta atribut
bit_reversed_positive
untuk membuat, mengubah, atau menghapus
urutan yang menghasilkan nilai positif bit-reversed (GoogleSQL atau
PostgreSQL).
Setiap urutan mempertahankan serangkaian 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 dan menempatkan nilai output yang dibalik ke 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 hotspotting.
Contoh berikut menunjukkan cara membuat urutan yang dibalik ke bit 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)
);
Selanjutnya, 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 mengembalikan hasil yang mirip dengan yang 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 ini menjelaskan setiap skenario.
Aplikasi baru
Jika aplikasi yang sudah ada memerlukan kunci INT64
di GoogleSQL, atau kunci bigint
di PostgreSQL, Spanner menawarkan objek skema urutan positif bit-reversed (PostgreSQL atau GoogleSQL). Jika tidak, untuk aplikasi
baru, sebaiknya gunakan
Universally Unique Identifier (UUID). Untuk
mengetahui informasi selengkapnya, baca Menggunakan ID Unik Universal (UUID).
Migrasi
Untuk migrasi tabel ke Spanner, Anda memiliki beberapa opsi:
- Jika menggunakan UUID dalam database sumber, di Spanner,
Anda dapat menggunakan kolom kunci dalam jenis
STRING
dan fungsiGENERATE_UUID()
(GoogleSQL atau PostgreSQL) sebagai nilai defaultnya. - Jika Anda menggunakan kunci utama bilangan bulat, dan aplikasi hanya memerlukan
kunci untuk menjadi unik, Anda dapat menggunakan kolom kunci di
INT64
dan menggunakan urutan positif yang dibalik bit untuk nilai default untuk kunci utama. Lihat Memigrasikan kolom kunci yang dibalik bit. Spanner tidak mendukung cara untuk menghasilkan nilai monoton.
Jika menggunakan kunci monotonik, seperti jenis
SERIAL
PostgreSQL, atau atributAUTO_INCREMENT
MySQL, dan memerlukan kunci monotonik baru di Spanner, Anda dapat menggunakan kunci komposit. Lihat Menukar urutan kunci dan Meng-hash kunci unik lalu menyebarkan operasi tulis ke berbagai shard logis.Jika aplikasi Anda membalikkan bit kunci
INT64
secara manual di GoogleSQL atau kuncibigint
di PostgreSQL, Anda dapat menggunakan urutan positif yang dibalik arah bit (GoogleSQL atau PostgreSQL) dan membuatnya menghasilkan nilai kunci baru untuk Anda. Lihat Memigrasikan kolom kunci yang dibalik bit.
Langkah selanjutnya
- Pelajari lebih lanjut cara menggunakan urutan dengan kontrol akses yang sangat terperinci.
- Pelajari pernyataan
SEQUENCE
DDL untuk GoogleSQL atau PostgreSQL. - Pelajari fungsi urutan di GoogleSQL atau PostgreSQL.
- Pelajari urutan dalam INFORMATION_SCHEMA di GoogleSQL atau PostgreSQL.
- Pelajari opsi urutan di INFORMATION_SCHEMA untuk GoogleSQL.