Studi Kasus Databases: Sistem Manajemen Perpustakaan Digital

Studi Kasus Databases: Sistem Manajemen Perpustakaan Digital

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:

  1. Anggota (ID, nama, alamat, no_telp, email)
  2. Buku (ISBN, judul, pengarang, tahun, stok)
  3. Transaksi (ID, id_anggota, isbn_buku, tgl_pinjam, tgl_kembali, status)

2. Desain Database

Diagram Relasional:

mermaid
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:

sql
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:

python
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:

python
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:

python
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:

python
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:

sql
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

  1. Tambahkan fitur pengembalian buku dengan perhitungan denda (Rp5000/hari)
  2. Buat laporan daftar buku yang sedang dipinjam
  3. Implementasikan pencarian anggota berdasarkan nama/ID

Contoh Solusi (Point 1):

python
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:

  1. Proses desain database untuk sistem nyata
  2. Implementasi operasi CRUD dengan Python-MySQL
  3. Penanganan relasi antar tabel
  4. Validasi data sederhana

Database yang baik harus memenuhi:

  • Integritas data (constraint, foreign key)
  • Konsistensi (transaksi atomic)
  • Keamanan (validasi input)

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *