Data Contract: Kesepakatan Supaya Kolom Tidak Berubah Diam-diam
Blog/Tutorial SQL/Data Contract: Kesepakatan Supaya Kolom Tidak Berubah Diam-diam

Data Contract: Kesepakatan Supaya Kolom Tidak Berubah Diam-diam

BimaBima
·5 November 2025·9 menit baca

Penulis

Bima

Bima

Founder & Data Professional

Bagikan

TL;DR

Data contract adalah kesepakatan tertulis antara pihak yang ngirim data dan pihak yang makai data, isinya nama kolom, tipe data, boleh kosong atau nggak, seberapa sering diperbarui, dan siapa yang bertanggung jawab. Gunanya nyegah perubahan skema yang diam-diam bikin dashboard salah. Kamu bisa mulai tanpa tool khusus: satu file YAML sebagai isi kesepakatan, dan satu query ke information_schema yang ngecek kenyataannya masih cocok.

Data contract adalah kesepakatan tertulis antara pihak yang ngirim data dan pihak yang makai data, isinya bentuk data yang dijanjikan dan konsekuensi kalau bentuknya berubah.

Ini jawaban buat masalah yang tiap analis pernah alami. Suatu pagi dashboard nampilin nol, dan setelah dua jam nyari, ternyata developer ganti kolom status dari teks jadi angka minggu lalu. Nggak ada yang salah niat. Cuma nggak ada yang tau kolom itu dipakai siapa.

Apa itu data contract?

Data contract adalah dokumen yang nyebutin secara tegas struktur data yang dijanjikan sebuah sumber: nama kolom, tipe datanya, boleh kosong atau nggak, seberapa sering diperbarui, dan siapa yang bertanggung jawab kalau ada masalah. Dokumen ini dipasangin pengecekan otomatis, jadi begitu kenyataan nggak cocok sama janji, ada yang bunyi sebelum angka salah masuk laporan.

Bedanya sama dokumentasi biasa ada di satu kata: dicek. Dokumentasi yang nggak pernah diverifikasi bakal basi diam-diam. Kontrak yang dicek tiap hari nggak bisa basi tanpa ketahuan.

Kenapa analis perlu data contract?

Tiga alasan yang paling sering muncul di kerjaan sehari-hari.

Perubahan hulu nggak keliatan sampai terlambat. Tim aplikasi ganti kolom karena alasan yang masuk akal buat mereka. Efeknya baru kerasa di ujung, di dashboard yang mereka nggak tau ada.

Kesalahannya sunyi. Kolom yang berubah dari teks ke angka jarang bikin query error. Dia bikin filter WHERE status = 'lunas' balikin nol baris, dan nol itu keliatan kayak angka yang sah.

Nggak ada yang ngaku pemilik. Tanpa kontrak, waktu ada masalah semua orang jawab "itu bukan tabel aku". Kontrak nulis satu nama di kolom pemilik.

Kontrak jaga bentuk data, sementara data quality jaga isinya. Keduanya beda kerjaan dan sama-sama perlu.

Isi data contract itu apa aja?

BagianIsinyaContoh
SkemaNama kolom, tipe, boleh kosong atau nggakstatus: text, wajib isi
Nilai yang sahDaftar isi yang diizinkanlunas, pending, batal
KesegaranBatas keterlambatan yang ditoleransiData kemarin siap sebelum jam 6 pagi
Volume wajarRentang jumlah baris harian800 sampai 2.500 baris
PemilikNama orang dan saluran kontaknyaTim kasir, kanal #data-kasir
Aturan perubahanApa yang boleh berubah dan gimana caranyaTambah kolom bebas, ganti tipe lewat versi baru

Enam bagian ini cukup buat sebagian besar tim. Jangan mulai dari template 40 kolom, isinya bakal separuh kosong dalam sebulan.

Gimana cara bikin data contract tanpa tool khusus?

Langkah 1: Tulis kontraknya sebagai file YAML

tabel: publik.transaksi
pemilik: tim-kasir
kanal: "#data-kasir"
versi: 1
kesegaran_jam: 6        # data kemarin siap sebelum jam 6 pagi
volume_harian_min: 800
volume_harian_max: 2500

kolom:
  - nama: id
    tipe: bigint
    wajib: true
  - nama: tanggal
    tipe: date
    wajib: true
  - nama: total
    tipe: numeric
    wajib: true
  - nama: status
    tipe: text
    wajib: true
    nilai_sah: [lunas, pending, batal]

aturan_perubahan:
  tambah_kolom: bebas
  ganti_tipe: butuh versi baru dan masa tumpang tindih 14 hari
  hapus_kolom: butuh versi baru dan masa tumpang tindih 14 hari

Simpan di repositori yang sama dengan query dashboardmu. File ini yang jadi rujukan waktu ada perdebatan.

Langkah 2: Cek skema nyata pakai SQL

PostgreSQL nyimpen bentuk tabel di information_schema.columns. Query ini balikin kenyataan hari ini.

SELECT column_name, data_type, is_nullable
FROM information_schema.columns
WHERE table_schema = 'publik'
  AND table_name   = 'transaksi'
ORDER BY ordinal_position;

Bandingin hasilnya sama daftar kolom di YAML. Kalau ada yang beda, kontraknya dilanggar. Rincian tiap kolom di view ini ada di dokumentasi PostgreSQL.

Langkah 3: Cek nilai yang sah dan volume

-- Nilai status di luar kesepakatan
SELECT status, COUNT(*) AS jumlah
FROM publik.transaksi
WHERE tanggal = CURRENT_DATE - 1
  AND status NOT IN ('lunas', 'pending', 'batal')
GROUP BY status;

-- Volume harian di luar rentang wajar
SELECT COUNT(*) AS baris_kemarin
FROM publik.transaksi
WHERE tanggal = CURRENT_DATE - 1;

Query pertama harus balikin nol baris. Query kedua harus jatuh di antara 800 dan 2.500.

Langkah 4: Jalanin tiap pagi

Taruh ketiga query itu di satu skrip terjadwal. Kalau ada yang gagal, kirim pesan ke kanal pemiliknya. Alarm yang bunyi jam 6 pagi jauh lebih murah dari laporan salah yang dikirim jam 4 sore.

Langkah 5: Pasang penjaga di database

Sebagian isi kontrak bisa dipaksakan langsung sama database lewat CHECK dan NOT NULL.

ALTER TABLE publik.transaksi
  ADD CONSTRAINT status_sah
  CHECK (status IN ('lunas', 'pending', 'batal'));

Ini nolak data yang salah di pintu masuk, bukan cuma ngasih tau setelah masuk. Pembahasan lengkapnya ada di artikel CONSTRAINT di SQL.

Contoh kasus: kolom status yang berubah tipe

Ini kejadian di dataset toko_berkah waktu aku bantu benerin pelaporannya.

Tim aplikasi kasir ganti kolom status dari teks jadi kode angka: 1 buat lunas, 2 buat pending, 3 buat batal. Alasannya masuk akal, hemat tempat dan lebih cepat diindeks.

Yang terjadi di hilir:

DampakRincian
Dashboard yang mati3 dari 11
Lama nggak ketahuan5 hari
Selisih omzet yang dilaporkanRp 18.600.000
Waktu ngelacak penyebabnya2 jam 20 menit

Filter WHERE status = 'lunas' nggak error. Dia cuma balikin nol baris, dan tiga dashboard nampilin omzet Rp 0 yang keliatan kayak hari sepi.

Setelah kontrak dipasang, skenario yang sama diuji ulang di lingkungan percobaan. Pengecekan skema gagal 4 jam setelah perubahan, jauh sebelum ada laporan yang keluar. Waktu ngelacaknya turun dari 2 jam 20 menit jadi 6 menit, soalnya pesan alarmnya langsung nyebut nama kolom dan nama pemiliknya.

Buat nelusurin siapa aja yang kena waktu satu tabel berubah, data lineage yang ngerjain bagian itu.

Kesalahan umum waktu bikin data contract

  • Bikin kontrak buat semua tabel. Mulai dari lima tabel yang paling banyak dipakai dashboard. Sisanya nyusul.
  • Kontrak tanpa pengecekan otomatis. Dokumen yang nggak pernah diuji bakal beda dari kenyataan dalam dua bulan.
  • Alarm yang terlalu berisik. Rentang volume yang kesempitan bikin alarm bunyi tiap hari libur. Orang bakal berhenti baca.
  • Nggak nulis nama pemilik. Alarm yang nggak jelas ditujukan ke siapa bakal dibaca semua orang dan ditindaklanjuti nol orang.
  • Ngelarang semua perubahan. Sistem hidup pasti berubah. Yang diatur caranya, bukan larangannya.
  • Nyimpen kontrak di dokumen terpisah yang jarang dibuka. Taruh sedekat mungkin sama kode yang mengandalkannya.

FAQ

Data contract itu dokumen atau kode?

Dua-duanya, dan itu justru intinya. Isinya dokumen yang bisa dibaca manusia, biasanya file YAML berisi daftar kolom beserta tipenya. Tapi file itu juga dipakai program buat ngecek kenyataan di database tiap hari. Kalau cuma jadi dokumen, dia bakal basi dalam dua bulan. Yang bikin dia hidup adalah pengecekan otomatis yang jalan tanpa diminta.

Bedanya data contract sama data quality check apa?

Data quality check nanya "isi datanya masuk akal nggak", misalnya ada berapa nilai kosong dan apakah ada harga negatif. Data contract nanya "bentuknya masih sesuai janji nggak", misalnya kolom status masih bertipe teks atau udah berubah jadi angka. Keduanya saling melengkapi. Kontrak jaga bentuknya, quality check jaga isinya.

Siapa yang harus bikin data contract di tim kecil?

Orang yang paling kesakitan kalau datanya rusak, dan itu biasanya analis. Kamu nggak perlu nunggu ada tim data engineering. Tulis kontrak buat lima tabel yang paling sering dipakai dashboard, kirim ke pemilik sistem sumbernya, lalu minta persetujuan lisan pun nggak apa-apa. Yang penting ada catatan tertulis tentang apa yang kamu andalkan.

Gimana cara nanganin perubahan yang memang harus terjadi?

Bikin aturan versi. Perubahan yang nambah kolom baru itu aman, langsung jalan. Perubahan yang ngubah tipe, ganti nama, atau ngehapus kolom harus lewat versi baru dengan masa tumpang tindih. Di tim yang aku bantu, masa tumpang tindihnya dua minggu, cukup buat semua dashboard menyesuaikan tanpa ada yang mati mendadak.

Kalau sumber datanya dari vendor luar, kontraknya gimana?

Kamu nggak bisa maksa vendor ikut aturanmu, tapi kamu tetap bisa bikin kontrak sepihak yang isinya harapanmu. Fungsinya jadi alarm: begitu ekspor dari vendor berubah bentuk, pengecekanmu langsung gagal dan kamu tau sebelum dashboard salah. Ini yang paling sering nyelametin, soalnya perubahan dari luar jarang diumumkan.

Penutup

Tiga hal yang perlu dibawa:

  1. Data contract nulis bentuk data yang dijanjikan, plus siapa yang bertanggung jawab.
  2. Yang bikin dia berguna itu pengecekan otomatis, bukan dokumennya.
  3. Mulai dari lima tabel paling penting, satu file YAML, dan tiga query.

Pilih satu tabel yang paling sering bikin dashboard-mu rusak. Tulis kontraknya sore ini, pasang query pengecek skemanya besok pagi. Itu udah nutup sebagian besar kejutan yang biasa datang.

Lanjut ke cek kualitas data pakai SQL buat ngejaga isinya, dan glossary ETL kalau kamu mau ngerti jalur datanya dulu.

Coba Langsung

Mau praktek langsung? Mulai latihan SQL gratis

Latihan interaktif, langsung di browser.

Buka NgulikSQL →
Bagikan:
Bima
Ditulis oleh

Bima

Founder & Data Professional

Founder Ngulik Data. Passionate about making data analysis accessible for everyone.

Artikel terkait

Cara Membuat Pivot Dinamis di SQL (Panduan 2026)
Tutorial SQL
19 Juli 2026•10 menit baca

Cara Membuat Pivot Dinamis di SQL (Panduan 2026)

Pivot dinamis di SQL ngubah baris jadi kolom tanpa kamu hardcode nama kolomnya. Ini cara bikinnya pakai CASE WHEN dan versi yang kolomnya ngikut data.

BimaBima
Menghitung YTD, QTD, dan MTD di SQL (Panduan 2026)
Tutorial SQL
17 Juli 2026•9 menit baca

Menghitung YTD, QTD, dan MTD di SQL (Panduan 2026)

YTD, QTD, dan MTD ngukur total dari awal tahun, kuartal, atau bulan sampai hari ini. Ini cara ngitungnya di SQL pakai DATE_TRUNC, plus satu query gabungan.

BimaBima
Gap and Island Analysis di SQL
Tutorial SQL
15 Juli 2026•10 menit baca

Gap and Island Analysis di SQL

Gap and island analysis di SQL nyari deret data yang berturut-turut (island) dan celah yang bolong (gap). Cocok buat hitung streak login atau cari tanggal transaksi yang hilang.

BimaBima
Kembali ke Blog
Ngulik Data logoNgulik Data

Platform edukasi data lengkap untuk professionals Indonesia. Belajar SQL, Data Analysis, dan lebih banyak lagi dengan praktek langsung dan feedback real-time.

© 2026 Ngulik Data. Semua hak dilindungi.

TAUTAN
BantuanHargaDatasetBlogAfiliasi
LEGAL
Syarat & KetentuanKebijakan Privasi
Ngulik Data
DatasetLeaderboardBlogStore