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.
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.
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.
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_penghuni | nama_penghuni | id_kamar | nomor_kamar |
1 | Budi | 101 | A1 |
2 | Siti | 102 | A2 |
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_tagihan | penghuni_id | bulan | jumlah_tagihan |
1 | 1 | Januari | 500000.00 |
2 | 1 | Februari | 500000.00 |
3 | 2 | Januari | 500000.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_pembeli | id_barang | jumlah |
1 | 1 | 3 |
1 | 2 | 2 |
2 | 1 | 10 |
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 darijalan
,kota
, dankode_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 berdasarkantanggal_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_siswa | nama | nomor_telepon |
1 | Ali | 08123456789, 08234567890 |
2 | Budi | 08198765432 |
3 | Siti | 08123456789, 08187654321 |
After (Sudah 1NF)
id_siswa | nama | nomor_telepon |
1 | Ali | 08123456789 |
1 | Ali | 08234567890 |
2 | Budi | 08198765432 |
3 | Siti | 08123456789 |
3 | Siti | 08187654321 |
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_siswa | nama_siswa | nama_mata_pelajaran |
1 | Ali | Matematika |
1 | Ali | Fisika |
2 | Budi | Matematika |
3 | Siti | Fisika |
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_siswa | nama_siswa |
1 | Ali |
2 | Budi |
3 | Siti |
Tabel mst_mata_pelajaran
id_mata_pelajaran | nama_mata_pelajaran |
1 | Matematika |
2 | Fisika |
Tabel ts_siswa_mata_pelajaran
id_siswa | id_mata_pelajaran |
1 | 1 |
1 | 2 |
2 | 1 |
3 | 2 |
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
Sudah dalam bentuk 2NF.
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_siswa | nama_siswa | nama_mata_pelajaran | nama_guru |
1 | Ali | Matematika | Pak Budi |
1 | Ali | Fisika | Pak Agus |
2 | Budi | Matematika | Pak Budi |
3 | Siti | Fisika | Pak Agus |
Masalah:
- Kolom
nama_guru
bergantung padanama_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_siswa | nama_siswa |
1 | Ali |
2 | Budi |
3 | Siti |
Tabel mst_mata_pelajaran (Menambahkan hubungan dengan guru)
id_mata_pelajaran | nama_mata_pelajaran | id_guru |
1 | Matematika | 1 |
2 | Fisika | 2 |
Tabel mst_guru
id_guru | nama_guru |
1 | Pak Budi |
2 | Pak Agus |
Tabel ts_siswa_mata_pelajaran
id_siswa | id_mata_pelajaran |
1 | 1 |
1 | 2 |
2 | 1 |
3 | 2 |
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_pembeli | nama_pembeli |
1 | Ali |
2 | Budi |
Tabel Barang
id_barang | nama_barang |
101 | Laptop |
102 | Ponsel |
Tabel Penjualan
id_penjualan | id_pembeli | id_barang |
1 | 1 | 101 |
2 | 1 | 102 |
3 | 2 | 101 |
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_penjualan | id_pembeli | nama_pembeli | id_barang | nama_barang |
1 | 1 | Ali | 101 | Laptop |
2 | 1 | Ali | 102 | Ponsel |
3 | 2 | Budi | 101 | Laptop |
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