Ketika merancang skema database, salah satu keputusan paling krusial adalah memilih jenis primary key. Pilihan ini berdampak signifikan pada performa, skalabilitas, dan keamanan sistem Anda. Dua opsi yang paling umum adalah INT auto increment dan UUID (Universally Unique Identifier). Keduanya memiliki serangkaian kelebihan dan kekurangan yang perlu dipertimbangkan berdasarkan kebutuhan spesifik aplikasi Anda.

1. INT Auto Increment

Kelebihan:

  • Ringan & Efisien: Berukuran kecil (4/8 byte), menghasilkan indeks yang lebih ramping dan performa query yang lebih cepat, terutama untuk operasi join dan lookup.
  • Performa Tinggi: Karena sifatnya yang sekuensial, penyisipan data pada indeks B-Tree sangat efisien.
  • Mudah Dipahami: Nilai yang berurutan mudah dibaca, diatur, dan diprediksi, ideal untuk sistem terpusat.

Kekurangan:

  • Kurang Aman untuk Eksposur Publik: Karena mudah ditebak (misalnya, ID 101 akan diikuti oleh 102), ID ini rentan terhadap enumerasi jika terekspos ke publik.
  • Potensi Konflik di Sistem Terdistribusi: Sulit untuk menjamin keunikan global jika beberapa server secara independen menghasilkan ID.
  • Komplikasi Migrasi Data: Menggabungkan data dari beberapa sumber bisa menjadi lebih rumit.

2. UUID (Universally Unique Identifier)

Kelebihan:

  • Unik Secara Global: Menjamin keunikan di seluruh sistem, bahkan jika data dibuat di berbagai server tanpa koordinasi.
  • Lebih Aman untuk Eksposur Publik: Sulit ditebak, sehingga lebih aman digunakan sebagai pengidentifikasi yang terbuka untuk klien.
  • Mempermudah Migrasi Data: Menggabungkan data dari berbagai sumber tidak memerlukan pemetaan ulang ID.
  • Skalabilitas Lebih Baik: Sangat cocok untuk arsitektur terdistribusi dan multi-region.

Kekurangan:

  • Ukuran Lebih Besar: Dengan 16 byte, UUID membuat indeks lebih besar dan berpotensi membutuhkan lebih banyak penyimpanan.
  • Kurang Efisien dalam Query: Operasi lookup dan join mungkin sedikit lebih lambat dibandingkan INT karena ukuran dan sifatnya.
  • Fragmentasi Indeks: Terutama UUID v4 yang acak, dapat menyebabkan fragmentasi pada indeks B-Tree, mengurangi efisiensi.
  • Kurang Ramah Manusia: Deret karakter panjang ini sulit dibaca atau dikelola secara manual.

3. Dampak pada Indexing

Database modern seperti PostgreSQL dan MySQL umumnya menggunakan indeks B-Tree secara default:

  • INT: Karena sifatnya yang sekuensial, penyisipan data selalu terjadi di ujung indeks, menjadikannya sangat efisien.
  • UUID v4 (random): Penyisipan acak dapat menyebabkan data tersebar di seluruh pohon indeks, mengakibatkan fragmentasi dan penurunan performa.

Solusi Mitigasi UUID:

  • Gunakan UUID v1/v7 (berbasis waktu/terurut) untuk menjaga urutan dan mengurangi fragmentasi.
  • Alternatif lain seperti ULID/KSUID juga menawarkan keunikan global dengan urutan waktu.

4. Masalah Keamanan ID

  • INT: Karena mudah ditebak, URL yang menampilkan ID seperti /users/124 berisiko dieksploitasi melalui enumerasi.
  • UUID: Jauh lebih sulit ditebak, menjadikannya pilihan yang lebih aman untuk pengidentifikasi publik. Meskipun validasi otorisasi selalu diperlukan, UUID menambahkan lapisan keamanan tambahan.

5. Pola Hybrid: Mengambil yang Terbaik dari Keduanya

Banyak sistem berskala besar mengadopsi pola gabungan untuk mendapatkan keuntungan dari kedua jenis primary key:

CREATE EXTENSION IF NOT EXISTS "pgcrypto";

CREATE TABLE users (
    id BIGSERIAL PRIMARY KEY,  -- PK internal untuk efisiensi DB
    public_id UUID UNIQUE NOT NULL DEFAULT gen_random_uuid(), -- Diekspos ke klien
    name TEXT
);

-- Index hash khusus untuk public_id
CREATE INDEX idx_users_public_id_hash
ON users USING hash (public_id);
  • INT (BIGSERIAL): Digunakan sebagai primary key internal untuk operasi database yang efisien (join, foreign key).
  • UUID: Berfungsi sebagai public_id yang diekspos ke klien, memberikan keamanan dan keunikan global.
  • Index Hash: Ideal untuk query pencarian tepat (WHERE public_id = ...) pada UUID.

Pola ini memungkinkan database tetap efisien untuk operasi internal, sementara API publik tetap aman dan kuat, dengan tambahan overhead penyimpanan yang dapat ditoleransi.

6. Alternatif UUID

Selain UUID standar, beberapa opsi lain untuk pengidentifikasi unik meliputi:

  • UUID v7: Versi UUID yang lebih terurut, mengurangi fragmentasi indeks.
  • ULID/KSUID: Pengidentifikasi unik global yang tetap mempertahankan urutan waktu.
  • Snowflake ID: Pengidentifikasi integer 64-bit unik global, populer di sistem terdistribusi besar seperti Twitter.

Kesimpulan

  • Pilih INT Auto Increment sebagai primary key internal jika performa database adalah prioritas utama Anda.
  • Gunakan UUID/ULID/KSUID untuk pengidentifikasi yang akan diekspos ke publik guna meningkatkan keamanan.
  • Praktik terbaik adalah kombinasi keduanya: “PK internal = INT, Public ID = UUID dengan hash index.”

Dengan menerapkan pola hybrid ini, Anda dapat mencapai keseimbangan optimal antara performa database dan keamanan aplikasi yang tangguh saat mengekspos pengidentifikasi ke dunia luar.

Leave a Reply

Your email address will not be published. Required fields are marked *

Fill out this field
Fill out this field
Please enter a valid email address.
You need to agree with the terms to proceed