Berikut contoh studi kasus lengkap Sistem Manajemen Perpustakaan dengan implementasi database menggunakan Python dan MySQL, termasuk analisis kebutuhan, desain database, dan kode implementasi:
Studi Kasus: Sistem Manajemen Perpustakaan Digital
1. Analisis Kebutuhan
Fitur yang dibutuhkan:
- Pendaftaran anggota baru
- Peminjaman dan pengembalian buku
- Pencarian buku berdasarkan judul/pengarang
- Laporan transaksi
- Notifikasi denda keterlambatan
Entitas Data:
- Anggota (ID, nama, alamat, no_telp, email)
- Buku (ISBN, judul, pengarang, tahun, stok)
- Transaksi (ID, id_anggota, isbn_buku, tgl_pinjam, tgl_kembali, status)
2. Desain Database
Diagram Relasional:
erDiagram ANGGOTA ||--o{ TRANSAKSI : "meminjam" BUKU ||--o{ TRANSAKSI : "dipinjam" ANGGOTA { int id PK varchar(100) nama varchar(200) alamat varchar(15) no_telp varchar(100) email } BUKU { varchar(13) isbn PK varchar(100) judul varchar(100) pengarang int tahun int stok } TRANSAKSI { int id PK int id_anggota FK varchar(13) isbn_buku FK date tgl_pinjam date tgl_kembali varchar(10) status }
SQL Create Table:
CREATE TABLE anggota ( id INT AUTO_INCREMENT PRIMARY KEY, nama VARCHAR(100) NOT NULL, alamat VARCHAR(200), no_telp VARCHAR(15), email VARCHAR(100) UNIQUE ); CREATE TABLE buku ( isbn VARCHAR(13) PRIMARY KEY, judul VARCHAR(100) NOT NULL, pengarang VARCHAR(100), tahun INT, stok INT DEFAULT 0 ); CREATE TABLE transaksi ( id INT AUTO_INCREMENT PRIMARY KEY, id_anggota INT, isbn_buku VARCHAR(13), tgl_pinjam DATE, tgl_kembali DATE, status ENUM('Dipinjam', 'Dikembalikan', 'Terlambat'), FOREIGN KEY (id_anggota) REFERENCES anggota(id), FOREIGN KEY (isbn_buku) REFERENCES buku(isbn) );
3. Implementasi dengan Python
a. Koneksi Database:
import mysql.connector from datetime import datetime, timedelta db = mysql.connector.connect( host="localhost", user="root", password="", database="perpustakaan" ) cursor = db.cursor()
b. Fungsi Pendaftaran Anggota:
def daftar_anggota(): print("\nPENDAFTARAN ANGGOTA BARU") nama = input("Nama lengkap: ") alamat = input("Alamat: ") no_telp = input("No. Telepon: ") email = input("Email: ") query = "INSERT INTO anggota (nama, alamat, no_telp, email) VALUES (%s, %s, %s, %s)" val = (nama, alamat, no_telp, email) try: cursor.execute(query, val) db.commit() print(f"Anggota {nama} berhasil terdaftar dengan ID: {cursor.lastrowid}") except mysql.connector.Error as err: print(f"Error: {err}")
c. Fungsi Peminjaman Buku:
def pinjam_buku(): print("\nPROSES PEMINJAMAN") id_anggota = int(input("ID Anggota: ")) isbn = input("ISBN Buku: ") # Cek stok buku cursor.execute(f"SELECT stok FROM buku WHERE isbn = '{isbn}'") stok = cursor.fetchone()[0] if stok < 1: print("Buku tidak tersedia!") return tgl_pinjam = datetime.now().date() tgl_kembali = tgl_pinjam + timedelta(days=7) query = """ INSERT INTO transaksi (id_anggota, isbn_buku, tgl_pinjam, tgl_kembali, status) VALUES (%s, %s, %s, %s, 'Dipinjam') """ val = (id_anggota, isbn, tgl_pinjam, tgl_kembali) try: cursor.execute(query, val) # Kurangi stok buku cursor.execute(f"UPDATE buku SET stok = stok - 1 WHERE isbn = '{isbn}'") db.commit() print(f"Buku berhasil dipinjam, harus dikembalikan sebelum {tgl_kembali}") except mysql.connector.Error as err: print(f"Error: {err}")
d. Fungsi Pencarian Buku:
def cari_buku(): keyword = input("\nMasukkan judul/pengarang: ") query = f""" SELECT isbn, judul, pengarang, tahun, stok FROM buku WHERE judul LIKE '%{keyword}%' OR pengarang LIKE '%{keyword}%' """ cursor.execute(query) results = cursor.fetchall() if not results: print("Buku tidak ditemukan") return print("\nHASIL PENCARIAN:") for book in results: print(f"ISBN: {book[0]}") print(f"Judul: {book[1]}") print(f"Pengarang: {book[2]}") print(f"Tahun: {book[3]}") print(f"Stok: {book[4]}\n")
4. Contoh Data dan Output
Data Sample:
INSERT INTO anggota VALUES (1, 'Andi Wijaya', 'Jl. Merdeka No.1', '0812345678', 'andi@email.com'); INSERT INTO buku VALUES ('9786020322936', 'Laskar Pelangi', 'Andrea Hirata', 2005, 5), ('9786020324565', 'Bumi Manusia', 'Pramoedya Ananta Toer', 1980, 3);
Output Program:
5. Challenge/Tugas
- Tambahkan fitur pengembalian buku dengan perhitungan denda (Rp5000/hari)
- Buat laporan daftar buku yang sedang dipinjam
- Implementasikan pencarian anggota berdasarkan nama/ID
Contoh Solusi (Point 1):
def kembalikan_buku(): id_transaksi = int(input("ID Transaksi: ")) # Dapatkan tgl kembali seharusnya cursor.execute(f"SELECT tgl_kembali FROM transaksi WHERE id = {id_transaksi}") tgl_kembali = cursor.fetchone()[0] terlambat = (datetime.now().date() - tgl_kembali).days denda = max(0, terlambat) * 5000 query = f""" UPDATE transaksi SET status = {'Terlambat' if terlambat > 0 else 'Dikembalikan'} WHERE id = {id_transaksi} """ cursor.execute(query) cursor.execute(f"UPDATE buku b JOIN transaksi t ON b.isbn = t.isbn_buku SET b.stok = b.stok + 1 WHERE t.id = {id_transaksi}") db.commit() print(f"Buku telah dikembalikan. {'Denda: Rp'+str(denda) if denda > 0 else 'Tidak ada denda'}")
6. Kesimpulan
Studi kasus ini menunjukkan:
- Proses desain database untuk sistem nyata
- Implementasi operasi CRUD dengan Python-MySQL
- Penanganan relasi antar tabel
- Validasi data sederhana
Database yang baik harus memenuhi:
- Integritas data (constraint, foreign key)
- Konsistensi (transaksi atomic)
- Keamanan (validasi input)