ER diagram (Entity-Relationship Diagram, sering disingkat ERD) adalah gambar rancangan database: kotak untuk tiap benda yang datanya disimpan, isinya data apa saja yang dicatat, dan garis yang menghubungkan benda-benda yang saling berkaitan. Mirip denah rumah yang dipegang tukang: tiap ruangan digambar sebagai kotak, dan pintu antar ruangan digambar sebagai garis. Semua orang di tim bisa membaca dan mengoreksinya sebelum satu baris CREATE TABLE pun ditulis.
🧪 Tebakan cepat: di garis antara
customersdanorders, ujung yang menempel keordersbercabang tiga seperti kaki ayam. Artinya satu customer punya banyak orders, atau satu order punya banyak customers? Tebak dulu, jawabannya ada di bagian "Membaca ujung garis".
Tiga komponen: entitas, atribut, relasi
Semua ER diagram dibangun dari tiga hal. Contohnya diambil dari Kedai Senja:
| Komponen | Artinya | Di Kedai Senja | Nanti jadi |
|---|---|---|---|
| Entity (entitas) | benda yang datanya disimpan | Customer, Profile, Order, Product | tabel |
| Attribute (atribut) | data yang dicatat tentang entitas itu | name, email, price |
kolom |
| Relationship (relasi) | hubungan antar entitas, biasanya kata kerja | Customer membuat Order | foreign key, atau tabel perantara |
Satu atribut punya peran khusus: primary key, atribut yang nilainya unik untuk tiap baris, misalnya id.
Notasi Chen: persegi panjang, oval, belah ketupat
Ada dua cara menggambar ERD yang sering kamu temui. Yang klasik, di buku kuliah, adalah notasi Chen:
- Entitas digambar sebagai persegi panjang.
- Atribut digambar sebagai oval yang menempel ke entitasnya.
- Primary key digambar sebagai oval bergaris bawah: nama atributnya diberi garis bawah.
- Relasi digambar sebagai belah ketupat (diamond) di tengah garis, berisi kata kerjanya.
(id) (name) (id) (ordered_at)
\ / \ /
[Customer] --1-- <membuat> --N-- [Order]
Di gambar teks ini, [ ] persegi panjang, ( ) oval, < > belah ketupat, dan 1 serta N menulis kardinalitasnya: satu customer, banyak order. Lab di halaman ini menggambar versi lengkapnya, termasuk garis bawah di id.
Notasi crow's foot: yang dipakai tool sehari-hari
Tool seperti dbdiagram.io, draw.io dan MySQL Workbench memakai notasi crow's foot (kaki ayam). Lebih ringkas: tiap entitas jadi satu kotak berisi daftar atributnya, primary key ditandai PK dan foreign key ditandai FK. Relasinya cukup garis, dan jumlahnya ditulis lewat bentuk ujung garis:
| Ujung garis | Dibaca |
|---|---|
|| dua garis tegak |
tepat satu |
o| lingkaran dan garis tegak |
nol atau satu |
|< garis tegak dan kaki ayam |
satu atau banyak |
o< lingkaran dan kaki ayam |
nol atau banyak |
Lingkaran artinya "boleh gak ada" (minimal nol). Garis tegak artinya "minimal satu" atau "tepat satu". Kaki ayam artinya "banyak".
Membaca ujung garis
Garis dibaca dua arah, dan selalu memakai ujung yang menempel di entitas tujuan. Garis customers ||----o< orders:
- Dari customers: satu customer punya nol atau banyak orders (ujung di orders:
o<). Budi punya 2 pesanan, Andi belum punya, keduanya sah. - Dari orders: satu order milik tepat satu customer (ujung di customers:
||).
Jadi kaki ayam di sisi orders artinya satu customer punya banyak orders, bukan sebaliknya. Itu jawaban tebakannya. Relasi seperti ini disebut one-to-many, ditulis 1:N. Satu user dengan banyak post di blog juga digambar begitu: garis dari User ke Post dengan notasi 1:N, kaki ayam di sisi Post.
Semua garis di ERD Kedai Senja:
| Garis | Ujungnya | Dibaca | Singkatnya |
|---|---|---|---|
| customers ke profiles | || dan o| |
1 customer punya 0 atau 1 profile | 1:1 |
| customers ke orders | || dan o< |
1 customer punya 0 atau banyak orders | 1:N |
| orders ke order_items | || dan |< |
1 order berisi 1 atau banyak item | 1:N |
| products ke order_items | || dan o< |
1 product muncul di 0 atau banyak item | 1:N |
order_items adalah tabel perantara: lewat dia, satu order berisi banyak product dan satu product ada di banyak order. Di notasi Chen dia gak punya kotak sendiri, cuma belah ketupat berisi dengan atribut qty. Kenapa begitu dibahas di pelajaran Kardinalitas & Relasi.
Dari diagram ke tabel
Diagram yang sudah disepakati diterjemahkan langsung: entitas jadi tabel, atribut jadi kolom, dan tiap garis jadi foreign key di sisi kaki ayam.
CREATE TABLE customers (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT NOT NULL UNIQUE
);
CREATE TABLE profiles (
id INTEGER PRIMARY KEY,
customer_id INTEGER NOT NULL UNIQUE REFERENCES customers(id), -- 1:1
address TEXT
);
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
customer_id INTEGER NOT NULL REFERENCES customers(id), -- 1:N
ordered_at TEXT NOT NULL
);
CREATE TABLE products (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
price INTEGER NOT NULL
);
CREATE TABLE order_items (
order_id INTEGER NOT NULL REFERENCES orders(id),
product_id INTEGER NOT NULL REFERENCES products(id),
qty INTEGER NOT NULL,
PRIMARY KEY (order_id, product_id)
);
||di sisi customers jadiNOT NULL: setiap order wajib punya customer.- Ujung
o|di profiles jadiUNIQUEpadacustomer_id: satu customer gak bisa punya profile kedua. order_itemspunya dua foreign key, dan pasangan keduanya jadi primary key.
SQLite bisa ditanya garis mana saja yang dia kenal. Hasilnya empat baris, sama dengan empat garis di diagram:
| tabel | kolom | menunjuk | kolom_tujuan |
|---|---|---|---|
| order_items | order_id | orders | id |
| order_items | product_id | products | id |
| orders | customer_id | customers | id |
| profiles | customer_id | customers | id |
📌 Jenis atribut
- Simple: gak bisa dipecah lagi, misalnya
name,price. - Composite: bisa dipecah, misalnya alamat jadi jalan, kota, kode pos. Pecah kalau kamu perlu mencari per kota.
- Derived: dihitung dari atribut lain, misalnya umur dari tanggal lahir. Biasanya gak disimpan, cukup dihitung.
- Multi-valued: bisa punya banyak nilai, misalnya nomor HP. Ini gak boleh jadi satu kolom berisi daftar; pelajaran First Normal Form memindahkannya ke tabel sendiri.
⚠️ Jebakan yang sering ketemu
- Membaca kaki ayam terbalik. Kaki ayam menempel di sisi yang banyak. Di sisi itu juga foreign key-nya ditaruh.
- Mencampur dua notasi. Belah ketupat dan oval milik Chen. Kotak berisi daftar kolom dan ujung kaki ayam milik crow's foot. Pilih satu per diagram.
- Menggambar many-to-many tanpa tabel perantara di crow's foot. Dua kaki ayam yang saling berhadapan belum bisa dijadikan tabel; butuh
order_itemsdi tengahnya. - Salah tulis jawaban di latihan. Jawabannya bahasa Indonesia, huruf kecil:
"belah ketupat"(bukan"diamond") dan"oval bergaris bawah".
TL;DR: ER diagram menggambar rancangan database: entitas (jadi tabel), atribut (jadi kolom) dan relasi (jadi foreign key). Notasi Chen memakai persegi panjang untuk entitas, oval untuk atribut, oval bergaris bawah untuk primary key, dan belah ketupat untuk relasi. Notasi crow's foot memakai kotak berisi daftar kolom, dan ujung garis menyatakan jumlah: || tepat satu, o| nol atau satu, |< satu atau banyak, o< nol atau banyak. Kaki ayam menempel di sisi yang banyak, jadi satu customer dengan banyak orders adalah 1:N dengan kaki ayam di sisi orders, dan foreign key-nya juga di sana.