SQL adalah bahasanya; database adalah rumahnya. Seorang data engineer memindahkan data antar database setiap hari, mulai dari database operasional sumber sampai data warehouse tujuan.

Tanpa pemahaman struktur tabel dan relasi, query bisa salah tanpa pesan galat — baris ganda muncul diam-diam dan laporan bulanan kehilangan akuratannya. Chapter ini memetakan konsep inti database relasional, mengujinya lewat contoh dua tabel berelasi di SQLite, lalu menutup dengan cek kesiapan diri.

Kenapa Pemahaman Database Penting untuk Data Engineer #

Hampir semua tahap pipeline menyentuh database. Tahap extraction membaca dari database sumber, tahap load menulis ke warehouse, dan tahap debugging menelusuri mengapa satu angka tidak cocok.

Data engineer yang paham struktur penyimpanan dapat menjawab pertanyaan penting dengan cepat: kolom mana yang menjamin baris unik, dan tabel mana yang harus digabungkan agar laporan tidak menghitung dua kali. Istilah berikut adalah kosakata wajibnya:

IstilahArtiContoh dalam praktik
Tabelkumpulan data berbentuk baris dan kolomtabel pelanggan dan pesanan
Primary keykolom penanda unik setiap barispelanggan.id
Foreign keykolom yang merujuk primary key tabel lainpesanan.pelanggan_id
Relasihubungan antar tabelsatu pelanggan memiliki banyak pesanan
RDBMSperangkat lunak pengelola database relasionalPostgreSQL, MySQL, SQLite
Skemakerangka struktur tabel dalam satu databaseskema staging dan curated

Dokumentasi resmi PostgreSQL dan SQLite menjadi rujukan utama saat mempelajari perilaku masing-masing RDBMS: https://www.postgresql.org/docs/ dan https://www.sqlite.org/docs.html .

Contoh Nyata: Dua Tabel Berrelasi #

Contoh berikut membangun relasi klasik satu-ke-banyak: satu pelanggan boleh memiliki banyak pesanan. Tabel pesanan merujuk pelanggan lewat foreign key, lalu JOIN menggabungkan keduanya untuk menghitung total belanja per pelanggan.

python
import sqlite3

koneksi = sqlite3.connect(":memory:")
koneksi.execute("CREATE TABLE pelanggan (id INTEGER PRIMARY KEY, nama TEXT NOT NULL)")
koneksi.execute("""
    CREATE TABLE pesanan (
        id INTEGER PRIMARY KEY,
        pelanggan_id INTEGER REFERENCES pelanggan(id),
        total INTEGER NOT NULL
    )
""")
koneksi.executemany(
    "INSERT INTO pelanggan (id, nama) VALUES (?, ?)",
    [(1, "Budi"), (2, "Siti")],
)
koneksi.executemany(
    "INSERT INTO pesanan (id, pelanggan_id, total) VALUES (?, ?, ?)",
    [(101, 1, 250_000), (102, 1, 120_000), (103, 2, 480_000)],
)
koneksi.commit()

hasil = koneksi.execute("""
    SELECT p.nama, SUM(o.total) AS total_belanja
    FROM pelanggan AS p
    JOIN pesanan AS o ON o.pelanggan_id = p.id
    GROUP BY p.nama
    ORDER BY total_belanja DESC
""").fetchall()

for nama, total in hasil:
    print(f"{nama}: {total}")

Output yang Dihasilkan:

text
Siti: 480000
Budi: 370000

Mari kita telaah baris-baris kode di atas:

  1. Baris 4-11 (CREATE TABLE dua tabel): tabel pelanggan menyimpan data induk; tabel pesanan mendefinisikan pelanggan_id sebagai foreign key yang merujuk pelanggan.id — relasi satu-ke-banyak dinyatakan langsung di struktur.
  2. Baris 12-19 (INSERT): dua pelanggan dan tiga pesanan dimasukkan; perhatikan Budi muncul di dua pesanan (101 dan 102) lewat pelanggan_id yang sama.
  3. Baris 22-28 (JOIN + GROUP BY): JOIN ... ON menggabungkan setiap pesanan dengan nama pelanggannya, SUM menjumlahkan total per nama, dan ORDER BY ... DESC menempatkan pelanggan terbesar di atas.
  4. Baris 30-31 (print): hasil menunjukkan Siti unggul dengan satu pesanan besar, sedangkan Budi kalah meskipun punya dua pesanan — bukti agregasi bekerja lintas baris.

Struktur dua tabel seperti ini adalah cikal bakal model data warehouse: tabel fakta (pesanan) mengacu ke tabel dimensi (pelanggan). Kita akan merancang model seperti ini lebih jauh di Section Data Modeling dan Data Warehouse.

Cek Kesiapan Anda #

  • Anda siap bila dapat menjelaskan perbedaan primary key dan foreign key dengan contoh sendiri.
  • Anda siap bila dapat menggambar relasi satu-ke-banyak antara dua tabel yang Anda rancang sendiri.
  • Anda siap bila dapat menuliskan JOIN yang menggabungkan dua tabel tanpa menggandakan baris.
  • Anda siap bila dapat menyebutkan dua contoh RDBMS beserta perbedaan pemakaiannya.

Setelah data tersimpan rapi di database, pekerjaan berikutnya berpindah ke mesin tempat pipeline berjalan — dan mesin tersebut hampir pasti berbasis Linux. Chapter berikutnya, Dasar Linux, memetakan perintah harian yang wajib dikenal.