Relasi Table Dengan Kasus Absensi Pondok Melalui PostgreSQL
By Ahmad Afan Shobari

Assalamualaikum, pada kesempatan kali ini kita akan melanjutkan sesi latihan kita, yaitu tentang absensi kelas
1. Masalah
Pondok "PPQITA" ingin menertibkan absensi santri per pertemuan berdasarkan jadwal tetap. Selama ini absensi di kertas/WA menyulitkan rekap harian/bulanan. Sistem yang dibangun harus:
Mencatat kehadiran setiap santri pada tanggal tertentu untuk jadwal tertentu.
Mendukung status:
HADIR | TERLAMBAT | SAKIT | IZIN | ALPHA.Memastikan tidak ada duplikasi catatan untuk santri yang sama pada kombinasi (tanggal, jadwal).
Menyediakan rekap sederhana (per jadwal/per bulan).
2. Praktik
2.1 Membuat Table
- pertama kita akan membuat tablenya
--table ustadz
create table ustadz (
id_ustadz serial primary key,
nama_ustadz varchar(50)
);
--table kelas
create table kelas (
id_kelas serial primary key,
nama_kelas varchar(50),
tingkat int
);
--table santri
create table santri (
id_santri serial primary key,
nis varchar(20) unique,
nama_santri varchar(100),
jk char(1),
kelas_id int references kelas(id_kelas) ON UPDATE CASCADE ON DELETE RESTRICT
);
--table jadwal
create table jadwal (
id_jadwal serial primary key,
id_kelas int references kelas(id_kelas) ON UPDATE CASCADE ON DELETE RESTRICT,
id_ustadz int references ustadz(id_ustadz) ON UPDATE CASCADE ON DELETE RESTRICT,
mapel varchar(50),
hari varchar(50),
jam_mulai time,
jam_selesai time,
lokasi varchar(150)
);
--table kehadiran
create table kehadiran (
tanggal date ,
id_jadwal int references jadwal(id_jadwal) on update cascade on delete restrict,
id_santri int references santri(id_santri) on update cascade on delete restrict,
status varchar(50) check (status in ('hadir', 'terlambat', 'sakit', 'izin', 'alpha')),
waktu_masuk time,
menit_telat int check (menit_telat >= 0),
catatan text
);



Kemudian kita akan menambahkan index pada beberapa column

2.2 Menambahkan Data
kelas
- (nama=
Tahfidz 1A, tingkat=1)
ustadz
- (nama=
Ust. Alwi)
santri
(
24101,Ahmad Fauzi,L, kelas=Tahfidz 1A)(
24102,Bima Putra,L, kelas=Tahfidz 1A)(
24103,Cahya Lestari,P, kelas=Tahfidz 1A)
jadwal
(kelas=
Tahfidz 1A, ustadz=Ust. Alwi, mapel=Tahfidz, hari=Senin, jam=07:00-08:30, lokasi=Kelas A)(kelas=
Tahfidz 1A, ustadz=Ust. Alwi, mapel=Tahfidz, hari=Selasa, jam=07:0008:30, lokasi=Kelas A)
kehadiran (contoh dua hari):
(tgl
2025-08-25, jadwal=Senin, S1=HADIR06:58, 0,Datang awal)(tgl
2025-08-25, jadwal=Senin, S2=TERLAMBAT07:12, 12,Macet)(tgl
2025-08-25, jadwal=Senin, S3=HADIR07:05, 5,-)(tgl
2025-08-26, jadwal=Selasa, S1=HADIR06:59, 0,-)(tgl
2025-08-26, jadwal=Selasa, S2=IZIN,NULL,NULL,Urusan keluarga)(tgl
2025-08-26, jadwal=Selasa, S3=ALPHA,NULL,NULL,-)


`
2.3 CRUD Data
kelas
Create kelas baru.
List kelas (urut tingkat, nama) dengan pagination (LIMIT/OFFSET).
Update nama & tingkat sebuah kelas.
Delete kelas (uji kegagalan jika masih dirujuk FK).
ustadz
Create ustadz.
Cari ustadz by nama (ILIKE), paginate.
Update nama ustadz.
Delete ustadz (uji FK).
santri
Create santri (NIS unik).
List santri per kelas + opsi search nama/NIS (ILIKE), paginate.
Detail santri beserta nama kelas.
Update (ganti kelas/jk/nama/nis).
Delete santri (uji FK).
jadwal
Create jadwal (kelas, ustadz, mapel, hari, jam, lokasi).
List jadwal per kelas/hari.
Detail jadwal (tampilkan nama kelas & ustadz).
Update jadwal.
Delete jadwal (uji FK).
kehadiran
Create satu baris absensi (tanggal, jadwal, santri, status, waktu_masuk, menit_telat, catatan).
Uji UNIQUE(tanggal, jadwal, santri) dengan mencoba insert duplikat.
List absensi untuk satu tanggal & jadwal (tampilkan NIS, Nama Santri, status, menit_telat).
Update status/waktu_masuk/menit_telat/catatan.
Delete satu catatan absensi.
2.3.1 Kelas




2.3.2 Ustadz




2.3.3 Santri




2.3.4 Jadwal





2.3.5 Kehadiran




2.4 Query Data
2.4.1 Query Total Kehadiran

2.4.2 Query Data Bulanan

2.4.3 Query Data Yang Sering terlambat
2.5 Uji Contraint
2.5.1 Memasukan Data Yang Mirip Pada Constraint UNIQUE

Pada gambar diatas menunjukan bahwa data yang dikenai UNIQUE tidak dapat menyimpan yang sama, karena akan menghasilkan error , dimana nis ‘24101‘ sudah ada didalam table dan kita tidak dapat mengunakannya lagi
2.4.2 Menghapus Data Yang Terdapat Foreign Key

Pada gambar diatas menunjukan bahwa data yang tersambung dengan data yang menjadi fk (foreign key) tidak dapat dihapus karena itu dapat merusak susunan table , dan pasti akan muncul error



