Basis Data #1 - Mengenal Konsep Dasar Database

Basis Data #1 - Mengenal Konsep Dasar Database

Entity

Entity merupakan individu yang mewakili sebuah data (fakta) yang nyata, dan bisa dibedakan satu dengan yang lainnya.

Contoh Entity:

  • Dokter

  • Perawat

  • Bidan

  • Pasien

  • Jenis penyakit

  • Rekening

  • Nasabah

Relationship

Relationship merupakan hubungan antar Entity (tabel).

Misal hubungan antar entity Obat dengan entity Pasien. Atau entity Dokter dengan entity Pasien

Kardinalitas

Kardinalitas dalam database menggambarkan hubungan antara dua entitas atau tabel, khususnya berapa banyak data dalam satu tabel yang bisa berhubungan dengan data di tabel lain.

Jenis-jenis kardinalitas:

One-to-One (1:1)

One to One artinya hubungan antara Entity A misalnya, hanya bisa berhubungan dengan Entity B dengan maksimal hanya satu Entity saja.

Begitu pula sebaliknya, Entity B hanya bisa berelasi dengan satu Entity A.

Diagram One-to-One (1:1)

One-to-Many (1:N)

One to Many artinya hubungan antara Entity A misalnya, bisa berhubungan dengan banyak Entity B Tetapi tidak sebaliknya, Entity B hanya bisa berelasi dengan satu Entity A.

Diagram One-to-Many (1:N)

Many-to-Many (M:N)

Many-to-Many adalah jenis hubungan dalam basis data di mana satu entitas bisa berhubungan dengan banyak entitas lain, dan sebaliknya, entitas lain juga bisa berhubungan dengan banyak entitas yang pertama.

Hubungan many-to-many biasanya diimplementasikan dengan membuat tabel tambahan (tabel penghubung) yang menghubungkan kedua tabel utama.

Diagram Many-to-Many (M:N)

Contoh

One-to-One: Setiap penghuni hanya bisa memiliki satu kamar, dan setiap kamar hanya bisa dihuni oleh satu penghuni.

CREATE TABLE mst_penghuni (
    id_penghuni INT PRIMARY KEY,
    nama_penghuni VARCHAR(100)
);

CREATE TABLE mst_kamar (
    id_kamar INT PRIMARY KEY,
    nomor_kamar VARCHAR(10),
    penghuni_id INT UNIQUE,
    FOREIGN KEY (penghuni_id) REFERENCES mst_penghuni(id_penghuni)
);

Output Contoh:

id_penghuninama_penghuniid_kamarnomor_kamar
1Budi101A1
2Siti102A2

One-to-Many: Setiap penghuni bisa memiliki banyak tagihan bulanan.

CREATE TABLE ts_tagihan (
    id_tagihan INT PRIMARY KEY,
    penghuni_id INT,
    bulan VARCHAR(20),
    jumlah_tagihan DECIMAL(10, 2),
    FOREIGN KEY (penghuni_id) REFERENCES mst_penghuni(id_penghuni)
);

Output Contoh:

id_tagihanpenghuni_idbulanjumlah_tagihan
11Januari500000.00
21Februari500000.00
32Januari500000.00

Many-to-Many: pembeli bisa membeli banyak barang, dan satu barang bisa dibeli oleh banyak pembeli.

CREATE TABLE mst_pembeli (
    id_pembeli INT PRIMARY KEY,
    nama_pembeli VARCHAR(100)
);

CREATE TABLE mst_barang (
    id_barang INT PRIMARY KEY,
    nama_barang VARCHAR(100)
);

CREATE TABLE ts_pembeli_barang (
    id_pembeli INT,
    id_barang INT,
    jumlah INT,
    PRIMARY KEY (id_pembeli, id_barang),
    FOREIGN KEY (id_pembeli) REFERENCES mst_pembeli(id_pembeli),
    FOREIGN KEY (id_barang) REFERENCES mst_barang(id_barang)
);

Output Contoh:

id_pembeliid_barangjumlah
113
122
2110

Jenis Atribut

Attribute Key

  • Atribut yang digunakan untuk mengidentifikasi secara unik setiap record dalam tabel. Contohnya Primary Key pada tabel siswa:

      id_siswa INT PRIMARY KEY
    

    Ini memastikan bahwa setiap id_siswa adalah unik.

    Attribute Key milik entitas lain yang disimpan sebagai atribut di entitas lain, disebut Foreign Key

Simple Attribute dan Composite Attribute

  • Simple Attribute: Atribut yang tidak dapat dipecah menjadi bagian-bagian yang lebih kecil. Contoh: nama pada tabel siswa.

    Composite Attribute: Atribut yang terdiri dari beberapa atribut kecil. Contoh: alamat yang terdiri dari jalan, kota, dan kode_pos.

Single-Value Attribute dan Multi-Value Attribute

  • Single-Value Attribute: Atribut yang hanya memiliki satu nilai untuk setiap entitas. Contoh: tanggal_lahir yang hanya memiliki satu nilai untuk setiap siswa.

  • Multi-Value Attribute: Atribut yang dapat memiliki lebih dari satu nilai untuk satu entitas. Contoh: nomor_telepon pada siswa yang bisa menyimpan beberapa nomor telepon.

  • Mandatory Attribute

    Atribut yang harus memiliki nilai dan tidak boleh kosong. Contoh: nama pada tabel siswa yang harus diisi untuk setiap siswa.

  • Derived Attribute

    Atribut yang nilainya dapat dihitung atau diturunkan dari atribut lain. Contoh: usia yang dihitung berdasarkan tanggal_lahir.

    Contoh:

      SELECT EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM tanggal_lahir) AS usia FROM siswa;
    

Attribute Key

Attribute Key adalah nilai yang bisa digunakan sebagai identitas baris pada tabel yang sifatnya unik. Terdapat 3 jenis attribute key, yaitu :

Superkey

Superkey adalah satu atau lebih atribut yang bisa secara unik mengidentifikasi setiap record dalam tabel. Superkey bisa saja memiliki atribut tambahan yang tidak perlu untuk uniknya record. Contoh: Pada tabel siswa:

(id_siswa, nama)

Superkey di atas terdiri dari dua atribut, namun sebenarnya cukup dengan id_siswa saja untuk mengidentifikasi siswa secara unik.

Candidate key

Candidate key adalah superkey yang minimal, artinya tidak mengandung atribut tambahan yang tidak perlu. Jadi, setiap candidate key bisa mengidentifikasi record secara unik tanpa atribut tambahan. Contoh: Pada tabel siswa:

id_siswa

id_siswa adalah candidate key karena tidak ada atribut tambahan yang tidak perlu untuk mengidentifikasi siswa secara unik.

Primary key

Primary key adalah candidate key yang dipilih untuk secara resmi mengidentifikasi setiap record dalam tabel secara unik. Tabel hanya bisa memiliki satu primary key. Contoh: Pada tabel siswa:

id_siswa INT PRIMARY KEY

Di sini, id_siswa adalah primary key yang mengidentifikasi setiap siswa secara unik.

Normalisasi Data

  • Normalisasi data adalah proses atau tahapan dalam membuat basis data, yang bertujuan untuk menghilangkan data redundancy / ganda dan data yang tidak konsisten

  • Aturan dalam normalisasi data adalah membagi tabel besar menjadi tabel yang lebih kecil, dan menghubungkan menggunakan relasi.

Bentuk Normal Basis Data ke 1 (1NF)

Syarat-syarat 1NF

  • Tiap kolom tidak boleh menyimpan data lebih dari satu

  • Tidak ada kolom yang duplikat / ganda

  • Tidak ada baris yang duplikat / ganda

  • Tidak ada atribut turunan

Contoh 1NF

Berikut adalah contoh tabel Before dan After penerapan 1NF dalam basis data.

Before (Belum 1NF)

id_siswanamanomor_telepon
1Ali08123456789, 08234567890
2Budi08198765432
3Siti08123456789, 08187654321

After (Sudah 1NF)

id_siswanamanomor_telepon
1Ali08123456789
1Ali08234567890
2Budi08198765432
3Siti08123456789
3Siti08187654321

Penjelasan:

  • Before: Kolom nomor_telepon menyimpan lebih dari satu nilai dalam satu baris.

  • After: Setiap nomor telepon dipisahkan ke dalam baris yang berbeda untuk memastikan setiap kolom hanya memiliki satu nilai, sesuai dengan syarat 1NF.

Bentuk Normal Basis Data ke 2 (2NF)

Syarat-syarat 2NF

  • Harus sudah dalam bentuk normal basis data ke 1

  • Buat tabel terpisah untuk nilai-nilai yang keluar berulang kali pada beberapa baris

  • Tambahkan primary key pada tiap tabel

  • Hubungkan menggunakan foreign key

Contoh 2NF

Studi Kasus: Data Siswa dan Mata Pelajaran

Misalkan kita punya data siswa yang mengambil beberapa mata pelajaran, dan kita ingin memastikan tabel kita sesuai dengan 2NF.

Tabel Before (Sudah 1NF tapi belum 2NF)

Tabel berikut sudah memenuhi 1NF, tapi ada kolom nama_mata_pelajaran yang berulang kali muncul.

id_siswanama_siswanama_mata_pelajaran
1AliMatematika
1AliFisika
2BudiMatematika
3SitiFisika

Tabel After (Sudah 2NF)

Untuk memenuhi 2NF, kita perlu memisahkan nama_mata_pelajaran ke dalam tabel terpisah dan membuat relasi antar tabel menggunakan foreign key.

Tabel mst_siswa

id_siswanama_siswa
1Ali
2Budi
3Siti

Tabel mst_mata_pelajaran

id_mata_pelajarannama_mata_pelajaran
1Matematika
2Fisika

Tabel ts_siswa_mata_pelajaran

id_siswaid_mata_pelajaran
11
12
21
32

Penjelasan:

  • mst_siswa: Menyimpan data unik tentang siswa.

  • mst_mata_pelajaran: Menyimpan data unik tentang mata pelajaran.

  • ts_siswa_mata_pelajaran: Tabel transaksional yang menghubungkan siswa dan mata pelajaran menggunakan foreign key dari kedua tabel master.

Dengan cara ini, tidak ada pengulangan nilai pada kolom nama_mata_pelajaran, dan setiap tabel sudah memiliki primary key serta terhubung melalui foreign key, sehingga tabel sudah memenuhi 2NF.

Bentuk Normal Basis Data ke 3

Pindahkan kolom-kolom yang tidak tergantung ke key menjadi tabel lain.

Hal ini dikarenakan jika terjadi perubahan pada kolom tersebut, ditakutkan perlu melakukan perubahan di banyak baris.

Syarat-Syarat 3NF

  1. Sudah dalam bentuk 2NF.

  2. Tidak ada dependensi transitif: Atribut non-prime (atribut yang bukan bagian dari primary key) harus bergantung langsung pada primary key, dan tidak boleh bergantung pada atribut non-prime lainnya.

Contoh 3NF

Tabel Sebelum 3NF (Sudah 2NF tetapi belum 3NF)

Misalkan kita punya data siswa, mata pelajaran, dan guru yang mengajar mata pelajaran tersebut. Namun, informasi guru bergantung pada mata pelajaran, bukan pada siswa secara langsung. Ini menyebabkan dependensi transitif.

id_siswanama_siswanama_mata_pelajarannama_guru
1AliMatematikaPak Budi
1AliFisikaPak Agus
2BudiMatematikaPak Budi
3SitiFisikaPak Agus

Masalah:

  • Kolom nama_guru bergantung pada nama_mata_pelajaran, bukan pada primary key secara langsung. Ini adalah dependensi transitif.

Contoh Tabel Sesudah 3NF

Untuk memenuhi 3NF, kita perlu memisahkan dependensi transitif dengan membuat tabel terpisah untuk guru dan menghubungkannya dengan mata pelajaran.

Tabel mst_siswa (Sama seperti di 2NF)

id_siswanama_siswa
1Ali
2Budi
3Siti

Tabel mst_mata_pelajaran (Menambahkan hubungan dengan guru)

id_mata_pelajarannama_mata_pelajaranid_guru
1Matematika1
2Fisika2

Tabel mst_guru

id_gurunama_guru
1Pak Budi
2Pak Agus

Tabel ts_siswa_mata_pelajaran

id_siswaid_mata_pelajaran
11
12
21
32

Penjelasan:

  • mst_siswa: Menyimpan data unik tentang siswa.

  • mst_mata_pelajaran: Menyimpan data unik tentang mata pelajaran serta foreign key untuk guru.

  • mst_guru: Menyimpan data unik tentang guru.

  • ts_siswa_mata_pelajaran: Menghubungkan siswa dengan mata pelajaran.

Dengan cara ini, dependensi transitif dihilangkan karena data guru dipisahkan ke tabel tersendiri, dan setiap kolom sekarang hanya bergantung langsung pada primary key, memenuhi syarat 3NF.

Denormalisasi Data

Normalisasi data digunakan untuk membuat model basis data yang baik. Normalisasi data sebenarnya hanyalah petunjuk saja, dalam keadaan tertentu, kadang kita bisa melanggar aturan dari normalisasi data.

Pelanggaran normalisasi data tersebut disebut denormalisasi data. Alasan kita melakukan denormalisasi data, adalah untuk mendapatkan performa yang lebih baik

Dan denormalisasi data sering sekali dilakukan di dunia nyata. Ada banyak sekali cara melakukan denormalisasi data, namun inti dari denormalisasi data adalah meningkatkan performa kecepatan mendapat data.

Contoh

Tabel-Tabel Terpisah (Normalisasi)

Misalkan kita punya data penjualan yang dinormalisasi ke dalam beberapa tabel:

Tabel Pembeli

id_pembelinama_pembeli
1Ali
2Budi

Tabel Barang

id_barangnama_barang
101Laptop
102Ponsel

Tabel Penjualan

id_penjualanid_pembeliid_barang
11101
21102
32101

Setelah Denormalisasi

Dalam denormalisasi, kita menggabungkan data dari tabel pembeli dan barang langsung ke dalam tabel penjualan. Ini mengurangi kebutuhan akan join antar tabel saat kita mengambil data.

Tabel Penjualan Denormalisasi

id_penjualanid_pembelinama_pembeliid_barangnama_barang
11Ali101Laptop
21Ali102Ponsel
32Budi101Laptop

Immutable dan Mutable

  • Saat kita membuat tabel, rata-rata adalah mutable table (tabel yang bisa diubah), contohnya adalah semua tabel yang sudah kita buat.

  • Namun pada kasus tertentu, kadang ada tabel yang sifatnya immutable table (tabel yang tidak boleh diubah), artinya hanya boleh memasukkan data, tidak boleh diubah lagi

  • Pada kasus Order, sebenarnya idealnya adalah datanya immutable table, kenapa? Karena penjualan yang sudah terjadi, tidak boleh berubah lagi ketika di masa depan misal terjadi perubahan data, misal ketika harga produk berubah, nama produk berubah, dan lain-lain

  • Seandainya misal pada kasus kita, kita ingin menjadikan Order adalah data yang immutable, artinya semua data yang berasal dari tabel master / detail / aslinya, maka harus kita duplikasi ke tabel immutable nya

Tabel Mutable

  • Mutable berarti dapat diubah.

  • Tabel Mutable memungkinkan data di dalamnya untuk diperbarui atau dihapus. Biasanya digunakan dalam aplikasi di mana data berubah seiring waktu.

    Contoh:

    • Tabel pengguna yang menyimpan data nama, email, dan alamat pengguna yang bisa diperbarui ketika ada perubahan.

Tabel Immutable

  • Immutable berarti tidak dapat diubah setelah dibuat.

  • Tabel Immutable hanya memungkinkan penambahan data baru, tetapi tidak bisa diubah atau dihapus setelah itu. Biasanya digunakan dalam konteks log atau audit trail untuk melacak sejarah.

    Contoh:

    • Tabel log_transaksi yang menyimpan riwayat transaksi. Setiap transaksi baru akan dicatat, tetapi tidak dapat diubah atau dihapus.

Kesimpulan Mutable & Immutable

  • Mutable: Data bisa berubah (di-update atau dihapus).

  • Immutable: Data tidak bisa diubah setelah dimasukkan (hanya bisa ditambah).


Artikel ini adalah catatan dari belajar di Database PostgreSQL : Pemula sampai Mahir