Semester 3 · 4 SKS · 200 menit · Project 04 — Data Analysis

Fundamental Database

Form dan logika Pertemuan 2–3 menghasilkan data. Sekarang kita tentukan data apa yang harus disimpan, dalam tabel apa, dengan kolom dan tipe apa — sebelum menulis satu baris SQL pun.

Konsep → Kasus NyataPrediksi → CodingJalankan → Analisis

Target Pertemuan

Di akhir kelas, Anda mampu menentukan entity, atribut, tipe data, dan primary key sebuah aplikasi — dituangkan sebagai rancangan tabel di Project Book.

Entity → Tabel
Membedakan benda/kejadian yang datanya perlu disimpan dari sekadar proses.
Atribut → Kolom
Menentukan ciri yang wajib dicatat beserta tipe datanya.
Primary Key
Memilih penanda unik agar setiap baris bisa dibedakan.
Aturan kelas tetap sama: AI boleh membantu membuat contoh, mencari dokumentasi, debugging, dan merapikan kode/SQL. Anda tetap harus mampu menjelaskan entity, atribut, tipe data, primary key, dan alasan keputusan rancangan Anda. Paper First, AI Later — rancang di kertas dulu, baru tulis SQL.

SQL boleh di-copy–paste. Yang tidak boleh di-copy–paste adalah pemahaman tentang data Anda sendiri.

Pertanyaan Pembuka

Laundry menerima 3 pelanggan hari ini, salah satunya bernama sama persis: “Andi”. Tanpa nomor nota / ID, bagaimana Anda membedakan cucian milik Andi yang satu dari Andi yang lain? Tulis jawaban di kertas sebelum membuka laptop.

1. Dari Pertemuan 3 ke Pertemuan 4

Pertemuan 3 menghitung total belanja — tetapi setelah browser ditutup, datanya hilang. Aplikasi nyata harus menyimpan data agar bisa dilihat lagi besok.

Form + logika
P2–P3
→
Data perlu disimpan
P4 hari ini
→
Relasi + ERD
P5
→
CRUD
P6
Batas materi hari ini (sesuai kerangka): entity, atribut, tabel, record, tipe data, primary key. Relationship formal (FK), ERD, dan CRUD dibahas di Pertemuan 5–6 — jadi di SQL hari ini kita simpan kolom calon penghubung (mis. id_pelanggan) tanpa aturan FK dulu.

2. Analogi Lemari Arsip

Bayangkan ruang arsip laundry — persis seperti database (ilustrasi resmi kerangka kuliah):

Lemari = Database
Satu wadah besar bernama mis. laundry_db untuk seluruh arsip satu usaha.
Map = Tabel
Map “Pelanggan”, “Transaksi”, “Pembayaran” — tiap map hanya berisi satu jenis formulir.
Formulir = Record
Satu lembar = satu baris. Nomor arsip unik di pojok = primary key.
Cek pemahaman lisan: jika satu map berisi campur formulir pelanggan dan pembayaran, apa yang sulit ditemukan? Itulah alasan tiap entity punya tabel sendiri.

3. Database, Tabel & Record

Database berisi tabel; tiap tabel berisi baris (record) dan kolom (field/column).

Contoh tabel pelanggan

id_pelanggan (PK)namano_hp
1Andi0812…
2Andi0857…
3Sinta0821…

Dua “Andi” tetap berbeda karena PK-nya beda: 1 vs 2. Inilah jawaban pertanyaan pembuka.

Entity vs tabel

Entity adalah konsepnya (“ada Pelanggan”); tabel adalah wujudnya di database. Satu entity → satu tabel.

  • Entity Pelanggan → tabel pelanggan
  • Entity Transaksi → tabel transaksi
  • Bukan entity: “hitung diskon”, “tombol simpan” (itu proses, bukan data).
Prediksi: “Keranjang belanja sementara” entity atau bukan? Diskusikan — jawabannya tergantung apakah datanya perlu disimpan permanen.

Atribut → kolom: apa yang wajib dicatat?

Atribut dipilih dari kebutuhan nyata, bukan kira-kira. Tanya: “tanpa data ini, proses apa yang macet?”

PertanyaanAtribut yang lahir
Bagaimana menghubungi pelanggan?no_hp
Berapa yang harus dibayar?berat_kg, total_harga
Kapan diambil?tanggal_masuk, tanggal_selesai
Sudah bayar atau belum?status

4. Tipe Data — Pilih Wadah yang Tepat

Tipe data menentukan isi apa yang muat, operasi apa yang bisa dilakukan, dan seberapa besar penyimpanan. Salah pilih = tanggal tidak bisa diurutkan, harga tidak bisa dijumlahkan.

TipeUntuk apaContoh
INTBilangan bulat: ID, jumlah, harga rupiahberat dibulatkan / harga 25000
DECIMAL(5,2)Angka desimal presisi: berat 2,50 kgberat_kg DECIMAL(5,2)
VARCHAR(n)Teks pendek berbatas: nama, no HP, usernamenama VARCHAR(100)
TEXTTeks panjang bebas: alamat, catatanalamat TEXT
DATE / DATETIMETanggal / tanggal+jamtanggal_masuk DATE
ENUM(...)Pilihan tetap: status, metode, peranstatus ENUM('baru','proses','selesai','diambil')
Kesalahan umum: nomor HP memakai INT (angka 0 di depan hilang, tidak bisa memuat “+”), harga memakai VARCHAR (tidak bisa dijumlahkan), tanggal memakai VARCHAR (tidak bisa diurutkan benar). No HP = VARCHAR, harga = INT, tanggal = DATE.

Primary Key — Nomor Arsip yang Unik

Primary key (PK) wajib: unik + tidak kosong + tidak berubah-ubah. Praktik standar: id_... INT AUTO_INCREMENT PRIMARY KEY — nomor urut otomatis.

Cocok jadi PK
id_pelanggan, id_transaksi — buatan sistem, stabil, unik.
Jangan jadi PK
Nama (bisa kembar), no HP (bisa ganti), alamat (bisa sama). Boleh dicari, tapi bukan identitas.

5. Kasus Nyata — 5 Entity Laundry (Sesuai Kerangka)

Kerangka kuliah menetapkan contoh output P4 untuk laundry: Pelanggan, Transaksi, Layanan, Pembayaran, User. Berikut rancangan atributnya — tiru polanya untuk sistem pilihan Anda.

Pelanggan

  • id_pelanggan INT PK
  • nama VARCHAR(100) wajib
  • no_hp VARCHAR(20)
  • alamat TEXT

Layanan

  • id_layanan INT PK
  • nama_layanan VARCHAR(100)
  • harga_per_kg INT
  • estimasi_hari INT

Transaksi

  • id_transaksi INT PK
  • id_pelanggan, id_layanan INT (calon penghubung — FK formal di P5)
  • berat_kg DECIMAL(5,2)
  • tanggal_masuk, tanggal_selesai DATE
  • status ENUM
  • total_harga INT

Pembayaran

  • id_pembayaran INT PK
  • id_transaksi INT (calon penghubung)
  • tanggal_bayar DATETIME
  • jumlah_bayar INT
  • metode ENUM tunai/transfer/qris

User (pengguna sistem)

Petugas yang login — bedakan dengan pelanggan. Kolom: id_user INT PK, username VARCHAR(50) UNIQUE, password_hash VARCHAR(255), peran ENUM admin/kasir. Detail login & hashing di Pertemuan 9.

6. Praktik — Dari Kertas ke phpMyAdmin

Alur Paper First, AI Later: gambar rancangan di Project Book dulu, baru tulis SQL, baru jalankan. SQL di bawah siap copy–paste ke tab SQL phpMyAdmin.

Diagram — Entity Menjadi Tabel

Setiap entity menjadi satu tabel; atribut menjadi kolom; satu kolom dinobatkan sebagai primary key.

Diagram entity menjadi tabel laundry Entity pelanggan dengan atribut nama, no HP, alamat menjadi tabel pelanggan dengan kolom dan primary key id pelanggan. Entity transaksi menjadi tabel transaksi dengan primary key id transaksi. ENTITY: Pelanggan atribut: nama · no_hp · alamat+ penanda unik: id_pelangganpilih tipe tiap atribut TABEL pelanggan (id_pelanggan PK) record: (1, Andi, 0812…) · (2, Andi, 0857…)PK 1 ≠ 2 → dua Andi tetap beda

Siapkan di XAMPP

  1. Buka XAMPP Control Panel, klik Start pada Apache dan MySQL. Latihan ini memakai keduanya (phpMyAdmin butuh keduanya jalan).
  2. Buka http://localhost/phpmyadmin. Jika error, pastikan kedua modul berstatus hijau/running.
  3. Salin blok mini coding 1, buka tab SQL, tempel, klik Go/Kirim. Ulangi untuk blok 5 tabel dan uji isi.
Nama database wajib laundry_db agar sama dengan instruksi dan mudah diperiksa dosen. Charset default utf8mb4 sudah cukup.
Mini coding 1 — buat database + 1 tabel contoh
CREATE DATABASE IF NOT EXISTS laundry_db
  CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

USE laundry_db;

CREATE TABLE IF NOT EXISTS pelanggan (
  id_pelanggan INT AUTO_INCREMENT PRIMARY KEY,
  nama VARCHAR(100) NOT NULL,
  no_hp VARCHAR(20),
  alamat TEXT
);
Mini coding 2 — 5 tabel laundry (salin semua)
USE laundry_db;

-- 1. Pelanggan
CREATE TABLE IF NOT EXISTS pelanggan (
  id_pelanggan INT AUTO_INCREMENT PRIMARY KEY,
  nama VARCHAR(100) NOT NULL,
  no_hp VARCHAR(20),
  alamat TEXT
);

-- 2. Layanan
CREATE TABLE IF NOT EXISTS layanan (
  id_layanan INT AUTO_INCREMENT PRIMARY KEY,
  nama_layanan VARCHAR(100) NOT NULL,
  harga_per_kg INT NOT NULL,
  estimasi_hari INT NOT NULL DEFAULT 2
);

-- 3. Transaksi (id_pelanggan & id_layanan jadi FK formal di P5)
CREATE TABLE IF NOT EXISTS transaksi (
  id_transaksi INT AUTO_INCREMENT PRIMARY KEY,
  id_pelanggan INT NOT NULL,
  id_layanan INT NOT NULL,
  berat_kg DECIMAL(5,2) NOT NULL,
  tanggal_masuk DATE NOT NULL,
  tanggal_selesai DATE,
  status ENUM('baru','proses','selesai','diambil') NOT NULL DEFAULT 'baru',
  total_harga INT NOT NULL DEFAULT 0
);

-- 4. Pembayaran
CREATE TABLE IF NOT EXISTS pembayaran (
  id_pembayaran INT AUTO_INCREMENT PRIMARY KEY,
  id_transaksi INT NOT NULL,
  tanggal_bayar DATETIME DEFAULT CURRENT_TIMESTAMP,
  jumlah_bayar INT NOT NULL,
  metode ENUM('tunai','transfer','qris') NOT NULL DEFAULT 'tunai'
);

-- 5. User / petugas (login dibahas P9)
CREATE TABLE IF NOT EXISTS pengguna (
  id_user INT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(50) NOT NULL UNIQUE,
  password_hash VARCHAR(255) NOT NULL,
  peran ENUM('admin','kasir') NOT NULL DEFAULT 'kasir'
);
Mini coding 3 — uji isi: tambah & lihat data
USE laundry_db;

-- Contoh isi (detail INSERT/SELECT dibahas penuh di P6)
INSERT INTO pelanggan (nama, no_hp, alamat) VALUES
  ('Andi', '081234567890', 'Jl. Merpati No. 10'),
  ('Andi', '085700011122', 'Jl. Kenari No. 5'),
  ('Sinta', '082133344455', 'Jl. Anggrek No. 8');

INSERT INTO layanan (nama_layanan, harga_per_kg, estimasi_hari) VALUES
  ('Cuci Setrika', 8000, 2),
  ('Express 1 Hari', 15000, 1);

SELECT * FROM pelanggan;
SELECT * FROM layanan;
SHOW TABLES;
DESCRIBE pelanggan;

Alur pada kode

CREATE DATABASE
Membuat “lemari” laundry_db. Sekali saja.
CREATE TABLE
Membuat “map”: nama tabel + daftar kolom + tipe + PK.
INSERT + SELECT
Mengisi 2–3 formulir contoh lalu melihat isinya untuk memastikan struktur benar.

7. Jalankan, Uji, dan Amati

Uji struktur, bukan cuma “berhasil dijalankan”. Prediksi dulu, baru eksekusi, lalu catat.

Kasus ujiCaraHasil yang seharusnya
PK menolak kembarINSERT INTO pelanggan (id_pelanggan, nama) VALUES (1, 'Kembar');Error duplicate entry — bukti dua “Andi” tetap dua baris berbeda.
Kolom wajibINSERT INTO pelanggan (no_hp) VALUES ('0812'); (tanpa nama)Error — kolom nama NOT NULL menolak.
Tipe menolak salah isiIsi tanggal_masuk dengan teks bebas mis. “kemarin”Error / tanggal 0000-00-00 — bukti DATE butuh format YYYY-MM-DD.
ENUM menolak di luar pilihanIsi status dengan 'ngawur'Error — hanya 4 pilihan yang diizinkan.
Struktur benarDESCRIBE transaksi; dan SELECT * FROM pelanggan;Kolom, tipe, dan PK tampil sesuai rancangan kertas.
Jika error: pastikan MySQL running, database laundry_db dipilih (USE), tidak ada nama tabel ganda, dan titik koma tidak hilang. Error No database selected berarti lupa baris USE laundry_db;.

8. Mini Challenge

  1. Tambahkan kolom email VARCHAR(100) ke tabel pelanggan via tab SQL (ALTER TABLE ... ADD COLUMN). Tipe apa yang Anda pilih dan mengapa?
  2. Buat tabel ke-6 untuk sistem Anda sendiri (mis. “obat”, “kendaraan”, “buku”) — minimal 4 kolom + 1 PK. Tulis dulu di kertas.
  3. Coba masukkan no_hp dengan awalan 0 (mis. 0812…). Hilang atau utuh? Apa buktinya soal pilihan VARCHAR vs INT?
  4. Temukan satu atribut di sistem Anda yang “bisa kembar” (nama, alamat) dan jelaskan mengapa ia tidak layak jadi PK.
Challenge menjelaskan rancangan: tunjuk satu tabel, sebut PK-nya, jelaskan mengapa kolom itu yang dipilih dan mengapa tipe datanya begitu.

9. Hubungkan dengan Project Semester — Project 04 Data Analysis

Tentukan seluruh entity pada sistem pilihan Anda beserta atributnya — ini bekal ERD (P5) dan CRUD Matrix (P6).

Booking lapangan
Pelanggan, Lapangan, Booking, Pembayaran, User. Atribut kunci: tanggal, jam mulai/selesai, status.
Perpustakaan
Anggota, Buku, Peminjaman, Denda, User. Atribut kunci: tanggal pinjam/kembali, status kembali.
Bengkel / Kasir / Kos
Tiru pola laundry: siapa (pelanggan) + apa (layanan/barang/kamar) + kejadian (transaksi) + uang (pembayaran) + petugas (user).

Jangan menyalin mentah tabel laundry. Ganti entity dan atribut dengan kebutuhan sistem Anda. Setiap tabel wajib punya PK dan alasan pemilihannya.

10. Tugas Project Book — Minggu 4

  1. Tetap gunakan sistem project semester yang sama.
  2. Daftar seluruh entity sistem Anda (minimal 4) + atribut masing-masing.
  3. Untuk tiap kolom tulis: nama, tipe data, wajib/opsional, dan tandai PK-nya + alasan.
  4. Gambar rancangan tabel di kertas (nama tabel + kolom + PK), lalu wujudkan minimal 3 tabel di phpMyAdmin dan lampirkan bukti (screenshot / ekspor SQL).
  5. Tulis analisis tangan, foto/scan jelas, unggah ke Google Drive sesuai arahan dosen. Simpan untuk ERD minggu depan.
Format analisis Project Book:
Nama entity → Atribut → Tipe data + alasan → Primary key + alasan → Bukti SQL/phpMyAdmin.

11. Quis Pertemuan 4

  1. Jelaskan perbedaan database, tabel, dan record dengan contoh dari sistem Anda.
  2. Apa beda entity dan tabel? Apa beda atribut dan kolom?
  3. Kapan memakai VARCHAR, kapan TEXT, kapan INT, kapan DATE? Beri contoh masing-masing.
  4. Mengapa no HP disimpan sebagai VARCHAR bukan INT? Mengapa harga sebagai INT bukan VARCHAR?
  5. Apa syarat primary key? Mengapa “nama” umumnya buruk sebagai PK?
  6. Pada tabel transaksi laundry, kolom apa yang menjadi calon penghubung ke tabel lain? Mengapa FK formalnya baru dibahas di P5?
  7. Jelaskan alur membuat database sampai teruji: dari rancangan kertas hingga SELECT berhasil.

Quis/aktivitas mengikuti aturan kelas dan arahan dosen. Pastikan rancangan yang dikumpulkan dapat Anda jelaskan.

12. Ringkasan

Entity
apa yang disimpan
→
Atribut + tipe
apa yang dicatat
→
Primary key
pembeda baris
→
Tabel SQL
wujud di DB

Data yang baik dirancang di kertas sebelum diketik sebagai SQL.

Pertemuan 5 akan menghubungkan tabel-tabel ini (PK, FK, ERD). Simpan Project Book dan file SQL Anda.

Glosarium

Istilah bergaris putus-putus dapat diarahkan kursor atau difokuskan untuk melihat arti singkat.

DatabaseWadah terorganisir berisi banyak tabel satu aplikasi.
TabelWujud entity di database; berisi baris-baris sejenis.
Record / RowSatu baris data dalam tabel.
Field / ColumnKolom tabel, wujud atribut di database.
EntityBenda/orang/kejadian yang datanya perlu disimpan.
AttributeCiri yang dicatat dari sebuah entity.
DatatypeJenis isi kolom: INT, VARCHAR, TEXT, DATE, DECIMAL, ENUM.
Primary KeyKolom identitas baris: unik, wajib isi, stabil.
phpMyAdminAplikasi web bawaan XAMPP untuk mengelola MySQL via browser.
SQLBahasa perintah database: CREATE, INSERT, SELECT, dsb.