Skip to main content

Command Palette

Search for a command to run...

Relasi Table Dengan Kasus Absensi Pondok Melalui PostgreSQL

By Ahmad Afan Shobari

Updated
4 min read
Relasi Table Dengan Kasus Absensi Pondok Melalui PostgreSQL
A
I'm a Programmer

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=HADIR 06:58, 0, Datang awal)

  • (tgl 2025-08-25, jadwal=Senin, S2=TERLAMBAT 07:12, 12, Macet)

  • (tgl 2025-08-25, jadwal=Senin, S3=HADIR 07:05, 5, -)

  • (tgl 2025-08-26, jadwal=Selasa, S1=HADIR 06: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

  1. 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).

  2. ustadz

    • Create ustadz.

    • Cari ustadz by nama (ILIKE), paginate.

    • Update nama ustadz.

    • Delete ustadz (uji FK).

  3. 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).

  4. 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).

  5. 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

2.4.3

2.4.4 Mencoba Keunggulan Contsraint Check

M
MUHAMMAD9mo ago

NICE!

M
MUHAMMAD9mo ago

NICE!

A

sip, lanjutkan..

A
ahmad9mo ago

mantap