eSchool Dev Docs

Dokumentasi Database

ERD, kamus data, dan langkah inisialisasi database eSchool

Dokumentasi ini menjelaskan struktur database eSchool. Database memakai MySQL dengan framework Laravel (Eloquent).

Kamus data lengkap seluruh tabel tenant ada di Kamus Data (192 tabel, 1762 kolom).

1. Gambaran database

eSchool memakai dua koneksi Laravel:

KoneksiJenisIsi
mysqlCentralData sekolah, paket, langganan, user super admin
schoolTenantData akademik satu sekolah. Berpindah database sesuai sekolah aktif

Nama database per environment:

AplikasiEnvironmentCentralTenant
API-SekolahDevelopmenteschool-centraleschool_school
API-SekolahStagingeschool-central-stagingeschool_school_staging
API-SekolahProductioneschool-central-prodeschool_school_prod
SuperadminTiap servereschool-centraldatabase per sekolah (contoh: eschool-87-smkn100malang)

Cara tenant dipilih dijelaskan di Multi-Tenant.

Isi database tenant

Database tenant dibaca dari dump sekolah eschool-87-smkn100malang (MariaDB 10.11, 192 tabel). Ringkasan per kelompok:

KelompokJumlah tabelContoh tabel
Pengguna dan akses15users, students, staffs, guardian_details
Sekolah, paket, dan langganan25schools, school_settings, system_settings, edu_level
Akademik dan kelas26session_years, semesters, grade_level, classes
Absensi9attendances, attendance_days, attendance_points, absensi_settings
Ujian dan nilai16exams, exam_marks, exam_results, exam_timetables
Tugas dan komunikasi11assignments, assignment_submissions, accepted_file, attachments
Keuangan19fees, fees_class, fees_paids, fees_types
Cuti dan pelanggaran7leaves, leave_details, leave_masters, student_violations
Ekstrakurikuler4estrakulikulers, eskul_details, eskul_absensis, eskul_timetables
Aset dan sarana9assets, asset_categories, asset_disposals, asset_items
Dokumen departemen42folder_bendahara, folder_humas, folder_kesiswaan, folder_kpk
Sistem Laravel9migrations, failed_jobs, form_fields, kpks

Selain data akademik, database tenant juga berisi tabel schools, packages, features, subscriptions, dan tabel langganan lainnya. 85 tabel punya kolom school_id dengan foreign key ke schools.id (sekolah ini school_id = 87). Jadi di tenant, schools adalah baris data sekolah itu sendiri, bukan sekadar referensi ke central.

2. Entity Relationship Diagram (ERD)

ERD berikut dibuat dari foreign key di database tenant, hanya untuk tabel inti. Garis school_id ke schools tidak digambar karena hampir semua tabel memilikinya. Untuk relasi tabel lain, lihat baris Relasi di tiap tabel pada Kamus Data.

Memuat diagram...

model_has_roles bersifat polymorphic: model_type + model_id menunjuk ke user dan tidak punya foreign key ke users. Nilai model_type harus konsisten antara web (TenantUser) dan API (App\\Models\\User\\User). Pada dump sekolah 87, nilai yang tersimpan adalah App\\Models\\User (1491 baris) dan App\\Models\\TenantUser (150 baris). Tidak ada App\\Models\\User\\User.

Kolom student_id tidak konsisten antar tabel. Menunjuk ke users.id: 12 tabel, termasuk attendances, exam_results, dan subject_attendance_students. Menunjuk ke students.id: eskul_details, original_classes, payment_history, recap_absensi, xendit_invoices. Tanpa foreign key: fees_paids, optional_fees, student_violations. Cek dulu tabelnya sebelum melakukan join.

3. Kamus Data (Data Dictionary)

Berikut tabel inti yang paling sering disentuh saat development. Seluruh tabel ada di Kamus Data.

Tabel: roles

Menyimpan daftar role. Role bawaan: School Admin, Teacher, Student, Guardian. Role tambahan per sekolah (Kesiswaan, Bendahara, Kepsek) punya custom_role = 1. Pada sekolah 87 semua role memakai guard web.

Nama KolomTipe DataAtributKeterangan
idBIGINT UNSIGNEDPK, Auto Increment, Not Null
nameVARCHAR(191)Unique (name+guard_name+school_id), Not Null
guard_nameVARCHAR(191)Unique (name+guard_name+school_id), Not Null
school_idBIGINT UNSIGNEDFK (schools.id), Unique (name+guard_name+school_id), Nullable
custom_roleTINYINT(1)Not Null, Default 1
editableTINYINT(1)Not Null, Default 1
created_atTIMESTAMPNullable
updated_atTIMESTAMPNullable

Tabel: permissions

Menyimpan daftar permission yang dipakai untuk membatasi menu dan aksi.

Nama KolomTipe DataAtributKeterangan
idBIGINT UNSIGNEDPK, Auto Increment, Not Null
nameVARCHAR(191)Unique (name+guard_name), Not Null
guard_nameVARCHAR(191)Unique (name+guard_name), Not Null
created_atTIMESTAMPNullable
updated_atTIMESTAMPNullable

Tabel: role_has_permissions

Tabel penghubung role dan permission.

Nama KolomTipe DataAtributKeterangan
permission_idBIGINT UNSIGNEDPK (gabungan), FK (permissions.id), Not Null
role_idBIGINT UNSIGNEDPK (gabungan), FK (roles.id), Not Null

Tabel: model_has_roles

Menghubungkan role ke user (polymorphic). Di database tenant, tabel ini menentukan role user di sekolah tersebut.

Nama KolomTipe DataAtributKeterangan
role_idBIGINT UNSIGNEDPK (gabungan), FK (roles.id), Not Null
model_typeVARCHAR(191)PK (gabungan), Not Null
model_idBIGINT UNSIGNEDPK (gabungan), Not Null

Tabel: users

Akun semua pengguna sekolah (guru, siswa, wali, staff).

Nama KolomTipe DataAtributKeterangan
idBIGINT UNSIGNEDPK, Auto Increment, Not Null
nipVARCHAR(20)Unique, Nullable
first_nameVARCHAR(128)Not Null
last_nameVARCHAR(128)Nullable
mobileVARCHAR(191)Nullable
phoneVARCHAR(20)Nullable
emailVARCHAR(191)Not Null
passwordVARCHAR(191)Not Null
genderVARCHAR(16)Nullable
imageVARCHAR(512)Nullable
dobDATENullable
current_addressVARCHAR(191)Nullable
permanent_addressVARCHAR(191)Nullable
occupationVARCHAR(128)Nullable
statusTINYINTNot Null, Default 1
reset_requestTINYINTNot Null, Default 0
fcm_idVARCHAR(1024)Nullable
school_idBIGINT UNSIGNEDFK (schools.id), Nullable
languageVARCHAR(191)Not Null, Default en
remember_tokenVARCHAR(100)Nullable
email_verified_atTIMESTAMPNullable
created_atTIMESTAMPNullable
updated_atTIMESTAMPNullable
deleted_atTIMESTAMPNullable

Tabel: students

Relasi ke user lewat students.user_id, bukan students.id.

Nama KolomTipe DataAtributKeterangan
idBIGINT UNSIGNEDPK, Auto Increment, Not Null
user_idBIGINT UNSIGNEDFK (users.id), Not Null
class_idBIGINT UNSIGNEDFK (classes.id), Nullable
class_section_idBIGINT UNSIGNEDFK (class_sections.id), Nullable
billing_disabledTINYINT(1)Not Null, Default 0
billing_disabled_atTIMESTAMPNullable
billing_disabled_reasonTEXTNullable
original_class_section_idBIGINT UNSIGNEDFK (class_sections.id), Nullable
grade_level_idBIGINT UNSIGNEDFK (grade_level.id), Nullable
application_typeVARCHAR(191)Nullable, Default offline
admission_noVARCHAR(512)Not Null
nisnVARCHAR(20)Nullable
nisVARCHAR(20)Nullable
roll_numberINTNullable
admission_dateDATENot Null
school_idBIGINT UNSIGNEDFK (schools.id), Not Null
application_statusINTNullable, Default 11- accepted, 0- rejected
guardian_idBIGINT UNSIGNEDFK (users.id), Not Null
session_year_idBIGINT UNSIGNEDFK (session_years.id), Not Null
created_atTIMESTAMPNullable
updated_atTIMESTAMPNullable
deleted_atTIMESTAMPNullable

Tabel: staffs

Data staff (TU, Bendahara, Humas, dan lainnya). Kolom salary bertipe DOUBLE, bukan DECIMAL.

Nama KolomTipe DataAtributKeterangan
idBIGINT UNSIGNEDPK, Auto Increment, Not Null
user_idBIGINT UNSIGNEDFK (users.id), Not Null
qualificationVARCHAR(512)Nullable
salaryDOUBLENot Null, Default 0
joining_dateDATENullable
created_atTIMESTAMPNullable
updated_atTIMESTAMPNullable

Tabel: guardian_details

Data wali. Terhubung ke users lewat user_id.

Nama KolomTipe DataAtributKeterangan
idBIGINT UNSIGNEDPK, Auto Increment, Not Null
user_idBIGINT UNSIGNEDFK (users.id), Not Null
nama_waliVARCHAR(191)Not Null
tahun_lahir_waliVARCHAR(191)Not Null
jenjang_pendidikan_waliVARCHAR(191)Not Null
pekerjaan_waliVARCHAR(191)Not Null
penghasilan_waliVARCHAR(191)Not Null
NIK_waliVARCHAR(191)Not Null
created_atTIMESTAMPNullable
updated_atTIMESTAMPNullable

Tabel: subject_teachers

Penugasan guru ke mata pelajaran dan kelas. teacher_id menunjuk ke users.id.

Nama KolomTipe DataAtributKeterangan
idBIGINT UNSIGNEDPK, Auto Increment, Not Null
class_section_idBIGINT UNSIGNEDFK (class_sections.id), Not Null
subject_idBIGINT UNSIGNEDFK (subjects.id), Not Null
teacher_idBIGINT UNSIGNEDFK (users.id), Not Nulluser_id
class_subject_idBIGINT UNSIGNEDFK (class_subjects.id), Not Null
school_idBIGINT UNSIGNEDFK (schools.id), Not Null
created_atTIMESTAMPNullable
updated_atTIMESTAMPNullable
deleted_atTIMESTAMPNullable

Di dump tidak ada tabel user_relation. Relasi wali dan siswa tersimpan lewat students.guardian_id (FK ke users.id) dan guardian_details.user_id. Jika user_relation masih dipakai di kode, kemungkinan tabelnya hanya ada di database central.

4. Generate otomatis dari database

Script scripts/generate-kamus-data.mjs membaca information_schema dan menulis halaman kamus-data.mdx berisi:

  • ERD Mermaid dari foreign key yang ada di database,
  • tabel kamus data tiap tabel (tipe, atribut PK/FK/Unique/Not Null/Default, dan keterangan dari COLUMN_COMMENT).

Halaman Kamus Data saat ini dibuat dari dump database tenant sekolah 87, dengan format yang sama. Jalankan ulang script di bawah setelah skema berubah.

Atur koneksi lewat environment variable

export DB_HOST=127.0.0.1 DB_PORT=3306
export DB_USER=root DB_PASSWORD=
export DB_NAME=eschool_school

Jalankan script

npm run docs:db

Rapikan hasilnya

Buka content/docs/kamus-data.mdx, lalu isi kolom Keterangan yang masih kosong. Dari 1762 kolom, baru 113 yang punya COMMENT di database. Supaya keterangan otomatis terisi di generate berikutnya, tambahkan ->comment('...') di migration.

Jalankan hanya di database development. Jangan taruh kredensial production di terminal atau di repository.

Mengisi keterangan langsung dari migration:

$table->string('nis')->unique()->comment('Nomor induk siswa');
$table->foreignId('user_id')->comment('FK ke users.id');

5. Langkah inisialisasi database

Menggunakan migrasi dan seeder (Laravel)

# buat tabel database central
php artisan migrate

# isi data awal
php artisan db:seed

Untuk database tenant, jalankan migration dengan koneksi school:

php artisan migrate --database=school --path=database/migrations/tenant

Sesuaikan path migration tenant dengan struktur project yang sebenarnya.

Menggunakan file SQL (dump)

# membuat dump
mysqldump -u root -p eschool_school > database/schema.sql

# import
mysql -u root -p eschool_school < database/schema.sql

Dump database sekolah berisi data pribadi (siswa, wali, akun pengguna). Jangan commit dump berdata ke repository. Untuk dokumentasi atau repo, buat dump struktur saja dengan mysqldump --no-data.

6. Aturan dan konvensi

  • Nama tabel snake_case, bentuk jamak.
  • Semua perubahan skema lewat migration.
  • Jangan buat foreign key lintas database (central ke tenant). Jaga integritasnya di level aplikasi.
  • Saat menghapus siswa permanen, hapus juga baris model_has_roles terkait agar angka dashboard tidak membengkak.
  • Saat memakai upsert(), isi created_at dan updated_at.
  • Tambahkan ->comment() pada kolom di migration supaya kamus data bisa terisi otomatis.
  • Tabel password_resets tidak punya primary key. Jangan andalkan id pada tabel ini.

On this page