πŸ“Š Data Modelling
πŸŽ“ Pertemuan
Pertemuan 10: Data Quality, Integrity & Governance

MODUL PERTEMUAN 10

DATA QUALITY, INTEGRITY, DAN GOVERNANCE


A. INFORMASI UMUM MATA KULIAH

ItemKeterangan
Mata KuliahData Modelling
Kode MKSSD1019
Bobot3 SKS (Praktikum)
Semester4 (Empat)
Program StudiSains Data
FakultasEkonomi dan Bisnis Islam
UniversitasUIN K.H. Abdurrahman Wahid Pekalongan
Dosen PengampuMohammad Reza Maulana, M.Kom

B. INFORMASI PERTEMUAN

B.1 Sub-CPMK Pertemuan 10

Sub-CPMK 6.1: Mahasiswa mampu menerapkan prinsip-prinsip kualitas data, integritas data, dan tata kelola data dalam perancangan dan implementasi model data, termasuk menyusun data dictionary yang komprehensif sebagai dokumentasi resmi sistem database.

B.2 Tujuan Pembelajaran (Learning Objectives)

Setelah mengikuti pertemuan ini, mahasiswa akan mampu:

  1. Menjelaskan enam dimensi kualitas data (accuracy, completeness, consistency, timeliness, validity, uniqueness) dan mengidentifikasi pelanggaran setiap dimensi dari contoh data nyata (C2 – Memahami)
  2. Membedakan empat jenis integritas data (entity, referential, domain, user-defined) dan mekanisme penegakannya di level database, aplikasi, dan proses bisnis (C2 – Memahami)
  3. Menganalisis dataset yang diberikan untuk mengidentifikasi masalah kualitas data beserta akar penyebab dan dampaknya (C4 – Menganalisis)
  4. Menyusun data dictionary yang lengkap dan profesional untuk skema database yang diberikan (C3 – Mengaplikasikan)
  5. Menjelaskan konsep dasar data governance β€” termasuk data ownership, stewardship, kebijakan akses, dan ketentuan hukum yang relevan di Indonesia (C2 – Memahami)
  6. Mengevaluasi dampak kualitas data terhadap proses analisis dan pemodelan dalam konteks sains data (C5 – Mengevaluasi)

B.3 Kompetensi yang Dikembangkan

DomainKompetensi
KognitifMemahami dimensi kualitas data (C2), Menganalisis masalah DQ dari dataset nyata (C4), Mengevaluasi dampak ke sains data (C5)
AfektifMengembangkan kepedulian terhadap kualitas data sebagai tanggung jawab profesional; menghargai dokumentasi sebagai investasi jangka panjang
PsikomotorikMenyusun data dictionary yang komprehensif; mengidentifikasi dan mengklasifikasikan masalah kualitas data dari dataset nyata

B.4 Indikator Pencapaian

Setelah mengikuti pertemuan ini, mahasiswa diharapkan mampu:

  1. Menyebutkan dan menjelaskan 6 dimensi kualitas data dengan contoh konkret masing-masing
  2. Mengidentifikasi minimal 5 masalah kualitas data berbeda dari dataset sampel yang diberikan
  3. Membedakan antara teknik penegakan integritas di level DB (constraint) vs level aplikasi vs level proses bisnis
  4. Menyusun data dictionary untuk minimal 3 tabel dalam format standar yang telah ditetapkan
  5. Menjelaskan peran data governance dalam mencegah masalah kualitas data secara sistemik

B.5 Alokasi Waktu

NoKegiatanDurasiKeterangan
1Pembukaan & Review Tugas Pertemuan 910 menitPembahasan singkat DDL proyek kelompok
2Aktivitas Pemantik: "Database Sudah Jadi β€” Apakah Aman?"10 menitAnalisis dataset bermasalah
3Materi 1: Dimensi Kualitas Data25 menitCeramah + analisis kasus per dimensi
4Materi 2: Empat Jenis Integritas Data & Mekanisme Penegakan20 menitCeramah + latihan identifikasi
5Break10 menit–
6Materi 3: Metadata dan Data Dictionary25 menitCeramah + praktikum menyusun DD
7Materi 4: Data Governance β€” Tata Kelola Data15 menitCeramah + diskusi
8Materi 5: Dampak Kualitas Data terhadap Sains Data15 menitStudi kasus + diskusi kelompok
9Review, Kuis Penutup & Briefing Tugas15 menitKuis + penjelasan tugas data dictionary
Total145 menit(+ 10 menit buffer)

C. MATERI PEMBELAJARAN

C.1 Aktivitas Pemantik β€” "Database Sudah Jadi, Apakah Datanya Aman?"

Instruksi (10 menit): Di pertemuan 9 kita berhasil membuat DDL script dan database sudah berjalan. Tapi apakah itu berarti data di dalamnya sudah terjamin kualitasnya? Perhatikan cuplikan data di bawah ini yang diambil dari database e-commerce yang sudah berjalan selama 6 bulan.

Cuplikan Data Tabel pelanggan (setelah 6 bulan operasional):

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ id_pelangganβ”‚ nama                 β”‚ email                       β”‚ no_telp      β”‚ tgl_lahir      β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 1           β”‚ Budi Santoso         β”‚ budi@gmail.com              β”‚ 081234567890 β”‚ 1995-03-15     β”‚
β”‚ 2           β”‚ SITI RAHAYU          β”‚ sitirahayugmail.com         β”‚ 0812-3456-78 β”‚ 1998-11-20     β”‚ ← masalah?
β”‚ 3           β”‚ Ahmad               β”‚ ahmad@yahoo.com             β”‚ +62812345678 β”‚ 1990-07-08     β”‚ ← masalah?
β”‚ 4           β”‚ Dewi Lestari         β”‚ dewi@gmail.com              β”‚ NULL         β”‚ 2025-06-15     β”‚ ← masalah?
β”‚ 5           β”‚ test                 β”‚ test@test.com               β”‚ 08000000000  β”‚ NULL           β”‚ ← masalah?
β”‚ 6           β”‚ Budi Santoso         β”‚ budi2@gmail.com             β”‚ 081234567890 β”‚ 1995-03-15     β”‚ ← masalah?
β”‚ 7           β”‚ Rizki Pratama        β”‚ rizki@gmail.com             β”‚ 08987654321  β”‚ 1988-04-22     β”‚
β”‚ 8           β”‚ aaa                  β”‚ aaa@aaa.com                 β”‚ 12345        β”‚ NULL           β”‚ ← masalah?
β”‚ 9           β”‚ Indah Permatasari    β”‚ indah@gmail.com             β”‚ 087812345678 β”‚ 2010-09-01     β”‚ ← masalah?
β”‚ 10          β”‚ Joko Widodo          β”‚ jokowi@pemerintah.go.id     β”‚ 081100000001 β”‚ 1961-06-21     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Pertanyaan Pemantik (diskusi 5 menit):

  1. Identifikasi sebanyak mungkin masalah data yang kamu temukan dalam tabel ini!
  2. Apakah constraint DDL yang kita buat di pertemuan 9 cukup mencegah semua masalah ini?
  3. Masalah mana yang paling berbahaya jika data ini digunakan untuk analisis?
  4. Siapa yang seharusnya bertanggung jawab atas kualitas data ini β€” developer, DBA, atau siapa?

Rangkuman Dosen: "Constraint di DDL adalah lapisan pertama pertahanan, tapi bukan satu-satunya. Database yang secara teknis 'valid' bisa tetap berisi data yang secara bisnis 'sampah'. Itulah mengapa kita perlu memahami data quality secara holistik β€” bukan hanya dari sudut pandang teknis, tapi juga dari sudut pandang bisnis dan tata kelola organisasi."


C.2 Materi 1: Dimensi Kualitas Data

Kualitas data bukan konsep tunggal β€” ia memiliki enam dimensi yang masing-masing mengukur aspek berbeda dari "kebenaran" sebuah data. Sebuah dataset bisa sempurna dalam satu dimensi namun gagal total di dimensi lain.

C.2.1 Enam Dimensi Kualitas Data

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    6 DIMENSI KUALITAS DATA                                β”‚
β”‚                  (Data Quality Framework β€” DAMA/ISO 8000)                 β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Dimensi          β”‚ Definisi                    β”‚ Contoh Pelanggaran        β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 1. ACCURACY      β”‚ Data benar-benar             β”‚ tgl_lahir = 2025-06-15   β”‚
β”‚ (Akurasi)        β”‚ merepresentasikan realitas  β”‚ (tanggal di masa depan)  β”‚
β”‚                  β”‚ β€” nilai sesuai kenyataan    β”‚ nama = "Joko Santoso"    β”‚
β”‚                  β”‚                             β”‚ tapi orangnya "Ahmad"    β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 2. COMPLETENESS  β”‚ Semua data yang diperlukan  β”‚ no_telp = NULL padahal   β”‚
β”‚ (Kelengkapan)    β”‚ ada dan tidak ada nilai     β”‚ wajib diisi untuk notif  β”‚
β”‚                  β”‚ yang hilang                 β”‚ Nama hanya "Ahmad" tanpa β”‚
β”‚                  β”‚                             β”‚ nama belakang            β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 3. CONSISTENCY   β”‚ Data yang sama dinyatakan   β”‚ Format no_telp campur:   β”‚
β”‚ (Konsistensi)    β”‚ dengan cara yang sama di   β”‚ "081234", "+62812", "812" β”‚
β”‚                  β”‚ seluruh sistem              β”‚ Nama ada yang Title Case, β”‚
β”‚                  β”‚                             β”‚ ada yang UPPERCASE       β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 4. TIMELINESS    β”‚ Data tersedia tepat waktu   β”‚ Data pelanggan diperbarui β”‚
β”‚ (Ketepatan       β”‚ dan mencerminkan kondisi   β”‚ setahun sekali β†’ alamat  β”‚
β”‚ Waktu)           β”‚ terkini yang dibutuhkan     β”‚ sudah tidak relevan       β”‚
β”‚                  β”‚                             β”‚ Harga produk tidak       β”‚
β”‚                  β”‚                             β”‚ diperbarui saat promo    β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 5. VALIDITY      β”‚ Data sesuai format, tipe,   β”‚ Email tanpa "@"          β”‚
β”‚ (Validitas)      β”‚ dan range yang telah        β”‚ No KTP hanya 10 digit    β”‚
β”‚                  β”‚ ditetapkan                  β”‚ Rating = 7 (seharusnya   β”‚
β”‚                  β”‚                             β”‚ 1–5 saja)                β”‚
β”‚                  β”‚                             β”‚ Nama = "test", "aaa"     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 6. UNIQUENESS    β”‚ Tidak ada data yang         β”‚ Pelanggan terdaftar dua  β”‚
β”‚ (Keunikan)       β”‚ terduplikasi secara tidak   β”‚ kali dengan email berbeda β”‚
β”‚                  β”‚ semestinya                  β”‚ Transaksi muncul dua kali β”‚
β”‚                  β”‚                             β”‚ karena double processing  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

C.2.2 Dimensi Kualitas Data β€” Pendalaman dengan Contoh Nyata

1. ACCURACY (Akurasi)

Accuracy adalah dimensi yang paling sulit divalidasi secara teknis karena membutuhkan verifikasi terhadap "dunia nyata" β€” sesuatu yang tidak bisa dilakukan DBMS secara otomatis.

MASALAH ACCURACY YANG UMUM:
  β†’ Data diinput dengan salah (typo, salah baca formulir)
  β†’ Data sudah benar saat diinput tapi realitasnya berubah:
    - Alamat pelanggan (pindah rumah)
    - Status pernikahan (berubah)
    - Jabatan karyawan (promosi/mutasi)
  β†’ Data yang masuk akal tapi salah:
    - Gaji = 50.000 (harusnya 5.000.000)
    - Umur = 200 (harusnya 20)

CARA MENDETEKSI:
  βœ“ Range check: CHECK (tgl_lahir < CURRENT_DATE)
  βœ“ Cross-validation dengan sumber lain (verifikasi KTP, dll.)
  βœ“ Statistical outlier detection di level aplikasi atau pipeline ETL
  βœ“ Audit berkala terhadap sampel data

CARA MENCEGAH:
  βœ“ Validasi input di level aplikasi (bukan hanya DB)
  βœ“ Double-entry verification untuk data kritis
  βœ“ Audit trail: siapa mengubah apa, kapan
  βœ“ Proses update data berkala (data refresh)

2. COMPLETENESS (Kelengkapan)

PERBEDAAN PENTING: NULL yang "Sah" vs NULL yang "Masalah"

  NULL yang SAH:
    tgl_kembali DATE NULL  ← NULL berarti "belum dikembalikan" (semantik bisnis)
    tgl_menikah DATE NULL  ← NULL berarti "belum menikah"
    no_fax VARCHAR NULL    ← Tidak semua orang/perusahaan punya fax

  NULL yang BERMASALAH:
    nama VARCHAR NOT NULL β†’ tapi data lama ada yang "" (string kosong)
    email VARCHAR NOT NULL β†’ ada yang "N/A" atau "tidak punya"
    β†’ String kosong lolos NOT NULL constraint!

COMPLETENESS BUKAN HANYA SOAL NULL:
  β†’ String kosong ("") β‰  NULL β€” keduanya berbeda, keduanya bisa bermasalah
  β†’ Kolom ada isinya tapi isinya tidak bermakna:
    nama = "-", "xxx", "tidak diketahui"
  β†’ Kolom wajib dalam konteks bisnis tapi tidak di-constraint di DB:
    Misal: untuk pengiriman, alamat lengkap wajib ada

CARA MENGUKUR COMPLETENESS:
  SELECT
    COUNT(*) AS total_baris,
    SUM(CASE WHEN nama IS NULL OR nama = '' THEN 1 ELSE 0 END) AS nama_kosong,
    SUM(CASE WHEN email IS NULL OR email = '' THEN 1 ELSE 0 END) AS email_kosong,
    ROUND(100.0 * SUM(CASE WHEN email IS NULL THEN 1 ELSE 0 END) / COUNT(*), 2)
        AS pct_email_null
  FROM pelanggan;

3. CONSISTENCY (Konsistensi)

DUA JENIS KONSISTENSI:

A. Konsistensi Intra-Tabel (dalam satu tabel):
   β†’ Format yang tidak seragam dalam kolom yang sama
   
   CONTOH: Kolom no_telp dengan berbagai format:
   +─────────────────────────────┐
   β”‚ 081234567890                β”‚
   β”‚ 0812-3456-7890              β”‚  ← berbeda format
   β”‚ +62 812 3456 7890           β”‚  ← berbeda format
   β”‚ 62812345678                 β”‚  ← tidak ada leading 0
   β”‚ (021) 555-1234              β”‚  ← nomor tetap, bukan HP
   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
   
   Saat mau filter pelanggan dengan prefix "0812":
   WHERE no_telp LIKE '0812%'
   β†’ Hanya menemukan format pertama dan kedua! Baris 3, 4, 5 terlewat.

B. Konsistensi Inter-Tabel (antar tabel atau antar sistem):
   β†’ Data yang sama dinyatakan berbeda di tempat berbeda
   
   CONTOH:
   Tabel KARYAWAN: jabatan = "Manajer Keuangan"
   Tabel PAYROLL : jabatan = "Finance Manager"
   β†’ Apakah ini orang/jabatan yang sama? Tidak bisa dipastikan!
   
   Solusi: Gunakan tabel referensi (master data) untuk jabatan,
           simpan jabatan_id FK ke tabel JABATAN β€” konsisten!

CARA MENEGAKKAN KONSISTENSI FORMAT:
  βœ“ Gunakan ENUM untuk nilai terbatas (status, jenis, kategori)
  βœ“ Normalisasi format di level aplikasi sebelum INSERT
    (UPPER(), LOWER(), TRIM(), regex replacement)
  βœ“ Gunakan tabel referensi (master data) untuk data terstandar
  βœ“ CHECK constraint dengan REGEXP (terbatas)

4. TIMELINESS (Ketepatan Waktu)

DATA YANG "BENAR" KEMARIN BISA "SALAH" HARI INI:

Contoh nyata:
  Sistem CRM menyimpan alamat pelanggan saat pertama mendaftar.
  Tiga tahun kemudian, 40% pelanggan sudah pindah alamat.
  Tim marketing mengirim brosur β†’ 40% tidak sampai.

Dimensi timeliness mencakup:
  β†’ CURRENCY: Seberapa baru data terakhir diperbarui?
  β†’ LATENCY : Berapa lama jeda antara kejadian di dunia nyata
               dengan data tersimpan di database?
  β†’ FRESHNESS: Apakah data cukup segar untuk use case saat ini?

SOLUSI UMUM:
  βœ“ Audit columns: created_at, updated_at di setiap tabel
  βœ“ Proses validasi data berkala (periodic data cleansing)
  βœ“ Konfirmasi data saat ada interaksi: "Apakah alamat Anda masih sama?"
  βœ“ SLA untuk refresh data: "Data diperbarui setiap 24 jam"
  βœ“ Data expiry policy: Tandai data yang sudah terlalu lama tidak diperbarui

5. VALIDITY (Validitas)

VALIDITY: DATA HARUS SESUAI ATURAN YANG DITETAPKAN

Level-level validasi:

Level 1 β€” FORMAT:
  Email harus mengandung "@" dan "."
  Nomor KTP harus 16 digit
  Kode pos Indonesia harus 5 digit angka

Level 2 β€” RANGE / DOMAIN:
  Usia harus antara 0 dan 150
  Rating antara 1 dan 5
  Persentase antara 0 dan 100
  Tanggal lahir harus di masa lalu

Level 3 β€” REFERENTIAL:
  id_kategori di tabel PRODUK harus ada di tabel KATEGORI
  (ini yang dijaga FK constraint)

Level 4 β€” BUSINESS RULE:
  Tanggal selesai proyek harus setelah tanggal mulai
  Pelanggan di bawah 18 tahun tidak boleh beli produk tertentu
  Stok tidak boleh negatif

CARA MENEGAKKAN VALIDITY:
  βœ“ Level DB   : CHECK constraint, FK constraint, ENUM, NOT NULL
  βœ“ Level App  : Validasi di form/API sebelum data masuk ke DB
  βœ“ Level ETL  : Data profiling dan cleaning saat ingestion
  βœ“ Level Audit: Monitoring otomatis dan alerting

6. UNIQUENESS (Keunikan)

MASALAH DUPLIKASI DATA β€” LEBIH UMUM DARI YANG DIKIRA

Penyebab duplikasi:
  β†’ Double-submit form (user klik tombol dua kali)
  β†’ Retry mekanisme di sistem yang gagal di tengah jalan
  β†’ Multiple entry points: web + mobile + admin panel
  β†’ Migrasi data dari sistem lama
  β†’ Integrasi data dari beberapa sumber

JENIS DUPLIKASI:
  1. Exact duplicate  : Semua kolom identik (paling mudah dideteksi)
  2. Near-duplicate   : Beda tipis: "Budi Santoso" vs "Budi Santoso "
                        (ada spasi di akhir) β€” sama tapi tidak exact match
  3. Logical duplicate: email berbeda tapi orangnya sama
                        budi@gmail.com vs budi.santoso@gmail.com

CARA MENDETEKSI DUPLIKASI:
  -- Mencari baris dengan kombinasi nilai yang duplikat
  SELECT nama, email, tgl_lahir, COUNT(*) AS jumlah
  FROM pelanggan
  GROUP BY nama, email, tgl_lahir
  HAVING COUNT(*) > 1;

CARA MENCEGAH:
  βœ“ UNIQUE constraint pada kolom atau kombinasi kolom yang harus unik
  βœ“ Idempotency key di API: setiap request punya ID unik,
    request yang sama tidak diproses dua kali
  βœ“ Deduplication check sebelum INSERT
  βœ“ Master Data Management (MDM) untuk data shared antar sistem

C.2.3 Interaksi Antar Dimensi

Keenam dimensi tidak berdiri sendiri β€” mereka saling berkaitan dan seringkali masalah di satu dimensi menyebabkan masalah di dimensi lain.

CONTOH RANTAI MASALAH:

Masalah CONSISTENCY (format no_telp berbeda-beda)
       ↓
Menyebabkan masalah UNIQUENESS (tidak bisa deteksi duplikasi)
       ↓
Menyebabkan masalah ACCURACY (laporan jumlah pelanggan unik salah)
       ↓
Menyebabkan keputusan bisnis yang keliru

CONTOH LAIN:

Masalah TIMELINESS (data alamat tidak diperbarui)
       ↓
Menyebabkan masalah ACCURACY (alamat sudah tidak benar)
       ↓
Menyebabkan masalah COMPLETENESS dari sudut pandang bisnis
  (data "ada" tapi tidak berguna untuk pengiriman)

C.3 Materi 2: Empat Jenis Integritas Data dan Mekanisme Penegakannya

Integritas data adalah properti yang memastikan data akurat, konsisten, dan dapat dipercaya sepanjang siklus hidupnya. Ada empat jenis integritas yang harus dijaga bersama.

C.3.1 Empat Jenis Integritas Data

1. ENTITY INTEGRITY (Integritas Entitas)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  Aturan: Setiap baris dalam tabel harus dapat diidentifikasi secara unik.
          Primary Key TIDAK BOLEH NULL dan harus UNIK.

  Mekanisme: PRIMARY KEY constraint (otomatis NOT NULL + UNIQUE)
  
  Contoh pelanggaran:
  β†’ Dua baris dengan id_produk yang sama
  β†’ id_produk = NULL
  
  Penegakan: DBMS secara otomatis menolak INSERT/UPDATE yang melanggar PK.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

2. REFERENTIAL INTEGRITY (Integritas Referensial)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  Aturan: Nilai FK harus merujuk ke PK yang benar-benar ADA di tabel induk.
          Tidak boleh ada "orphan record" β€” baris anak yang merujuk
          ke induk yang sudah tidak ada.

  Mekanisme: FOREIGN KEY constraint dengan ON DELETE / ON UPDATE action
  
  Contoh pelanggaran:
  β†’ PESANAN.id_pelanggan = 999, tapi id_pelanggan = 999
    tidak ada di tabel PELANGGAN (orphan record)
  β†’ Hapus PELANGGAN yang masih punya PESANAN aktif
  
  DAMPAK ORPHAN RECORD:
    SELECT pesanan.*, pelanggan.nama
    FROM pesanan
    LEFT JOIN pelanggan ON pesanan.id_pelanggan = pelanggan.id_pelanggan;
    β†’ Baris dengan id_pelanggan = 999 akan menghasilkan NULL
      di semua kolom pelanggan β†’ laporan penjualan kacau!

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

3. DOMAIN INTEGRITY (Integritas Domain)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  Aturan: Nilai kolom harus berada dalam domain (rentang/himpunan) yang
          telah ditentukan β€” tipe data, format, range, dan daftar nilai valid.

  Mekanisme: Data type, CHECK constraint, ENUM, NOT NULL, DEFAULT
  
  Contoh pelanggaran:
  β†’ rating = 7 (padahal harus 1-5) β†’ CHECK gagal
  β†’ email tanpa "@" β†’ lolos NOT NULL tapi tidak valid bisnis
  β†’ harga = -50000 β†’ CHECK (harga >= 0) gagal
  
  LAPISAN DOMAIN INTEGRITY:
  Layer 1 - DBMS     : Tipe data, CHECK, ENUM, NOT NULL
  Layer 2 - Aplikasi : Validasi form, regex, API validation
  Layer 3 - ETL      : Data profiling, cleansing sebelum load

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

4. USER-DEFINED INTEGRITY (Integritas Business Rule)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  Aturan: Aturan bisnis spesifik yang tidak bisa di-encode sepenuhnya
          dengan constraint standar β€” membutuhkan logika tambahan.

  Mekanisme: Trigger, stored procedure, application logic
  
  Contoh business rule yang rumit:
  β†’ "Seorang karyawan tidak boleh mengajukan cuti lebih dari 12 hari
     dalam satu tahun kalender" β†’ butuh hitung SUM dari tabel CUTI
  β†’ "Stok tidak boleh dipesan melebihi stok yang tersedia"
    β†’ butuh cek stok real-time saat ORDER dibuat
  β†’ "Diskon 15% hanya berlaku untuk member yang bergabung lebih dari 1 tahun"
    β†’ butuh hitung selisih tanggal bergabung
  
  IMPLEMENTASI VIA TRIGGER (contoh cek stok):
  
  DELIMITER $$
  CREATE TRIGGER before_insert_order_item
  BEFORE INSERT ON item_pesanan
  FOR EACH ROW
  BEGIN
    DECLARE stok_tersedia INT;
    SELECT stok INTO stok_tersedia
    FROM produk WHERE id_produk = NEW.id_produk;
    
    IF NEW.qty > stok_tersedia THEN
      SIGNAL SQLSTATE '45000'
      SET MESSAGE_TEXT = 'Stok tidak mencukupi!';
    END IF;
  END$$
  DELIMITER ;

C.3.2 Di Mana Menegakkan Integritas? Tiga Lapisan Pertahanan

DATABASE LAYER (Lapisan 1 β€” Paling kuat):
  Penegak: MySQL/PostgreSQL engine
  Tools  : PK, FK, UNIQUE, CHECK, ENUM, NOT NULL, TRIGGER
  Kelebihan:
    βœ“ Tidak bisa di-bypass dari jalur manapun (web, mobile, API, direct SQL)
    βœ“ Terpusat β€” satu aturan untuk semua akses
    βœ“ Otomatis β€” tidak bergantung pada developer mengingat aturan
  Kelemahan:
    βœ— Pesan error dari DB seringkali tidak user-friendly
    βœ— Beberapa business rule terlalu kompleks untuk di-constraint di DB
    βœ— Cross-table validation lebih sulit (butuh trigger)

APPLICATION LAYER (Lapisan 2 β€” Fleksibel):
  Penegak: Backend framework (Laravel, Spring, Django, dll.)
  Tools  : Form validation, API validation, regex, business logic
  Kelebihan:
    βœ“ Bisa memberikan pesan error yang user-friendly
    βœ“ Bisa implementasi business rule yang sangat kompleks
    βœ“ Bisa validasi multi-step (cek ketersediaan, hitung diskon, dll.)
  Kelemahan:
    βœ— Bisa di-bypass jika ada jalur akses langsung ke DB
    βœ— Harus diimplementasikan di setiap aplikasi yang mengakses DB
    βœ— Rentan terhadap bug developer

PROCESS LAYER (Lapisan 3 β€” Kompensasi):
  Penegak: Manusia, SOP, audit berkala, ETL pipeline
  Tools  : Review proses, periodic data audit, anomaly detection
  Kelebihan:
    βœ“ Bisa menangkap masalah yang tidak bisa dideteksi otomatis
    βœ“ Bisa menangani kasus edge yang tidak terprediksi
  Kelemahan:
    βœ— Lambat dan mahal
    βœ— Tidak konsisten (bergantung pada manusia)
    βœ— Setelah data masuk DB, memperbaikinya lebih sulit

PRINSIP: Defense in Depth
  Idealnya, semua tiga lapisan aktif.
  Jangan mengandalkan hanya satu lapisan.
  "Constraint di DB adalah jaring pengaman terakhir, bukan satu-satunya."

C.3.3 Mekanisme Penegakan Referential Integrity β€” Revisited

SKENARIO NYATA: SISTEM MANAJEMEN PROYEK

Tabel: PROYEK (id_proyek, nama, anggaran, id_manajer*)
       KARYAWAN (id_karyawan, nama, ...)
       TUGAS (id_tugas, deskripsi, id_proyek*, id_karyawan*)

SKENARIO 1: Manajer mengundurkan diri
  β†’ Apakah boleh hapus data karyawan yang menjadi manajer proyek aktif?
  β†’ ON DELETE RESTRICT pada PROYEK.id_manajer:
     Tidak bisa hapus sebelum proyek ditutup atau manajer diganti.
  
SKENARIO 2: Proyek dihapus (dibatalkan)
  β†’ Apakah semua tugas dalam proyek harus ikut dihapus?
  β†’ ON DELETE CASCADE pada TUGAS.id_proyek:
     Semua tugas otomatis terhapus saat proyeknya dihapus.
  
SKENARIO 3: Karyawan dipindah departemen tapi tetap di kantor
  β†’ Tugasnya tetap harus ada, tapi id_karyawan berubah?
  β†’ id_karyawan tidak berubah (surrogate key stabil) β†’ tidak masalah
  β†’ Tapi jika natural key (nama) yang berubah β†’ ON UPDATE CASCADE memperbarui
    semua FK yang merujuk ke karyawan tersebut secara otomatis

PEMAHAMAN MENDALAM: RESTRICT vs NO ACTION
  Keduanya menolak DELETE/UPDATE jika masih ada child rows.
  Perbedaan: RESTRICT = cek SEBELUM statement dieksekusi
             NO ACTION = cek SETELAH semua statement dalam transaksi selesai
  Praktis di MySQL: Keduanya berperilaku sama untuk single statement.
  Relevan di PostgreSQL: NO ACTION memungkinkan UPDATE dalam transaksi
  multi-statement yang lebih kompleks.

C.4 Materi 3: Metadata dan Data Dictionary

C.4.1 Tiga Jenis Metadata

Kita pertama kali mengenal metadata di pertemuan 1 sebagai "data tentang data". Kini saatnya memahami jenisnya secara lebih terstruktur.

TIGA JENIS METADATA:

1. TECHNICAL METADATA (Metadata Teknis)
   Mendeskripsikan struktur fisik dan teknis dari data.
   
   Isi:
   β†’ Nama tabel dan kolom
   β†’ Tipe data setiap kolom
   β†’ Constraint (PK, FK, UNIQUE, NOT NULL, CHECK)
   β†’ Index dan storage engine
   β†’ Relasi antar tabel
   
   Contoh: Dokumentasi DDL, schema diagram, INFORMATION_SCHEMA di MySQL
   Siapa yang butuh: DBA, developer, data engineer

2. BUSINESS METADATA (Metadata Bisnis)
   Mendeskripsikan makna bisnis dan konteks dari data.
   
   Isi:
   β†’ Definisi bisnis setiap kolom dalam bahasa non-teknis
   β†’ Pemilik data (data owner) dan penanggung jawab (steward)
   β†’ Aturan bisnis yang berlaku
   β†’ Kriteria kualitas data
   β†’ Frekuensi pembaruan
   
   Contoh: Data dictionary, business glossary, data catalog
   Siapa yang butuh: Business analyst, data scientist, manajer, auditor

3. OPERATIONAL METADATA (Metadata Operasional)
   Mendeskripsikan bagaimana data digunakan dan dikelola.
   
   Isi:
   β†’ Data lineage: Data ini berasal dari mana?
   β†’ Riwayat perubahan (audit trail, change log)
   β†’ Statistik penggunaan: Tabel mana yang paling sering di-query?
   β†’ Hasil profiling: Berapa persen NULL? Distribusi nilai?
   β†’ Jadwal refresh dan ETL history
   
   Contoh: Audit log, INFORMATION_SCHEMA.TABLE_STATISTICS, ETL logs
   Siapa yang butuh: Data engineer, DBA, compliance officer

C.4.2 Data Dictionary β€” Pengertian dan Fungsi

APA ITU DATA DICTIONARY?

Data Dictionary (DD) adalah dokumen terstruktur yang berfungsi sebagai
"kamus resmi" dari seluruh data yang ada dalam sistem database.

Ia menjadi single source of truth untuk:
  β†’ "Apa arti kolom status di tabel pesanan?"
  β†’ "Siapa yang boleh mengubah data harga produk?"
  β†’ "Nilai apa saja yang valid untuk kolom jenis_anggota?"
  β†’ "Dari mana data ini berasal (lineage)?"
  β†’ "Kapan terakhir tabel ini diperbarui?"

MENGAPA DATA DICTIONARY PENTING?

Tanpa DD:
  β†’ Developer baru butuh berminggu-minggu memahami struktur DB
  β†’ Nama kolom ambigu: apakah "status" di tabel A sama dengan
    "status" di tabel B?
  β†’ Data scientist tidak tahu arti kolom β†’ analisis bisa keliru
  β†’ Saat ada bug: tidak ada referensi untuk memahami aturan bisnis yang benar

Dengan DD:
  β†’ Onboarding anggota tim baru lebih cepat
  β†’ Analisis data lebih akurat (konteks jelas)
  β†’ Komunikasi antar tim lebih efektif (bahasa yang sama)
  β†’ Compliance dan audit lebih mudah (dokumentasi tersedia)
  β†’ Evolusi sistem lebih aman (dampak perubahan bisa dianalisis)

SIAPA YANG MEMBUAT DAN MEMELIHARA DD?
  β†’ Data modeller / database architect: membuat DD awal
  β†’ DBA: memastikan DD sinkron dengan struktur DB
  β†’ Business analyst: mengisi definisi bisnis
  β†’ Data steward: memelihara dan memperbarui DD secara berkelanjutan

C.4.3 Format Standar Data Dictionary

Data dictionary yang komprehensif beroperasi di dua level: level tabel dan level kolom.

Level Tabel:

╔══════════════════════════════════════════════════════════════════════════╗
β•‘                        DATA DICTIONARY β€” LEVEL TABEL                    β•‘
╠════════════════════════╦═════════════════════════════════════════════════╣
β•‘ Atribut               β•‘ Nilai                                            β•‘
╠════════════════════════╬═════════════════════════════════════════════════╣
β•‘ Nama Tabel            β•‘ peminjaman                                       β•‘
╠════════════════════════╬═════════════════════════════════════════════════╣
β•‘ Skema / Database      β•‘ perpustakaan                                     β•‘
╠════════════════════════╬═════════════════════════════════════════════════╣
β•‘ Deskripsi Bisnis      β•‘ Menyimpan riwayat lengkap setiap transaksi       β•‘
β•‘                       β•‘ peminjaman buku oleh anggota perpustakaan,       β•‘
β•‘                       β•‘ termasuk tanggal pinjam, rencana kembali,        β•‘
β•‘                       β•‘ tanggal aktual kembali, dan denda keterlambatan. β•‘
╠════════════════════════╬═════════════════════════════════════════════════╣
β•‘ Pemilik Data          β•‘ Divisi Perpustakaan β€” Bagian Sirkulasi           β•‘
β•‘ (Data Owner)          β•‘                                                  β•‘
╠════════════════════════╬═════════════════════════════════════════════════╣
β•‘ Penanggung Jawab      β•‘ Kepala Bagian Sirkulasi                          β•‘
β•‘ (Data Steward)        β•‘                                                  β•‘
╠════════════════════════╬═════════════════════════════════════════════════╣
β•‘ Frekuensi Pembaruan   β•‘ Real-time (setiap ada transaksi pinjam/kembali)  β•‘
╠════════════════════════╬═════════════════════════════════════════════════╣
β•‘ Retensi Data          β•‘ Disimpan selamanya (riwayat permanen); arsip     β•‘
β•‘                       β•‘ ke tabel historis setelah 5 tahun               β•‘
╠════════════════════════╬═════════════════════════════════════════════════╣
β•‘ Sumber Data           β•‘ Sistem Perpustakaan Online, input petugas        β•‘
╠════════════════════════╬═════════════════════════════════════════════════╣
β•‘ Estimasi Jumlah Baris β•‘ ~50.000 baris/tahun (asumsi 200 peminjaman/hari) β•‘
╠════════════════════════╬═════════════════════════════════════════════════╣
β•‘ Business Rules        β•‘ 1. Satu anggota hanya boleh meminjam 3 buku     β•‘
β•‘                       β•‘    secara bersamaan                              β•‘
β•‘                       β•‘ 2. Masa pinjam standar: 7 hari                  β•‘
β•‘                       β•‘ 3. Denda keterlambatan: Rp 500/hari/buku        β•‘
β•‘                       β•‘ 4. Anggota tidak aktif tidak boleh meminjam     β•‘
╠════════════════════════╬═════════════════════════════════════════════════╣
β•‘ Tabel Terkait         β•‘ anggota (FK: id_anggota)                        β•‘
β•‘                       β•‘ buku (FK: id_buku)                               β•‘
╠════════════════════════╬═════════════════════════════════════════════════╣
β•‘ Dibuat Tanggal        β•‘ 2025-08-01                                       β•‘
╠════════════════════════╬═════════════════════════════════════════════════╣
β•‘ Terakhir Diperbarui   β•‘ 2026-02-20                                       β•‘
╠════════════════════════╬═════════════════════════════════════════════════╣
β•‘ Versi                 β•‘ 1.2                                              β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•©β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

Level Kolom:

╔═══════════════╦══════════════════╦══════╦══════╦════════╦═══════════════════════════════════════════╗
β•‘ Nama Kolom    β•‘ Tipe Data        β•‘ NULL β•‘ Key  β•‘Default β•‘ Deskripsi Bisnis & Aturan                 β•‘
╠═══════════════╬══════════════════╬══════╬══════╬════════╬═══════════════════════════════════════════╣
β•‘ id_pinjam     β•‘ INT UNSIGNED     β•‘ NO   β•‘ PK   β•‘ AUTO   β•‘ Nomor identifikasi unik setiap transaksi  β•‘
β•‘               β•‘ AUTO_INCREMENT   β•‘      β•‘      β•‘        β•‘ peminjaman. Surrogate key yang dibuat     β•‘
β•‘               β•‘                  β•‘      β•‘      β•‘        β•‘ sistem secara otomatis.                   β•‘
╠═══════════════╬══════════════════╬══════╬══════╬════════╬═══════════════════════════════════════════╣
β•‘ id_anggota    β•‘ INT UNSIGNED     β•‘ NO   β•‘ FK   β•‘ –      β•‘ Referensi ke anggota yang meminjam.       β•‘
β•‘               β•‘                  β•‘      β•‘      β•‘        β•‘ Wajib diisi (total participation).        β•‘
β•‘               β•‘                  β•‘      β•‘      β•‘        β•‘ ON DELETE RESTRICT: Anggota tidak bisa    β•‘
β•‘               β•‘                  β•‘      β•‘      β•‘        β•‘ dihapus jika masih punya riwayat pinjam.  β•‘
╠═══════════════╬══════════════════╬══════╬══════╬════════╬═══════════════════════════════════════════╣
β•‘ id_buku       β•‘ INT UNSIGNED     β•‘ NO   β•‘ FK   β•‘ –      β•‘ Referensi ke buku yang dipinjam.          β•‘
β•‘               β•‘                  β•‘      β•‘      β•‘        β•‘ ON DELETE RESTRICT: Buku tidak bisa       β•‘
β•‘               β•‘                  β•‘      β•‘      β•‘        β•‘ dihapus jika masih punya riwayat pinjam.  β•‘
╠═══════════════╬══════════════════╬══════╬══════╬════════╬═══════════════════════════════════════════╣
β•‘ tgl_pinjam    β•‘ DATE             β•‘ NO   β•‘ –    β•‘CURRENT β•‘ Tanggal buku dipinjam. Default ke         β•‘
β•‘               β•‘                  β•‘      β•‘      β•‘_DATE   β•‘ tanggal hari ini jika tidak diisi.        β•‘
β•‘               β•‘                  β•‘      β•‘      β•‘        β•‘ Tidak bisa diubah setelah buku dipinjam.  β•‘
╠═══════════════╬══════════════════╬══════╬══════╬════════╬═══════════════════════════════════════════╣
β•‘ tgl_rencana   β•‘ DATE             β•‘ NO   β•‘ –    β•‘ –      β•‘ Tanggal yang dijadwalkan untuk             β•‘
β•‘ _kembali      β•‘                  β•‘      β•‘      β•‘        β•‘ pengembalian. Dihitung otomatis:           β•‘
β•‘               β•‘                  β•‘      β•‘      β•‘        β•‘ tgl_pinjam + masa_pinjam (dari tabel       β•‘
β•‘               β•‘                  β•‘      β•‘      β•‘        β•‘ JENIS_ANGGOTA). Harus > tgl_pinjam.       β•‘
╠═══════════════╬══════════════════╬══════╬══════╬════════╬═══════════════════════════════════════════╣
β•‘ tgl_kembali   β•‘ DATE             β•‘ YES  β•‘ –    β•‘ NULL   β•‘ Tanggal aktual buku dikembalikan.         β•‘
β•‘ _aktual       β•‘                  β•‘      β•‘      β•‘        β•‘ NULL berarti buku BELUM dikembalikan.     β•‘
β•‘               β•‘                  β•‘      β•‘      β•‘        β•‘ Hanya diisi saat buku dikembalikan.       β•‘
β•‘               β•‘                  β•‘      β•‘      β•‘        β•‘ Nilai valid: >= tgl_pinjam.               β•‘
╠═══════════════╬══════════════════╬══════╬══════╬════════╬═══════════════════════════════════════════╣
β•‘ denda         β•‘ DECIMAL(10,2)    β•‘ NO   β•‘ –    β•‘ 0.00   β•‘ Total denda keterlambatan dalam Rupiah.   β•‘
β•‘               β•‘                  β•‘      β•‘      β•‘        β•‘ Dihitung: (tgl_kembali_aktual –           β•‘
β•‘               β•‘                  β•‘      β•‘      β•‘        β•‘ tgl_rencana_kembali) Γ— Rp500.             β•‘
β•‘               β•‘                  β•‘      β•‘      β•‘        β•‘ Harus >= 0. Default 0 jika tidak          β•‘
β•‘               β•‘                  β•‘      β•‘      β•‘        β•‘ terlambat.                                β•‘
╠═══════════════╬══════════════════╬══════╬══════╬════════╬═══════════════════════════════════════════╣
β•‘ status        β•‘ ENUM             β•‘ NO   β•‘ –    β•‘'dipinjamβ•‘ Status terkini transaksi peminjaman.     β•‘
β•‘               β•‘ ('dipinjam',     β•‘      β•‘      β•‘'       β•‘ dipinjam    : buku sedang di tangan      β•‘
β•‘               β•‘ 'dikembalikan',  β•‘      β•‘      β•‘        β•‘              anggota                     β•‘
β•‘               β•‘ 'terlambat')     β•‘      β•‘      β•‘        β•‘ dikembalikan: sudah kembali tepat waktu  β•‘
β•‘               β•‘                  β•‘      β•‘      β•‘        β•‘ terlambat   : sudah kembali tapi          β•‘
β•‘               β•‘                  β•‘      β•‘      β•‘        β•‘              melewati tenggat, atau       β•‘
β•‘               β•‘                  β•‘      β•‘      β•‘        β•‘              belum kembali & sudah lewat  β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•©β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•©β•β•β•β•β•β•β•©β•β•β•β•β•β•β•©β•β•β•β•β•β•β•β•β•©β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

C.4.4 Cara Mengakses Metadata Teknis di MySQL

MySQL menyimpan metadata teknis secara otomatis di database internal bernama INFORMATION_SCHEMA. Kita bisa query metadata ini seperti query tabel biasa.

-- Melihat semua tabel dalam database tertentu
SELECT TABLE_NAME, TABLE_ROWS, TABLE_COMMENT, CREATE_TIME, UPDATE_TIME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'perpustakaan'
ORDER BY TABLE_NAME;
 
-- Melihat detail kolom dari tabel tertentu
SELECT
    COLUMN_NAME,
    COLUMN_TYPE,
    IS_NULLABLE,
    COLUMN_KEY,
    COLUMN_DEFAULT,
    EXTRA,
    COLUMN_COMMENT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'perpustakaan'
  AND TABLE_NAME   = 'peminjaman'
ORDER BY ORDINAL_POSITION;
 
-- Melihat semua constraint (FK) dalam database
SELECT
    CONSTRAINT_NAME,
    TABLE_NAME,
    COLUMN_NAME,
    REFERENCED_TABLE_NAME,
    REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = 'perpustakaan'
  AND REFERENCED_TABLE_NAME IS NOT NULL
ORDER BY TABLE_NAME;
 
-- Melihat semua index dalam database
SELECT
    TABLE_NAME,
    INDEX_NAME,
    COLUMN_NAME,
    NON_UNIQUE,
    INDEX_TYPE
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'perpustakaan'
ORDER BY TABLE_NAME, INDEX_NAME;

C.5 Materi 4: Data Governance β€” Tata Kelola Data

C.5.1 Apa Itu Data Governance?

DATA GOVERNANCE adalah sistem kerangka kerja yang mendefinisikan:
  SIAPA  yang berhak membuat keputusan tentang data
  APA    keputusan yang perlu dibuat
  BAGAIMANA keputusan tersebut dibuat dan dieksekusi

Governance bukan hanya soal teknologi β€” ini tentang:
  β†’ Orang: Roles, tanggung jawab, akuntabilitas
  β†’ Proses: Kebijakan, prosedur, standar
  β†’ Teknologi: Tools untuk penegakan kebijakan

TANPA DATA GOVERNANCE:
  β†’ Setiap developer mendefinisikan kolom "status" berbeda
  β†’ Tidak ada yang tahu apakah data pelanggan boleh dilihat tim marketing
  β†’ Data breach terjadi tanpa ada yang bertanggung jawab
  β†’ Regulasi dilanggar tanpa disadari

DENGAN DATA GOVERNANCE:
  β†’ Standar yang jelas: format, naming, tipe data
  β†’ Jalur persetujuan jelas saat ada perubahan skema
  β†’ Kontrol akses terstruktur: siapa boleh baca/ubah/hapus
  β†’ Kepatuhan regulasi terjamin secara sistemik

C.5.2 Peran Kunci dalam Data Governance

1. DATA OWNER (Pemilik Data)
   β†’ Pejabat senior yang secara bisnis bertanggung jawab
     atas data dalam domain tertentu
   β†’ Membuat keputusan strategis: kebijakan retensi,
     siapa yang boleh akses, kapan data bisa dihapus
   β†’ Contoh: Direktur Keuangan = data owner untuk data keuangan
   
2. DATA STEWARD (Pengelola Data)
   β†’ Bertanggung jawab atas kualitas dan integritas data
     sehari-hari (lebih operasional dari Data Owner)
   β†’ Tugas: memperbarui data dictionary, memantau DQ,
     menyelesaikan masalah kualitas data
   β†’ Contoh: Kepala Divisi IT atau Data Analyst senior

3. DATA CUSTODIAN (Penjaga Data)
   β†’ Bertanggung jawab atas infrastruktur penyimpanan dan keamanan data
   β†’ Tugas: backup, recovery, access control, enkripsi
   β†’ Contoh: Database Administrator (DBA)

4. DATA CONSUMER (Pengguna Data)
   β†’ Menggunakan data untuk kebutuhan bisnis atau analisis
   β†’ Wajib menggunakan data sesuai kebijakan yang ditetapkan
   β†’ Contoh: Data Scientist, Business Analyst, Manajer

HUBUNGAN ANTAR PERAN:
  Data Owner β†’ menetapkan kebijakan
       ↓
  Data Steward β†’ memastikan kebijakan dijalankan, menjaga kualitas
       ↓
  Data Custodian β†’ mengimplementasikan keamanan teknis
       ↓
  Data Consumer β†’ menggunakan data sesuai kebijakan

C.5.3 Kebijakan-Kebijakan Penting dalam Data Governance

1. KEBIJAKAN AKSES DATA (Data Access Policy)
   β†’ Siapa boleh baca, siapa boleh ubah, siapa boleh hapus?
   β†’ Prinsip Least Privilege: berikan akses minimum yang diperlukan
   
   Implementasi di MySQL:
   -- Buat user dengan akses terbatas
   CREATE USER 'analyst_team'@'%' IDENTIFIED BY 'password';
   GRANT SELECT ON perpustakaan.* TO 'analyst_team'@'%';
   -- Analyst hanya bisa SELECT, tidak bisa INSERT/UPDATE/DELETE
   
   CREATE USER 'app_backend'@'localhost' IDENTIFIED BY 'password';
   GRANT SELECT, INSERT, UPDATE ON perpustakaan.* TO 'app_backend'@'localhost';
   REVOKE DELETE ON perpustakaan.* FROM 'app_backend'@'localhost';
   -- Aplikasi backend bisa baca/tulis tapi tidak bisa hapus

2. KEBIJAKAN RETENSI DATA (Data Retention Policy)
   β†’ Berapa lama data disimpan? Kapan data bisa/harus dihapus?
   
   Contoh kebijakan umum:
   β†’ Data transaksi    : Disimpan 10 tahun (untuk audit perpajakan)
   β†’ Log aplikasi      : Disimpan 90 hari (kemudian dihapus otomatis)
   β†’ Data pelanggan    : Disimpan selama pelanggan aktif + 2 tahun
   β†’ Data anak di bawah umur: Khusus β€” lihat UU Perlindungan Anak
   
   Implementasi: Scheduled job/cron yang menghapus atau mengarsip
   data sesuai kebijakan.

3. KEBIJAKAN PERUBAHAN SKEMA (Schema Change Policy)
   β†’ Perubahan struktur tabel (ALTER TABLE) harus melalui:
     a. Review dan persetujuan (code review atau DBA review)
     b. Diuji di environment development/staging
     c. Memperbarui data dictionary setelah perubahan
     d. Komunikasi ke semua stakeholder yang terdampak
   β†’ Jangan pernah langsung ALTER TABLE di production
     tanpa proses review!

4. KEBIJAKAN BACKUP DAN RECOVERY
   β†’ Full backup: berapa kali? Disimpan di mana? Berapa lama?
   β†’ Point-in-time recovery: bisa recovery ke titik waktu tertentu?
   β†’ Recovery Time Objective (RTO): berapa lama boleh downtime?
   β†’ Recovery Point Objective (RPO): berapa lama data boleh hilang?

C.5.4 Regulasi yang Relevan di Konteks Indonesia

DATA GOVERNANCE DI INDONESIA β€” KERANGKA REGULASI

1. UU NO. 27 TAHUN 2022 β€” PERLINDUNGAN DATA PRIBADI (PDP)
   Berlaku efektif Oktober 2024.
   
   Yang harus diperhatikan:
   β†’ Data pribadi: nama, alamat, email, no. KTP, no. HP, tgl_lahir, dll.
   β†’ Harus ada dasar hukum untuk memproses data pribadi
     (persetujuan, kepentingan sah, kontrak, dll.)
   β†’ Hak subjek data: hak akses, koreksi, hapus, portabilitas
   β†’ Wajib melindungi data dengan langkah teknis dan organisasional
   β†’ Wajib melapor jika terjadi kebocoran data dalam 14 hari
   
   Dampak pada desain database:
   β†’ Enkripsi untuk data sensitif (tgl_lahir, no_KTP, dll.)
   β†’ Kemampuan untuk "melupakan" (delete) data pengguna jika diminta
   β†’ Audit trail: log siapa mengakses data pribadi siapa
   β†’ Anonimisasi untuk keperluan analisis (tidak perlu identitas asli)

2. UU ITE (UU NO. 11/2008 diubah UU NO. 19/2016)
   β†’ Mengatur penggunaan data elektronik
   β†’ Larang akses tanpa izin ke sistem elektronik
   β†’ Relevan untuk desain sistem autentikasi dan otorisasi

3. STANDAR ISO 27001 β€” INFORMATION SECURITY MANAGEMENT
   Internasional, banyak perusahaan Indonesia mengadopsi:
   β†’ Manajemen risiko keamanan informasi
   β†’ Kontrol akses, enkripsi, audit
   β†’ Relevan untuk organisasi yang menangani data sensitif dalam volume besar

IMPLIKASI PRAKTIS UNTUK DATA MODELLING:
  βœ“ Identifikasi kolom yang berisi data pribadi di data dictionary
  βœ“ Pertimbangkan enkripsi untuk kolom sensitif (no_KTP, password)
  βœ“ Desain mekanisme untuk soft-delete (jangan hapus permanent, tapi
    tandai is_deleted = 1 untuk audit trail)
  βœ“ Rencanakan anonimisasi: hapus nama/email tapi simpan data transaksinya
  βœ“ Dokumentasikan tujuan pengumpulan setiap data pribadi di data dictionary

C.6 Materi 5: Dampak Kualitas Data terhadap Sains Data

C.6.1 Prinsip GIGO β€” Garbage In, Garbage Out

"GARBAGE IN, GARBAGE OUT"
  Jika data yang masuk ke model ML atau analisis statistik berkualitas
  buruk, maka output yang dihasilkan pun tidak dapat dipercaya β€”
  tidak peduli seberapa canggih algoritmanya.

ESTIMASI INDUSTRI:
  β†’ Data scientist menghabiskan 60–80% waktu mereka
    untuk data cleaning dan preparation
  β†’ Bukan karena mereka suka β€” tapi karena kualitas data
    yang sampai ke tangan mereka seringkali buruk
  β†’ Inilah mengapa data modelling yang baik DAN data governance
    yang kuat sangat berharga: mencegah masalah di hulu
    jauh lebih murah daripada membersihkan di hilir

C.6.2 Dampak per Dimensi Kualitas terhadap Analisis

ACCURACY β†’ Model yang Menyesatkan
  Contoh kasus:
  Sebuah startup fintech menggunakan model ML untuk
  prediksi risiko kredit. Kolom "penghasilan" ternyata
  ada yang diisi dalam satuan juta (5 = Rp5.000.000)
  dan ada yang diisi dalam satuan rupiah (5000000).
  
  Akibat: Model "belajar" dari data yang campur aduk β†’
  prediksi risiko kredit keliru β†’ bank memberi pinjaman
  ke profil yang salah β†’ kerugian finansial nyata.

COMPLETENESS β†’ Bias dalam Analisis
  Contoh kasus:
  Riset kepuasan pelanggan: 30% data "rating" bernilai NULL
  (responden tidak menjawab). Jika NULL diabaikan (di-drop),
  analisis hanya mencakup 70% yang menjawab.
  
  Masalah: Pelanggan yang tidak puas cenderung tidak mau
  mengisi rating β†’ NULL bukan random, ada polanya (selection bias).
  Analisis "rata-rata rating" yang mengabaikan NULL
  secara sistematis lebih tinggi dari kenyataannya.

CONSISTENCY β†’ Segmentasi yang Salah
  Contoh kasus:
  Analisis segmentasi pelanggan berdasarkan kota.
  Kolom kota_asal berisi: "Jakarta", "jakarta", "JAKARTA",
  "Dki Jakarta", "DKI Jakarta", "Kota Jakarta".
  
  Akibat: Setiap variasi dianggap sebagai kota berbeda β†’
  segmen "Jakarta" tampak kecil β†’ rekomendasi bisnis keliru
  (misalnya: tidak buka cabang baru di Jakarta karena
  terlihat sedikit pelanggan).

TIMELINESS β†’ Rekomendasi yang Usang
  Contoh kasus:
  Sistem rekomendasi produk menggunakan riwayat pembelian
  pelanggan. Data tidak diperbarui secara real-time.
  
  Akibat: Sistem merekomendasikan produk yang sudah
  dibeli kemarin, atau promosi yang sudah berakhir minggu lalu.
  Pengalaman pengguna buruk.

VALIDITY β†’ False Patterns
  Contoh kasus:
  Dataset transaksi berisi tanggal "2099-12-31" untuk
  transaksi yang gagal diproses sistem (default error date).
  
  Akibat: Analisis tren transaksi per tahun menunjukkan
  "lonjakan transaksi di tahun 2099" β†’ anomali yang membingungkan.
  Jika tidak dideteksi, bisa mengacaukan model forecasting.

UNIQUENESS β†’ Hitung yang Salah
  Contoh kasus:
  Laporan "jumlah pelanggan unik" untuk meeting direksi:
  laporan menunjukkan 50.000 pelanggan. Padahal setelah
  deduplication ditemukan hanya 35.000 pelanggan unik
  (15.000 adalah duplikat dari berbagai sumber).
  
  Akibat: Seluruh strategi ekspansi berbasis data yang salah.
  Target "1 juta pelanggan" sebenarnya baru 70% tercapai,
  bukan 100%.

C.6.3 Mekanisme Deteksi Masalah Kualitas Data β€” SQL Queries

-- ============================================================
-- TOOLKIT DATA QUALITY ASSESSMENT
-- ============================================================
 
-- 1. CEK COMPLETENESS β€” Hitung persentase NULL per kolom
SELECT
    'nama'    AS kolom,
    COUNT(*)  AS total,
    SUM(CASE WHEN nama IS NULL OR nama = '' THEN 1 ELSE 0 END) AS nilai_kosong,
    ROUND(100.0 * SUM(CASE WHEN nama IS NULL OR nama = '' THEN 1 ELSE 0 END)
          / COUNT(*), 2) AS persen_kosong
FROM pelanggan
UNION ALL
SELECT 'email', COUNT(*),
    SUM(CASE WHEN email IS NULL OR email = '' THEN 1 ELSE 0 END),
    ROUND(100.0 * SUM(CASE WHEN email IS NULL OR email = '' THEN 1 ELSE 0 END)
          / COUNT(*), 2)
FROM pelanggan
UNION ALL
SELECT 'no_telp', COUNT(*),
    SUM(CASE WHEN no_telp IS NULL THEN 1 ELSE 0 END),
    ROUND(100.0 * SUM(CASE WHEN no_telp IS NULL THEN 1 ELSE 0 END)
          / COUNT(*), 2)
FROM pelanggan;
 
-- 2. CATUR VALIDITY β€” Cari email yang tidak mengandung '@'
SELECT id_pelanggan, nama, email
FROM pelanggan
WHERE email NOT LIKE '%@%'
   OR email NOT LIKE '%.%';
 
-- 3. CEK VALIDITY β€” Tanggal di masa depan
SELECT id_pelanggan, nama, tgl_lahir
FROM pelanggan
WHERE tgl_lahir > CURRENT_DATE
   OR tgl_lahir < '1900-01-01';  -- juga cek yang tidak masuk akal
 
-- 4. CEK UNIQUENESS β€” Temukan baris duplikat
SELECT nama, email, tgl_lahir, COUNT(*) AS jumlah_duplikat
FROM pelanggan
GROUP BY nama, email, tgl_lahir
HAVING COUNT(*) > 1
ORDER BY jumlah_duplikat DESC;
 
-- 5. CEK CONSISTENCY β€” Deteksi variasi format no_telp
SELECT no_telp, COUNT(*) AS jumlah
FROM pelanggan
WHERE no_telp IS NOT NULL
GROUP BY
    CASE
        WHEN no_telp LIKE '08%'     THEN '08... (format lokal)'
        WHEN no_telp LIKE '+62%'    THEN '+62... (format internasional)'
        WHEN no_telp LIKE '62%'     THEN '62... (tanpa +)'
        WHEN no_telp REGEXP '^[0-9-() ]+$' THEN 'Format campuran angka'
        ELSE 'Format tidak dikenal'
    END
ORDER BY jumlah DESC;
 
-- 6. PROFILING CEPAT β€” Nilai unik dan distribusi (contoh: status pesanan)
SELECT status, COUNT(*) AS jumlah,
    ROUND(100.0 * COUNT(*) / SUM(COUNT(*)) OVER(), 2) AS persentase
FROM pesanan
GROUP BY status
ORDER BY jumlah DESC;
 
-- 7. CEK DATA YANG "MENCURIGAKAN" (test data masuk production)
SELECT id_pelanggan, nama, email
FROM pelanggan
WHERE LOWER(nama) IN ('test', 'aaa', 'xxx', 'demo', 'admin', 'user')
   OR LOWER(email) LIKE '%test%'
   OR LOWER(email) LIKE '%demo%';
 
-- 8. CEK TIMELINESS β€” Baris yang belum diperbarui dalam 1 tahun
SELECT id_pelanggan, nama, updated_at,
    DATEDIFF(CURRENT_DATE, updated_at) AS hari_sejak_update
FROM pelanggan
WHERE updated_at < DATE_SUB(CURRENT_DATE, INTERVAL 1 YEAR)
ORDER BY updated_at ASC;

D. LATIHAN DAN DISKUSI

D.1 Latihan Identifikasi Masalah Kualitas Data (Individual, 15 menit)

Dataset Latihan: Tabel produk dari Sistem E-Commerce

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ id_produk β”‚ nama_produk              β”‚ harga     β”‚ stok β”‚ id_kategoriβ”‚ status         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 1         β”‚ Laptop ASUS VivoBook 14  β”‚ 7500000   β”‚ 15   β”‚ 1          β”‚ aktif          β”‚
β”‚ 2         β”‚ laptop asus              β”‚ 7500000   β”‚ 15   β”‚ 1          β”‚ aktif          β”‚ ← ?
β”‚ 3         β”‚ Mouse Wireless Logitech  β”‚ 0         β”‚ 8    β”‚ 2          β”‚ aktif          β”‚ ← ?
β”‚ 4         β”‚ Keyboard Mechanical      β”‚ 350000    β”‚ -3   β”‚ 2          β”‚ aktif          β”‚ ← ?
β”‚ 5         β”‚ Monitor LG 24"           β”‚ NULL      β”‚ 5    β”‚ 2          β”‚ AKTIF          β”‚ ← ?
β”‚ 6         β”‚ SSD Kingston 1TB         β”‚ 850000    β”‚ 20   β”‚ 99         β”‚ aktif          β”‚ ← ?
β”‚ 7         β”‚ Headphone Sony           β”‚ 450000    β”‚ 0    β”‚ 3          β”‚ nonaktif       β”‚
β”‚ 8         β”‚ webcam hd 1080p logitech β”‚ 45.0000   β”‚ 12   β”‚ 3          β”‚ aktif          β”‚ ← ?
β”‚ 9         β”‚ RAM Corsair 16GB DDR4    β”‚ 650000    β”‚ 7    β”‚ 2          β”‚ aktif          β”‚
β”‚ 10        β”‚ test produk              β”‚ 1         β”‚ 0    β”‚ 1          β”‚ aktif          β”‚ ← ?
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Tugas:

  1. Identifikasi setiap masalah kualitas data yang ada. Isi tabel berikut:
Baris (id)Masalah yang DitemukanDimensi DQDampak jika DibiarkanSaran Perbaikan
  1. Mana masalah yang seharusnya bisa dicegah dengan constraint DDL yang tepat? Constraint apa yang dimaksud?

  2. Mana masalah yang TIDAK bisa dicegah dengan constraint DDL dan butuh penanganan di lapisan lain?


D.2 Praktikum: Menyusun Data Dictionary (Kelompok, 20 menit)

Instruksi: Gunakan DDL script proyek kelompok yang dibuat di pertemuan 9. Pilih 2 tabel terpenting dari proyek kelompok, lalu susun data dictionary lengkap menggunakan format standar yang telah diajarkan.

Format yang harus diisi:

Untuk setiap tabel:

  1. Tabel-level dictionary: Nama tabel, deskripsi bisnis, data owner, steward, frekuensi update, retensi, business rules
  2. Kolom-level dictionary: Untuk setiap kolom β€” tipe data, nullable, key type, default, deskripsi bisnis yang jelas (minimal 2 kalimat), nilai valid (jika ENUM), aturan bisnis khusus

Pertanyaan diskusi setelah praktikum:

  1. Kolom mana yang paling sulit untuk dideskripsikan? Mengapa?
  2. Adakah kolom yang setelah dideskripsikan, kamu menyadari seharusnya di-redesain?
  3. Business rules apa yang kamu temukan saat menyusun DD yang belum ter-encode di DDL?

D.3 Diskusi Kelompok: "The Cost of Poor Data Quality" (10 menit)

Studi Kasus: Data Dosen yang Tidak Konsisten

Universitas X memiliki sistem akademik yang sudah berjalan 10 tahun. Beberapa bulan lalu, universitas mulai membangun Dashboard Analitik Akademik untuk memantau produktivitas penelitian, beban mengajar, dan kinerja program studi.

Tim data science memulai analisis dan menemukan:

  • Nama dosen tersimpan dalam berbagai format: "Dr. Ahmad, M.Pd.", "Ahmad", "Dr Ahmad MPd", "AHMAD"
  • NIP sebagian diisi dengan strip ("-"), sebagian kosong, sebagian diisi lengkap 18 digit
  • Kolom jabatan berisi 47 variasi teks berbeda untuk jabatan yang pada dasarnya hanya ada 5 jenis
  • Data kehadiran mengajar memiliki 23% nilai NULL
  • Beberapa dosen muncul dengan dua ID berbeda karena pernah diinput ulang setelah resign dan bergabung kembali

Pertanyaan Diskusi:

  1. Berapa lama waktu yang dibutuhkan tim data science untuk "membersihkan" data ini sebelum bisa dianalisis? Estimasi!
  2. Jika analisis tetap dijalankan tanpa membersihkan data, apa risiko terbesarnya?
  3. Apa kesalahan desain yang seharusnya dicegah dari awal? (Kaitkan dengan materi hari ini)
  4. Siapa yang seharusnya bertanggung jawab atas kondisi data seperti ini?

E. EVALUASI DAN PENILAIAN

E.1 Kuis Penutup (10 menit, bobot partisipasi)

  1. Sebutkan 6 dimensi kualitas data dan berikan satu contoh pelanggaran untuk setiap dimensi!

  2. Seorang developer berkata: "Data quality bukan masalah saya β€” saya sudah pasang NOT NULL dan CHECK constraint di DDL." Apa yang salah dengan pernyataan ini? Berikan argumen dengan contoh nyata!

  3. Apa perbedaan antara Data Owner, Data Steward, dan Data Custodian? Dalam konteks program studi Sains Data UIN Pekalongan, siapa yang cocok menjadi masing-masing peran tersebut?

  4. Mengapa data dictionary dianggap sebagai "investasi jangka panjang"? Apa yang terjadi jika data dictionary tidak diperbarui setelah ada perubahan skema?

  5. Seorang data scientist menemukan bahwa 35% baris di tabel transaksi memiliki nilai NULL di kolom id_pelanggan. Apakah ini masalah kualitas data? Dimension apa yang terlanggar? Bagaimana cara menginvestigasinya lebih lanjut?

E.2 Tugas: Data Dictionary Proyek Kelompok

Judul: Data Dictionary Komprehensif β€” Proyek Kelompok

Deskripsi: Kelompok menyusun data dictionary lengkap untuk semua tabel dalam proyek mereka.

Deliverables:

Bagian 1 β€” Data Dictionary Tabel-Level Untuk setiap tabel, isi format standar:

  • Nama tabel, skema/database, deskripsi bisnis
  • Data Owner (nama/jabatan fiktif yang logis)
  • Data Steward
  • Frekuensi pembaruan data
  • Kebijakan retensi
  • Business rules yang berlaku (minimal 3 per tabel)
  • Tabel-tabel yang berelasi

Bagian 2 β€” Data Dictionary Kolom-Level Untuk setiap kolom di setiap tabel:

  • Nama kolom, tipe data, nullable, key type, nilai default
  • Deskripsi bisnis dalam bahasa non-teknis (minimal 2 kalimat)
  • Nilai valid (terutama untuk ENUM dan kolom terbatas)
  • Aturan bisnis khusus
  • Catatan tambahan (misalnya: semantik NULL, format yang diharapkan)

Bagian 3 β€” Data Quality Assessment Bayangkan database sudah berjalan 6 bulan:

  • Identifikasi 5 potensi masalah kualitas data yang paling mungkin terjadi untuk domain proyek kelompok kamu
  • Untuk setiap potensi masalah: dimensi DQ yang terlanggar, penyebab yang mungkin, dampaknya, dan rekomendasi pencegahan
  • Tulis minimal 3 query SQL untuk mendeteksi masalah-masalah tersebut

Bagian 4 β€” Catatan Data Governance

  • Identifikasi kolom-kolom yang berisi data pribadi (sesuai UU PDP)
  • Rekomendasikan level akses untuk 3 peran pengguna berbeda (admin, staff, analyst)
  • Tuliskan minimal 2 kebijakan data governance yang relevan untuk domain proyek kamu

Format File:

  • DataDictionary_[KelompokX]_[Domain].pdf (min. 8 halaman)

Deadline: H-1 sebelum pertemuan 11 (dikumpulkan via Ngaji UIN Gusdur)


F. PERSIAPAN PERTEMUAN 11

F.1 Topik Pertemuan 11

Pengantar Data Warehouse & Analytical Modelling β€” transisi besar dari OLTP (sistem operasional) ke OLAP (sistem analitik). Pertemuan ini membuka babak baru: bagaimana data dari sistem operasional yang sudah kita rancang (pertemuan 1–10) bisa dimanfaatkan untuk analisis skala besar.

Topik yang akan dibahas:

  • OLTP vs OLAP: perbedaan fundamental dalam tujuan, skema, dan pola query
  • Konsep Data Warehouse: subject-oriented, integrated, time-variant, non-volatile
  • Data Mart sebagai subset domain-specific dari Data Warehouse
  • Proses ETL: Extract, Transform, Load β€” menjembatani OLTP dan OLAP
  • Mengapa skema yang sudah ternormalisasi di OLTP perlu didepormalisasi di OLAP

F.2 Pertanyaan Pemantik untuk Pertemuan 11

Bayangkan sistem e-commerce Toko Batik Online yang sudah dibangun:

  • Sistem OLTP menyimpan setiap transaksi secara real-time
  • Setelah 2 tahun, tabel pesanan memiliki 500.000 baris
  • Manajer ingin laporan: "Tren penjualan per kategori produk per bulan selama 2 tahun terakhir, dibandingkan dengan target penjualan"

Query untuk laporan ini membutuhkan JOIN 5 tabel dan agregasi 500.000 baris.

Pikirkan:

  1. Apakah query seperti ini sebaiknya dijalankan langsung di database OLTP yang sedang dipakai customer berbelanja?
  2. Jika tidak, apa solusinya?
  3. Bagaimana struktur data yang ideal untuk pertanyaan analitik seperti itu?

G. REFERENSI

G.1 Referensi Utama

  1. Redman, T. C. (2008). Data Driven: Profiting from Your Most Important Business Asset. Harvard Business School Press.

    • Chapter 3: The Many Dimensions of Data Quality (bacaan utama β€” dimensi DQ)
    • Chapter 7: Building the Data Quality System
  2. Elmasri, R. & Navathe, S. B. (2015). Fundamentals of Database Systems (7th Edition). Pearson.

    • Chapter 5: The Relational Data Model β€” Integrity Constraints
    • Chapter 24: Data Warehousing, OLAP, and Data Mining (pengantar)
  3. Loshin, D. (2010). The Practitioner's Guide to Data Quality Improvement. Morgan Kaufmann.

    • Panduan praktis komprehensif tentang DQ dari perspektif industri
  4. DAMA International. (2017). DAMA-DMBOK: Data Management Body of Knowledge (2nd Edition). Technics Publications.

    • Standar internasional untuk manajemen data, termasuk DQ dan Governance

G.2 Regulasi dan Standar

  1. Undang-Undang No. 27 Tahun 2022 tentang Perlindungan Data Pribadi (PDP)
  2. ISO 8000 β€” Data Quality Standard
  3. ISO/IEC 27001 β€” Information Security Management

G.3 Referensi Online

  1. DAMA UK. "The Six Primary Dimensions for Data Quality Assessment" β€” https://www.dama.org (opens in a new tab)
  2. IBM Data Management. "Data Governance" β€” https://www.ibm.com/topics/data-governance (opens in a new tab)
  3. Great Expectations. Open-source data quality framework β€” https://greatexpectations.io (opens in a new tab)
  4. MySQL INFORMATION_SCHEMA Documentation β€” https://dev.mysql.com/doc/refman/8.0/en/information-schema.html (opens in a new tab)

G.4 Video Resources

  1. IBM Technology β€” "What is Data Governance?" (YouTube β€” penjelasan visual yang baik)
  2. Pragmatic Works β€” "Data Quality Explained" (YouTube)
  3. Kominfo / Kemkominfo β€” Sosialisasi UU PDP (YouTube β€” konteks Indonesia)

H. LAMPIRAN

Lampiran A: Template Data Dictionary β€” Format Standar

Instruksi Pengisian: Template ini digunakan untuk mendokumentasikan setiap tabel dalam database. Satu file bisa berisi multiple tabel. Perbarui setiap kali ada perubahan skema.

════════════════════════════════════════════════════════════════════
DATA DICTIONARY β€” [NAMA SISTEM / DATABASE]
Versi: [X.Y] | Terakhir Diperbarui: [YYYY-MM-DD]
Disusun oleh: [Nama] | Direview oleh: [Nama Data Steward]
════════════════════════════════════════════════════════════════════

────────────────────────────────────────────────────────────────────
TABEL: [nama_tabel]
────────────────────────────────────────────────────────────────────
Nama Tabel        : [nama_tabel]
Skema/Database    : [nama_database]
Deskripsi Bisnis  : [Jelaskan fungsi bisnis tabel ini dalam 2–4
                     kalimat. Hindari jargon teknis. Tulis seolah
                     menjelaskan kepada manajer non-teknis.]
Data Owner        : [Jabatan/divisi yang secara bisnis
                     bertanggung jawab atas data ini]
Data Steward      : [Nama/jabatan pengelola data sehari-hari]
Frekuensi Update  : [Real-time / Harian / Mingguan / Bulanan /
                     Hanya saat event tertentu]
Retensi Data      : [Berapa lama data disimpan? Kapan diarsip/hapus?]
Estimasi Volume   : [Perkiraan jumlah baris dan pertumbuhan per bulan]
Sumber Data       : [Dari mana data ini berasal: form web, API,
                     migrasi, integrasi sistem lain, dll.]
Tabel Berelasi    : [Daftar tabel yang memiliki FK ke/dari tabel ini]

Business Rules    :
  BR-001: [Aturan bisnis pertama β€” tulis dengan jelas]
  BR-002: [Aturan bisnis kedua]
  BR-003: [Aturan bisnis ketiga]
  [Tambah sesuai kebutuhan]

────────────────────────────────────────────────────────────────────
KOLOM-KOLOM:
────────────────────────────────────────────────────────────────────

Nama Kolom        : [nama_kolom]
Tipe Data         : [INT UNSIGNED / VARCHAR(n) / DECIMAL(p,s) / dll.]
Nullable          : [YES / NO]
Key Type          : [PK / FK / UNIQUE / β€” (bukan key)]
Nilai Default     : [Nilai default, atau AUTO_INCREMENT, atau β€”]
Deskripsi Bisnis  : [Penjelasan 2–4 kalimat tentang makna bisnis
                     kolom ini. Apa artinya? Bagaimana digunakan?
                     Siapa yang mengisinya?]
Nilai Valid       : [Untuk ENUM: daftar nilai dan artinya.
                     Untuk numerik: range yang valid.
                     Untuk teks: format yang diharapkan.]
Aturan Bisnis     : [Business rule spesifik untuk kolom ini
                     yang belum tertangkap oleh definisi di atas]
Catatan           : [Informasi tambahan: semantik NULL, riwayat
                     perubahan nama, hubungan dengan kolom lain, dll.]

[Ulangi blok di atas untuk setiap kolom]

────────────────────────────────────────────────────────────────────
RIWAYAT PERUBAHAN:
────────────────────────────────────────────────────────────────────
Tanggal     | Versi | Perubahan                  | Oleh
────────────┼───────┼────────────────────────────┼──────────────
[YYYY-MM-DD]| 1.0   | Versi awal                 | [Nama]
[YYYY-MM-DD]| 1.1   | Tambah kolom [nama]        | [Nama]
[YYYY-MM-DD]| 1.2   | Ubah tipe [kolom] β†’ [tipe] | [Nama]
════════════════════════════════════════════════════════════════════

Lampiran B: Checklist Data Quality Assessment

CHECKLIST PENILAIAN KUALITAS DATA
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

[ACCURACY]
β–‘ Tidak ada nilai yang secara logis tidak mungkin (mis. tgl_lahir di masa depan)
β–‘ Tidak ada nilai yang secara statistik merupakan outlier ekstrem
β–‘ Data yang berasal dari input manual telah diverifikasi/validated
β–‘ Ada mekanisme audit trail untuk mendeteksi perubahan yang tidak sah

[COMPLETENESS]
β–‘ Kolom NOT NULL tidak punya nilai kosong ("") yang lolos constraint
β–‘ Persentase NULL pada setiap kolom telah dievaluasi dan dalam batas wajar
β–‘ Tidak ada record yang missing kolom yang secara bisnis wajib diisi
β–‘ Dokumentasi ada untuk setiap kolom nullable: apa arti NULL di sini?

[CONSISTENCY]
β–‘ Format data seragam dalam satu kolom (no_telp, nama, kode, dll.)
β–‘ Nilai yang sama tidak dinyatakan berbeda di tabel berbeda
β–‘ Tidak ada konflik antar kolom dalam satu baris (mis. tgl_mulai > tgl_selesai)
β–‘ Tabel referensi (master data) ada untuk menstandarkan nilai yang berulang

[TIMELINESS]
β–‘ Semua tabel punya audit columns: created_at dan updated_at
β–‘ Frekuensi update data sesuai dengan kebutuhan bisnis
β–‘ Ada proses untuk menandai atau menonaktifkan data yang sudah kadaluarsa
β–‘ SLA refresh data terdokumentasi dan dipatuhi

[VALIDITY]
β–‘ Semua kolom dengan nilai terbatas menggunakan ENUM atau FK ke tabel referensi
β–‘ CHECK constraint ada untuk kolom numerik yang punya range logis
β–‘ Validasi format (email, nomor telepon, kode pos) ada di lapisan aplikasi
β–‘ Data uji coba (test data) tidak ada di environment production

[UNIQUENESS]
β–‘ Kolom bisnis yang harus unik punya UNIQUE constraint
β–‘ Tidak ada duplikasi baris yang terdeteksi (cek dengan GROUP BY + HAVING)
β–‘ Mekanisme idempotency ada untuk mencegah double-insert dari sistem
β–‘ Strategi deduplication ada untuk data yang masuk dari multiple sumber

[GOVERNANCE]
β–‘ Setiap tabel punya Data Owner yang jelas
β–‘ Data dictionary tersedia dan up-to-date
β–‘ Kolom yang berisi data pribadi (PII) telah diidentifikasi
β–‘ Kebijakan akses (siapa boleh baca/tulis/hapus) terdokumentasi
β–‘ Kebijakan retensi data ada dan diimplementasikan
β–‘ Mekanisme audit trail ada untuk data sensitif

Lampiran C: Contoh Query DQ Assessment Siap Pakai

-- ============================================================
-- TEMPLATE QUERY DATA QUALITY ASSESSMENT
-- Ganti nama database dan tabel sesuai kebutuhan
-- ============================================================
 
-- 1. RINGKASAN TABEL: Jumlah baris dan tanggal update
SELECT
    TABLE_NAME,
    TABLE_ROWS AS estimasi_baris,
    CREATE_TIME,
    UPDATE_TIME,
    TABLE_COMMENT
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'nama_database'
ORDER BY TABLE_ROWS DESC;
 
-- 2. COMPLETENESS REPORT: % NULL per kolom (sesuaikan nama tabel & kolom)
SELECT
    kolom,
    total_baris,
    jumlah_null,
    ROUND(100.0 * jumlah_null / total_baris, 2) AS persen_null,
    CASE
        WHEN ROUND(100.0 * jumlah_null / total_baris, 2) = 0    THEN 'βœ“ Sempurna'
        WHEN ROUND(100.0 * jumlah_null / total_baris, 2) <= 5   THEN '⚠ Perlu perhatian'
        WHEN ROUND(100.0 * jumlah_null / total_baris, 2) <= 20  THEN '⚠⚠ Bermasalah'
        ELSE 'βœ— Kritis'
    END AS status
FROM (
    SELECT 'nama' AS kolom, COUNT(*) AS total_baris,
           SUM(CASE WHEN nama IS NULL OR nama = '' THEN 1 ELSE 0 END) AS jumlah_null
    FROM pelanggan
    UNION ALL
    SELECT 'email', COUNT(*),
           SUM(CASE WHEN email IS NULL OR email = '' THEN 1 ELSE 0 END)
    FROM pelanggan
    UNION ALL
    SELECT 'no_telp', COUNT(*),
           SUM(CASE WHEN no_telp IS NULL THEN 1 ELSE 0 END)
    FROM pelanggan
) AS completeness_check
ORDER BY persen_null DESC;
 
-- 3. UNIQUENESS CHECK: Deteksi kemungkinan duplikat pelanggan
SELECT
    SOUNDEX(nama) AS nama_soundex,  -- Soundex: nama mirip meski beda ejaan
    COUNT(DISTINCT email) AS variasi_email,
    COUNT(*) AS jumlah_kemungkinan_duplikat,
    GROUP_CONCAT(email SEPARATOR ' | ') AS daftar_email
FROM pelanggan
GROUP BY SOUNDEX(nama)
HAVING COUNT(*) > 1 AND COUNT(DISTINCT email) > 1
ORDER BY jumlah_kemungkinan_duplikat DESC;
 
-- 4. VALIDITY CHECK: Data yang tidak sesuai rule bisnis
SELECT 'email_invalid' AS jenis_masalah, COUNT(*) AS jumlah
FROM pelanggan WHERE email NOT REGEXP '^[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}$'
UNION ALL
SELECT 'tgl_lahir_masa_depan', COUNT(*)
FROM pelanggan WHERE tgl_lahir > CURRENT_DATE
UNION ALL
SELECT 'tgl_lahir_terlalu_tua', COUNT(*)
FROM pelanggan WHERE tgl_lahir < '1900-01-01'
UNION ALL
SELECT 'nama_terlalu_pendek', COUNT(*)
FROM pelanggan WHERE LENGTH(TRIM(nama)) < 2;
 
-- 5. DATA PROFILING: Distribusi nilai untuk kolom kategorik
SELECT
    status,
    COUNT(*) AS jumlah,
    ROUND(100.0 * COUNT(*) / SUM(COUNT(*)) OVER (), 2) AS persen,
    REPEAT('β–ˆ', ROUND(COUNT(*) * 30 / MAX(COUNT(*)) OVER (), 0)) AS bar_chart
FROM pesanan
GROUP BY status
ORDER BY jumlah DESC;

Lampiran D: Lembar Kerja Latihan DQ Assessment

LEMBAR KERJA β€” LATIHAN DATA QUALITY ASSESSMENT
Nama  : ___________________________ NIM : _______________
Tanggal: ___________________

DATASET: Tabel produk (lihat Soal D.1)

TABEL IDENTIFIKASI MASALAH:
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ id_prodβ”‚ Masalah yang Ditemukan β”‚ Dimensi DQ   β”‚ Dampak jika Dibiarkan  β”‚ Saran Perbaikan            β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚   2    β”‚                        β”‚              β”‚                        β”‚                            β”‚
β”‚   3    β”‚                        β”‚              β”‚                        β”‚                            β”‚
β”‚   4    β”‚                        β”‚              β”‚                        β”‚                            β”‚
β”‚   5    β”‚                        β”‚              β”‚                        β”‚                            β”‚
β”‚   6    β”‚                        β”‚              β”‚                        β”‚                            β”‚
β”‚   8    β”‚                        β”‚              β”‚                        β”‚                            β”‚
β”‚  10    β”‚                        β”‚              β”‚                        β”‚                            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

PERTANYAAN ANALISIS:

1. Masalah mana yang bisa dicegah dengan constraint DDL?
   [Jawaban:]

2. Constraint DDL apa yang spesifik mencegah masing-masing masalah di atas?
   Masalah: ___________ β†’ Constraint: ___________
   Masalah: ___________ β†’ Constraint: ___________
   Masalah: ___________ β†’ Constraint: ___________

3. Masalah mana yang TIDAK bisa dicegah dengan constraint DDL saja?
   [Jawaban:]

4. Untuk masalah di nomor 3, di lapisan mana seharusnya ditangani?
   β–‘ Application layer (validasi form/API)
   β–‘ ETL/Ingestion pipeline
   β–‘ Proses manual/SOP
   β–‘ Data governance policy
   
   Jelaskan: [Jawaban:]

PENUTUP

Pertemuan 10 menandai selesainya pembahasan tentang model data operasional (OLTP) secara komprehensif β€” dari konseptual (pertemuan 3–4), logikal (5–7), fisik (9), hingga kini: kualitas dan tata kelola (10).

Key Messages Pertemuan 10:

  1. Database "valid secara teknis" β‰  data berkualitas β€” Constraint DDL adalah lapisan pertama, bukan satu-satunya. Data bisa lolos semua constraint tapi tetap salah secara bisnis ("test", tgl_lahir di masa depan, format tidak konsisten)

  2. Kualitas data adalah tanggung jawab bersama β€” bukan hanya DBA atau developer. Data owner, steward, aplikasi developer, dan pengguna akhir semuanya berperan dalam menjaga kualitas data

  3. Data dictionary adalah "kontrak" antar tim β€” tanpa dokumentasi yang jelas, setiap orang menginterpretasikan data secara berbeda, dan analisis yang dihasilkan pun berbeda

  4. Data governance adalah sistem, bukan proyek satu kali β€” governance perlu dirawat, diperbarui, dan dievaluasi secara berkelanjutan seiring berkembangnya sistem

  5. Investasi di kualitas data di hulu jauh lebih murah daripada membersihkan data di hilir saat pipeline analitik sudah jalan β€” ini adalah argumen terkuat untuk data modelling yang baik sejak awal

Koneksi ke Proyek Semester: Data dictionary yang disusun di pertemuan ini adalah komponen wajib dalam laporan proyek akhir kelompok (pertemuan 15). Kerjakan dengan serius karena ini menjadi dokumentasi resmi sistem yang akan dinilai secara keseluruhan.

Transisi ke Babak Kedua: Mulai pertemuan 11, kita memasuki babak baru: Analytical Modelling β€” bagaimana data dari sistem OLTP yang sudah kita rancang diolah untuk mendukung pengambilan keputusan berbasis data dalam skala besar.


Disusun oleh: Mohammad Reza Maulana, M.Kom Program Studi Sains Data Fakultas Ekonomi dan Bisnis Islam UIN K.H. Abdurrahman Wahid Pekalongan

Revisi: Februari 2026