Data adalah ingatan jangka panjang setiap sistem. Episode ini membahas pemodelan data dengan Entity Relationship Diagram — entitas, relasi, kardinalitas, normalisasi sampai bentuk ketiga, dan data dictionary — dipraktikkan menjadi model data lengkap TokoKita dari bahan mentah Excel cabang

Setelah di episode 8 kalian memetakan proses bisnis as-is dan to-be, saatnya memodelkan sisi yang akan menghidupi proses itu secara permanen: data. Episode ini membahas Entity Relationship Diagram (ERD), normalisasi, dan data dictionary.
Mengapa analyst harus paham data modeling padahal ada database administrator? Karena kesalahan struktur data adalah kesalahan termahal untuk diubah. Proses bisa direvisi lewat konfigurasi; UI bisa didesain ulang tiap sprint; tetapi skema yang salah — misalnya harga promo tidak punya tempat historis — akan menyisakan data kotor bertahun-tahun yang membersihkannya lebih mahal daripada membangun ulang. Model data juga bahasa komunikasi paling presisi antara analisis bisnis dan implementasi teknis.
Tiga blok dasar ERD:
Kardinalitas menjawab "berapa banyak" pada tiap sisi relasi:
| Notasi | Arti | Contoh TokoKita |
|---|---|---|
| 1 : 1 | Satu ke tepat satu | Shift : Kasir pembuka |
| 1 : N | Satu ke banyak | Kategori : Produk |
| M : N | Banyak ke banyak | Produk : Transaksi (lewat item) |
Relasi M:N selalu dipecah oleh entitas penghubung (associative entity): relasi Produk-Transaksi menjadi TransaksiItem yang menyimpan qty dan harga_saat_jual. Trik menemukan atribut tersembunyi: kalau kalian tergoda menempelkan atribut ke entitas yang salah — misal qty ditempel ke Produk — hampir pasti ia milik entitas penghubung.
Bahan mentah kita adalah file Excel cabang Denpasar. Strukturnya tipikal:
Tanggal | NoNota | Kasir | Barang | Qty | Harga | Kategori | AlamatCabang | NamaOwner
2026-07-01 | N0001 | Sinta | Indomie Goreng x2, Teh Kotak x1 | ... | ... | Makanan | Jl. Diponegoro 12 | Pak Budi
2026-07-01 | N0002 | Sinta | Beras 5kg | 1 | 68000 | Sembako | Jl. Diponegoro 12 | Pak BudiSatu lembar ini melanggar hampir semua prinsip data baik: kolom Barang berisi banyak nilai sekaligus, info cabang-owner berulang tiap baris, dan nama kasir bebas format. Normalisasi adalah proses sistematis memperbaikinya.
1NF (First Normal Form) — hilangkan grup nilai berulang; tiap sel atomik. Baris pertama pecah menjadi dua baris item:
NoNota | Tanggal | Kasir | Barang | Qty | Harga | ...
N0001 | 2026-07-01 | Sinta | Indomie | 2 | 3500
N0001 | 2026-07-01 | Sinta | Teh Kotak | 1 | 4500
N0002 | 2026-07-01 | Sinta | Beras 5kg | 1 | 680002NF — hilangkan ketergantungan parsial pada bagian composite key (misal key = NoNota + Barang): tanggal dan kasir bergantung hanya pada NoNota, bukan pada barang → pisahkan ke tabel Transaksi.
3NF — hilangkan ketergantungan transitif: alamat_cabang dan nama_owner bergantung pada cabang, bukan pada transaksi → keluarkan ke tabel Cabang. Demikian pula kategori dan harga standar keluar dari baris penjualan ke tabel Produk.
Hasil akhirnya adalah model domain TokoKita:
Perhatikan harga_saat_jual di TransaksiItem — ini contoh denormalisasi sadar: harga standar sudah ada di Produk, tapi struk harus mencatat harga pada momen transaksi agar laporan historis tidak ikut berubah saat harga naik. Normalisasi adalah default; penyimpangan harus punya alasan tertulis di decision log SDD.
Important
Uji cepat kualitas model: tanyakan lima pertanyaan operasional nyata — "berapa stok Indomie di cabang Denpasar sekarang?", "siapa yang menyesuaikan stok minggu lalu?", "berapa transaksi QRIS kemarin?" — dan cek apakah jalur jawabannya jelas lewat model tanpa menebak. Model yang tidak bisa menjawab pertanyaan bisnis inti belum selesai.
ERD memberi peta besar; data dictionary memberi definisi presisi tiap elemen — dokumen yang membuat developer dan QA tidak menebak. Format minimal per atribut:
| Field | Entitas | Tipe | Wajib | Aturan/Validasi | Catatan Bisnis |
|---|---|---|---|---|---|
| sku | Produk | varchar(32) | Ya | Unik global, huruf besar + digit | Kode fisik di rak; tak boleh reuse |
| nomor_struk | Transaksi | varchar(20) | Ya | Format: CBN-YYYYMMDD-seq | Per cabang; reset harian aman karena prefix cabang |
| status_sync | Transaksi | enum | Ya | pending / synced / conflict | Diisi modul sinkronisasi; lihat SDD 5.2 |
| qty | TransaksiItem | int | Ya | Lebih besar dari 0 | Retur dicatat sebagai transaksi retur, bukan qty negatif |
Catatan bisnis sering jadi bagian paling bernilai: aturan "retur = transaksi terpisah, bukan minus" adalah keputusan bisnis yang tanpa dictionary akan dilanggar developer tanpa sadar.
status di tiga entitas dengan isi berbeda. Gunakan nama spesifik (status_sync, status_shift) dan definisi di dictionary.Tip
Latihan lanjutan: ambil file Excel lain dari TokoKita (lembar pembelian/goods receipt) dan normalisasikan sendiri sampai 3NF. Bandingkan hasilmu dengan entitas existing — jika muncul entitas Supplier baru yang menyentuh StokCabang, kalian sedang mengalami langsung kenapa model dirancang bersama, bukan per-lembar.
Inti yang harus dibawa pulang:
Model data sudah kokoh, tetapi sistem hidup atau mati karena orang-orang di sekelilingnya. Di episode 10 selanjutnya kita membahas stakeholder management: cara mengidentifikasi pemangku kepentingan TokoKita, menyusun rencana komunikasi, dan mengelola ekspektasi yang saling bertabrakan. Pastikan tetap semangat!