Skip to main content

Command Palette

Search for a command to run...

Kampus Nggak Ngajarin Ini Tentang Database Relasi

Soalnya kebanyakan ilmu ini ada di level industri aja kejadiannya

Updated
โ€ข8 min read
Kampus Nggak Ngajarin Ini Tentang Database Relasi

Ketika ngomongin database apa yang terlintas di kepala kalian? Pasti SQL, ya tentu saja. SQL soalnya udah jadi database yang lumrah di kalangan para mahasiswa, walau mahasiswa yang (ehm) lebih rajin sekarang pasti kenal istilah NoSQL.

Ya, mata kuliah basdat atau basis data adalah mata kuliah dasar pada semester awal yang mengenalkan perkuliahan betapa menyebalkannya ilmu backend. Instead of ngeliat tampilan-tampilan yang unyu dengan warna-warna kita malah dilihat tampilan kaya begini:

mysql> select count(*) from users;
+----------+
| count(*) |
+----------+
|  4056004 |
+----------+
1 row in set (1.13 sec)

Mungkin orang-orang malah akan ngomong, "kenapa ada orang yang mau jadi backend developer ya? ngeliat database gitu udah pusing nulis script, kalo lemot berabe lagi", ya emang bener, tapi ya.... seru hehehe.

Nah btw, gue sering ngeliat masalah-masalah dasar di level industri, tapi gue nggak melihat bahwa kampus melakukan ini di level pendidikan, maka wajarlah orang-orang yang masuk backend selain tidak banyak, tidak memenuhi level market juga.

Jadi jangan heran kalo kamu ngga keterima kerjaan, bukan salah kampusnya aja, salah kamu juga wkwkwkwkwk sorry kebanjiran fakta. Tapi tenang aja, gue akan ngasih beberapa pandangan gue yang akan membantu kalian untuk secepatnya bebenah terutama yang pengen jadi backend.


Kampus Ngga Ngajarin Pentingnya RAW Query

Lo semua pasti gak asing sama gambar ini kan?

2.png

Ya, gambar legend yaitu PHPMyAdmin, atau bahkan kalo kampus kalian pake SQL Server, kalian bakalan di-arahin pake GUI dari SQL Server itu sendiri.

Sayangnya eh sayangnya, gue pribadi agak menyayangkan sama para tenaga pendidik kita yang nggak mau ngajarin betapa pentingnya RAW Query di SQL ini. Kenapa? Ya simple as that, karena kalo terbiasa pake RAW Query (Query kasar), mahasiswa akan terbiasa untuk nulis query ketika terdesak! Apalagi momen-momen debugging dan harus menggunakan server linux sebagai CLI untuk memahami kondisinya.

Yaelah ngapain sih bang repot, kan bisa pake GUI, enak, gampang

Ya nggak salah sih, kalo buat development, saya juga gitu kok, tapi bukan berarti RAW Querynya nggak bisa. Sayangnya, para mahasiswa ini dimanjakan dengan KLAK-KLIK-KLAK-KLIK yang bikin mahasiswa bahkan banyak yang nggak bisa kalo diminta ALTER TABLE pas interview ke company dan gue sangat menyayangkannya. Nggak harus jago join ke 10 tabel, cukup paham basicnya aja, cara rubah kolom gimana cara hapus kolom gimana.

Banyak kasus sekarang ini kalau mahasiswa gabung ke perusahaan, perusahaan itu umumnya sangat menjaga agar port 3306 mereka alias port database MySQL (atau port lainnya lah terserah) agar tidak terbuka secara publik. Sehingga, otomatis mahasiswa pada nggak bisa konek ke database mereka pake aplikasi lain seperti DBeaver, MySQL Workbench, termasuk PHPMyAdmin.

Jaman sekarang mah ada VPN bang

Luckily you company-nya punya waktu yang cukup untuk setup itu, kalo nggak gimana? Kita nggak bisa nyalahin company-nya kan? Maka dari itu BISALAH untuk nulis RAW Query yang basic aja even SELECT, INSERT INTO, DELETE FROM, sampai CREATE INDEX.

Jadi poinnya apa? Biasain tulis query manual (RAW), jangan klik-klik terus. Nanti jadi habbit buruk dan ketika harus problem solving jadi nggak terbiasa. Klak-klik boleh untuk cepet, tapi jangan dibiasain pas baru awal belajar.

Kampus Nggak Ngajarin Teliti

Sebenernya database itu nggak serem sih, nggak seserem ketika temen minjem duit terus kemudian ngilang gitu aja. Tapi, basic tentang database itu sendiri gak diajarin, terutama satu hal, ketelitian dan hati-hati.

To be honest, dua hal ini adalah hal paling basic tapi paling sering juga diabaikan oleh newcomer, termasuk saya ketika nggak berhati-hati.

Saya ceritain dikit, jadi waktu itu tim IT di kantor tempat saya kerja sedang develop sebuah fitur, singkat cerita salah satu Supervisor di lapangan minta gue untuk merubah password salah satu petugas di lapangan karena dia baru aja dipecat kemarin, dan takut usernamenya disalah gunakan.

Karena waktu itu kantor gue juga belum banyak orangnya, so one person should use multiple hats. Nah apesnya, gue melakukan kesalahan fatal, gue menulis query kaya begini:

UPDATE staffs SET password = "";

You know what's wrong? Yes, where is WHERE SYNTAX!

Dan bodohnya lagi gue main asal pencet aja itu di database, alhasil sebanyak 70-80 rows updated, dan lo tau gue rasanya apa abis itu? Nangis ๐Ÿ˜ญ

Nangis atas kebodohan gue yang sok ganteng dan sok pintar ini, alhasil gue harus bikin script di API untuk nulis ulang password akun staff lapangan sebanyak 70-80 dan dibagikan ke WA sesuai Supervisornya.

Saran gue buat para tenaga pendidik, kasitau mahasiswa kalian bahwa ketelitian dalam nulis query itu penting, apalagi untuk query:

  • ALTER

  • UPDATE

  • DELETE

  • DROP

Kenapa? Karena kalau sudah di-eksekusi, tidak ada kemungkinan bisa kembali kecuali mengaktifkan fitur transactions.

Ribet lo, yaudah pake transactions aja sih

Yaudah iya, sok aja, kalo pengen pake, walau sih gue gak yakin idealisme lo akan bertahan sekuat itu hehehe, pasti pengennya buru-buru.

Semenjak saat itu, gue kalo ada query UPDATE, DROP, ALTER, DELETE gue pasti tulis dulu di notepad, dibaca baik-baik, terus copy paste ke CLI MySQL terus kemudian sebelum menekan tombol enter gue tatap baik-baik query itu untuk memastikan apakah tidak akan ada masalah kalau gue eksekusi.

Kampus Nggak Ngajarin Performa

Memang bukan kewajiban kampus untuk mengajarkan betapa pentingnya masalah performa, tapi setidaknya untuk bapak ibu tenaga pendidik IT yang baca ini, ajarin mahasiswa kalian tentang teori LOCK di database.

Kenapa? Karena selama pendidikan bapak ibu pasti dalam environment yang sangat nyaman tanpa adanya perubahan, tapi kalau di-industri pasti kaya gini:

User ada banyak ngehajar API atau Web App, kemudian masing-masing request meminta data ke database. Buat para mahasiswa kalian harus tahu ya, bahwa ketika database khususnya Database Relasi (Relational Database) pada saat melakukan operasi terhadap perubahan struktur tabel, misalnya menambah kolom baru, atau mengganti tipe data kolom baru ada yang namanya proses LOCK terhadap table.

Sebagai contoh misalnya kita punya tabel namanya users, kemudian kita mau nambah kolom nih misalnya nama kolomnya adalah district.

Apa yang dilakukan oleh database relasi?

  1. Buat tabel temporary, misalnya bernama _users dengan struktur yang ditambahin kolomnya si district.

  2. Mengunci atau LOCK si table users, supaya gak ada data baru yang masuk, tujuannya supaya datanya persistent atau gak berubah-ubah.

  3. Ngecopy semua data di tabel users ke tabel temporary tersebut dengan nama _users.

  4. Setelah selesai, tabel users akan diganti misalnya menjadi users_old.

  5. Kemudian tabel _users direname menjadi users.

  6. Terakhir, tabel users_old akan di-drop / dihapus.

Apa masalahnya? Lu bayangin selama proses perubahan kolom ini, nggak mungkin tuh database nggak diobok-obok alias digunakan, apalagi kalau lagi jam kerja. Makanya jangan heran kenapa banyak developer yang rutin bekerja malam karena malam kan emang the lowest activity hour untuk database bekerja (kecuali perbankan hohoho).

Bayangin juga kalo tuh tabel users isinya 20 juta data, nangis itu ngecopy semua data di tabel users ke tabel temporary tersebut bukan waktu yang sebentar, gak segampang mahasiswa ngelakuin itu karena data di database mahasiswa jumlahnya dikit.

Selain itu, ketika sedang melakukan perubahan kolom, tentu ada aja proses atau query SELECT yang lagi berjalan, misalnya mau ngambil data user atau transaksi, otomatis request ini jadi gak bisa didapatkan karena table-nya sedang terkena proses LOCK yang berujung ngebuat sistemnya di database menjadi Deadlock request, atau istilah gampangnya kepenuhan.

Makanya saya cuma mau bilang, tolong bapak ibu minimal ajarin teori dan konsep LOCK supaya mahasiswa tau, dan kasitahu mahasiswa proses yang terjadi selama perubahan kolom, biar mereka terutama yang mau jadi backend nggak ngang ngong ngang ngong nanti di-industri. Urusan mereka mau jago apa enggak pokoknya~

๐Ÿ’ก
Ohiya, sebenernya ada solusinya terkait masalah di atas, tapi gak akan saya bahas disini, gak cukup waktunya hehehe.

Kampus Nggak Ngajak Simulasi Beneran

Ajaklah simulasi beneran mahasiswanya pake minimal satu juta data dengan empat tabel, tenaga pendidik juga diharapkan aktif supaya mahasiswanya kegambar, oh gini loh punya minimal satu juta data.

Selama ini yang diajarin gimana? Ngelakuin insert cuma sampe 10-20 data yailah mana berasa bosku. Ajarin beneran biar mereka paham kenapa pentingnya INDEX di database ketika datanya udah jutaan baru mereka ngangguk, bahwa sepenting itu INDEX ketika belajar database.

Nggak usah banyak-banyak kok ngelakuinnya, misalnya studi kasus mini e-commerce, berarti paling nggak punya beberapa tabel berikut buat simulasi:

  • users (10-20 ribu data)

  • user_addresses (10-20 ribu data)

  • user_carts (5-6 ribu data)

  • orders (2-8 ribu data)

  • transactions (100-300 ribu data)

  • transaction_details (1-2 juta data)

  • products (5-10 ribu data)

  • categories (20-100 data)

Kalau aja mahasiswa udah diajarin begini, udah kebayang tuh dia begimana pusingnya liat database, dan bukan berarti mau bikin mahasiswanya pusing, tapi mereka punya taman bermain yang real!

Meskipun tidak benar-benar real seperti yang dijalankan di industri, tapi minimal udah kebayang mahasiswanya bahwa kalau di-industri akan seperti ini loh seberapa hektik databasenya, udah kebayang juga tuh bahwa kalau kita ngelakuin kesalahan, otomatis, ya.... kelar udah datanya.

Alah kalau bapak ibu alasan takut datanya susah digenerate, suruh aja ChatGPT, Bard, Claude dan AI lainnya untuk generate code pake Python, simple kan? Saya aja ketika nyoba salah satu tools migration database yang namanya Gh-ost, saya nyobain generate 10 juta data pada satu tabel dengan script ini aja kok:

import random
import string
import pymysql

# Connect to the MySQL server
connection = pymysql.connect(
    host='localhost',
    user='hudya',
    password='hudya emang paling keren sedunia',
    database='sukuna'
)

# Create a cursor object
cursor = connection.cursor()

# Generate and insert random data into the table
for _ in range(2000000):
    name = ''.join(random.choices(string.ascii_letters, k=10))
    email = ''.join(random.choices(string.ascii_lowercase, k=5)) + '@example.com'

    insert_query = f"INSERT INTO users (name, email) VALUES ('{name}', '{email}')"
    cursor.execute(insert_query)
    print(f"inserting: index-{_}")

    # Commit the changes every 1000 rows
    if _ % 1000 == 0:
        connection.commit()
        print(f"comtting: index-{_}")

# Commit any remaining changes and close the connection
connection.commit()
connection.close()
print("Finish!")

Inget ya, saya cuma modal ChatGPT kok ๐Ÿ˜

Jadi, yuk para mahasiswa belajar lebih banyak, nggak usah nyalahin dosen kalian kalo nggak diajarin ini, cukup baca apa yang saya tulis, dan coba belajar lebih banyak. Untuk para tenaga pendidik yang membaca ini sampai habis, terima kasih banyak, semoga tulisan saya bisa menyadarkan bapak ibu biar lebih kreatif juga mendidik anak-anaknya, dan semoga berkah ya bapak ibu!