Post 7: Primary Key, Foreign Key, dan Candidate Key

šŸ”‘ Konsep Key dalam Database

Key adalah elemen fundamental dalam database relasional yang digunakan untuk mengidentifikasi record secara unik dan membangun relasi antar tabel. Memahami jenis-jenis key sangat penting untuk merancang database yang efisien dan terstruktur dengan baik.

1. Primary Key (Kunci Utama)

Definisi Primary Key

Primary Key adalah attribute atau kombinasi attribute yang secara unik mengidentifikasi setiap record dalam sebuah tabel. Primary Key tidak boleh memiliki nilai NULL dan harus unique untuk setiap row.

Karakteristik Primary Key:

  • Uniqueness: Setiap nilai harus unik, tidak boleh ada duplikasi
  • Not Null: Primary Key tidak boleh bernilai NULL
  • Immutable: Nilai Primary Key sebaiknya tidak berubah
  • Single per Table: Satu tabel hanya boleh memiliki satu Primary Key
  • Indexing: Database otomatis membuat index pada Primary Key

5 Contoh Penerapan dalam ERD

Contoh 1: Sistem Perpustakaan

ERD Sistem Perpustakaan

ANGGOTA ——1:N—— PEMINJAMAN ——N:1—— BUKU

Tabel ANGGOTA

ID_Anggota (PK) Nama Email No_Telepon
A001 Gilang Ramadhan gilang@email.com 081234567890

Tabel BUKU

ISBN (PK) Judul Pengarang Tahun
978-0134685991 Database Systems Elmasri 2015

Tabel PEMINJAMAN

ID_Pinjam (PK) ID_Anggota (FK) ISBN (FK) Tgl_Pinjam Tgl_Kembali
P001 A001 978-0134685991 2024-10-01 2024-10-08
CREATE TABLE anggota (
    id_anggota VARCHAR(10) PRIMARY KEY,
    nama VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE,
    no_telepon VARCHAR(15)
);

CREATE TABLE buku (
    isbn VARCHAR(20) PRIMARY KEY,
    judul VARCHAR(200) NOT NULL,
    pengarang VARCHAR(100),
    tahun INT
);

CREATE TABLE peminjaman (
    id_pinjam VARCHAR(10) PRIMARY KEY,
    id_anggota VARCHAR(10),
    isbn VARCHAR(20),
    tgl_pinjam DATE,
    tgl_kembali DATE,
    FOREIGN KEY (id_anggota) REFERENCES anggota(id_anggota),
    FOREIGN KEY (isbn) REFERENCES buku(isbn)
);

Penjelasan:

  • Primary Keys: ID_Anggota, ISBN, ID_Pinjam
  • Foreign Keys: ID_Anggota dan ISBN di tabel PEMINJAMAN
  • Candidate Keys: Email di tabel ANGGOTA (unique)

Contoh 2: Sistem Akademik Kampus

ERD Sistem Akademik

MAHASISWA ——1:N—— KRS ——N:1—— MATA_KULIAH

DOSEN ——1:N—— MATA_KULIAH

Tabel MAHASISWA

NIM (PK) Nama Jurusan Angkatan
24416255201003 Gilang Ramadhan Teknik Informatika 2024

Tabel DOSEN

NIP (PK) Nama Departemen
198501012020121001 Dr. Ahmad Fauzi Informatika

Tabel MATA_KULIAH

Kode_MK (PK) Nama_MK SKS NIP_Dosen (FK)
TI101 Basis Data 3 198501012020121001

Tabel KRS

ID_KRS (PK) NIM (FK) Kode_MK (FK) Semester Nilai
1 24416255201003 TI101 Ganjil 2024 A
CREATE TABLE mahasiswa (
    nim VARCHAR(15) PRIMARY KEY,
    nama VARCHAR(100) NOT NULL,
    jurusan VARCHAR(50),
    angkatan INT
);

CREATE TABLE dosen (
    nip VARCHAR(20) PRIMARY KEY,
    nama VARCHAR(100) NOT NULL,
    departemen VARCHAR(50)
);

CREATE TABLE mata_kuliah (
    kode_mk VARCHAR(10) PRIMARY KEY,
    nama_mk VARCHAR(100) NOT NULL,
    sks INT,
    nip_dosen VARCHAR(20),
    FOREIGN KEY (nip_dosen) REFERENCES dosen(nip)
);

CREATE TABLE krs (
    id_krs INT PRIMARY KEY AUTO_INCREMENT,
    nim VARCHAR(15),
    kode_mk VARCHAR(10),
    semester VARCHAR(20),
    nilai CHAR(2),
    FOREIGN KEY (nim) REFERENCES mahasiswa(nim),
    FOREIGN KEY (kode_mk) REFERENCES mata_kuliah(kode_mk)
);

Contoh 3: Sistem E-Commerce

ERD Sistem E-Commerce

PELANGGAN ——1:N—— PESANAN ——1:N—— DETAIL_PESANAN

PRODUK ——1:N—— DETAIL_PESANAN

Tabel PELANGGAN

ID_Pelanggan (PK) Nama Email (CK) No_HP
C001 Gilang Ramadhan gilang@email.com 081234567890

Tabel PRODUK

ID_Produk (PK) Nama_Produk Harga Stok
PRD001 Laptop ASUS 8500000 10

Tabel PESANAN

ID_Pesanan (PK) ID_Pelanggan (FK) Tanggal Total Status
ORD001 C001 2024-10-09 8500000 Diproses

Tabel DETAIL_PESANAN

ID_Detail (PK) ID_Pesanan (FK) ID_Produk (FK) Jumlah Subtotal
1 ORD001 PRD001 1 8500000
CREATE TABLE pelanggan (
    id_pelanggan VARCHAR(10) PRIMARY KEY,
    nama VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE,
    no_hp VARCHAR(15)
);

CREATE TABLE produk (
    id_produk VARCHAR(10) PRIMARY KEY,
    nama_produk VARCHAR(200) NOT NULL,
    harga DECIMAL(12,2),
    stok INT
);

CREATE TABLE pesanan (
    id_pesanan VARCHAR(10) PRIMARY KEY,
    id_pelanggan VARCHAR(10),
    tanggal DATE,
    total DECIMAL(12,2),
    status VARCHAR(20),
    FOREIGN KEY (id_pelanggan) REFERENCES pelanggan(id_pelanggan)
);

CREATE TABLE detail_pesanan (
    id_detail INT PRIMARY KEY AUTO_INCREMENT,
    id_pesanan VARCHAR(10),
    id_produk VARCHAR(10),
    jumlah INT,
    subtotal DECIMAL(12,2),
    FOREIGN KEY (id_pesanan) REFERENCES pesanan(id_pesanan),
    FOREIGN KEY (id_produk) REFERENCES produk(id_produk)
);

Contoh 4: Sistem Rumah Sakit

ERD Sistem Rumah Sakit

PASIEN ——1:N—— REKAM_MEDIS ——N:1—— DOKTER

Tabel PASIEN

ID_Pasien (PK) NIK (CK) Nama Tgl_Lahir
P001 3201234567890123 Gilang Ramadhan 2000-01-15

Tabel DOKTER

ID_Dokter (PK) Nama Spesialisasi No_Izin (CK)
D001 Dr. Ahmad Umum SIP123456

Tabel REKAM_MEDIS

ID_Rekam (PK) ID_Pasien (FK) ID_Dokter (FK) Tanggal Diagnosa
RM001 P001 D001 2024-10-09 Demam
CREATE TABLE pasien (
    id_pasien VARCHAR(10) PRIMARY KEY,
    nik VARCHAR(16) UNIQUE NOT NULL,
    nama VARCHAR(100) NOT NULL,
    tgl_lahir DATE
);

CREATE TABLE dokter (
    id_dokter VARCHAR(10) PRIMARY KEY,
    nama VARCHAR(100) NOT NULL,
    spesialisasi VARCHAR(50),
    no_izin VARCHAR(20) UNIQUE
);

CREATE TABLE rekam_medis (
    id_rekam VARCHAR(10) PRIMARY KEY,
    id_pasien VARCHAR(10),
    id_dokter VARCHAR(10),
    tanggal DATE,
    diagnosa TEXT,
    FOREIGN KEY (id_pasien) REFERENCES pasien(id_pasien),
    FOREIGN KEY (id_dokter) REFERENCES dokter(id_dokter)
);

Contoh 5: Sistem Rental Mobil

ERD Sistem Rental Mobil

PELANGGAN ——1:N—— TRANSAKSI ——N:1—— MOBIL

Tabel PELANGGAN

ID_Pelanggan (PK) No_KTP (CK) Nama No_SIM (CK)
PL001 3201234567890123 Gilang Ramadhan 1234567890123456

Tabel MOBIL

ID_Mobil (PK) No_Plat (CK) Merk Harga_Sewa
M001 B1234XYZ Toyota Avanza 350000

Tabel TRANSAKSI

ID_Transaksi (PK) ID_Pelanggan (FK) ID_Mobil (FK) Tgl_Sewa Tgl_Kembali Total
TR001 PL001 M001 2024-10-09 2024-10-12 1050000
CREATE TABLE pelanggan (
    id_pelanggan VARCHAR(10) PRIMARY KEY,
    no_ktp VARCHAR(16) UNIQUE NOT NULL,
    nama VARCHAR(100) NOT NULL,
    no_sim VARCHAR(16) UNIQUE NOT NULL
);

CREATE TABLE mobil (
    id_mobil VARCHAR(10) PRIMARY KEY,
    no_plat VARCHAR(15) UNIQUE NOT NULL,
    merk VARCHAR(50),
    harga_sewa DECIMAL(10,2)
);

CREATE TABLE transaksi (
    id_transaksi VARCHAR(10) PRIMARY KEY,
    id_pelanggan VARCHAR(10),
    id_mobil VARCHAR(10),
    tgl_sewa DATE,
    tgl_kembali DATE,
    total DECIMAL(12,2),
    FOREIGN KEY (id_pelanggan) REFERENCES pelanggan(id_pelanggan),
    FOREIGN KEY (id_mobil) REFERENCES mobil(id_mobil)
);

Perbedaan Primary Key, Foreign Key, dan Candidate Key

Aspek Primary Key Foreign Key Candidate Key
Jumlah per Tabel Hanya 1 Bisa banyak Bisa banyak
Nilai NULL Tidak boleh Boleh (optional) Tidak boleh
Uniqueness Harus unique Tidak harus Harus unique
Fungsi Utama Identifikasi record Membuat relasi Kandidat PK

šŸŽÆ Kesimpulan dari 5 Contoh

  • Primary Key: Selalu ada di setiap tabel untuk identifikasi unik
  • Foreign Key: Digunakan untuk membangun relasi antar tabel
  • Candidate Key: Attribute yang unique dan bisa menjadi alternatif PK (seperti Email, NIK, No_Plat)
  • Composite Key: Kadang diperlukan saat tidak ada single attribute yang unique (seperti di KRS)

Best Practices

āœ… Tips Penting:

  • Pilih Primary Key yang stabil dan tidak berubah
  • Gunakan Foreign Key untuk menjaga integritas referensial
  • Identifikasi Candidate Key untuk membuat UNIQUE constraint
  • Buat index pada Foreign Key untuk meningkatkan performa JOIN
  • Dokumentasikan relasi dengan jelas dalam ERD

Kesimpulan

Primary Key, Foreign Key, dan Candidate Key adalah komponen esensial dalam desain database. Melalui 5 contoh di atas, kita dapat melihat bagaimana ketiga konsep ini diterapkan dalam berbagai sistem: perpustakaan, akademik, e-commerce, rumah sakit, dan rental mobil. Pemahaman yang baik tentang konsep-konsep ini akan membantu Anda merancang database yang efisien, terstruktur, dan mudah dimaintain.

← Kembali ke Beranda