title: “Studi Kasus Implementasi Basis Data Pada Sistem Manajemen Toko Hadiah” author: “Chintya Heppy Putri Panjaitan” date: “2025-11-30” output: html_document —

Pendahuluan

Laporan ini menjelaskan proses pembuatan dan pengelolaan basis data untuk sistem manajemen toko hadiah menggunakan bahasa pemrograman R, database SQLite, serta paket DBI, RSQLite, dan dplyr.
Basis data dirancang untuk mengelola informasi staf, pengunjung, gift set, pembungkus, kartu ucapan, pesanan custom, dan riwayat pembelian.

Tujuan implementasi ini adalah untuk menampilkan bagaimana R dapat digunakan untuk membuat tabel, memasukkan data, memperbarui data, serta mengambil data melalui query SQL.


Program R: Implementasi Basis Data

# Import package
library(DBI)
## Warning: package 'DBI' was built under R version 4.3.3
library(RSQLite)
## Warning: package 'RSQLite' was built under R version 4.3.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.3
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# Koneksi database
con <- dbConnect(SQLite(), ":memory:")

Membuat Tabel

Pada tahap ini, beberapa tabel dibuat untuk merepresentasikan entitas dalam sistem toko hadiah.
Tabel-tabel tersebut meliputi staf, pengunjung, gift_set, pembungkus, ucapan, pesanan_custom, dan riwayat_pembelian.

# Membuat tabel
dbExecute(con, "
  CREATE TABLE staf (
    id_staf TEXT PRIMARY KEY,
    nama_staf TEXT,
    peran TEXT,
    masa_kerja INTEGER
  );
")
## [1] 0
dbExecute(con, "
  CREATE TABLE pengunjung (
    id_pengunjung TEXT PRIMARY KEY,
    nama_pengunjung TEXT,
    preferensi_hadiah TEXT
  );
")
## [1] 0
dbExecute(con, "
  CREATE TABLE gift_set (
    id_set TEXT PRIMARY KEY,
    nama_set TEXT,
    tema TEXT,
    harga REAL
  );
")
## [1] 0
dbExecute(con, "
  CREATE TABLE pembungkus (
    id_pembungkus TEXT PRIMARY KEY,
    jenis_pembungkus TEXT,
    warna TEXT,
    biaya_tambahan REAL
  );
")
## [1] 0
dbExecute(con, "
  CREATE TABLE ucapan (
    id_ucapan TEXT PRIMARY KEY,
    tipe_kartu TEXT,
    panjang_pesan INTEGER
  );
")
## [1] 0
dbExecute(con, "
  CREATE TABLE pesanan_custom (
    id_pesanan TEXT PRIMARY KEY,
    id_pengunjung TEXT,
    id_set TEXT,
    id_pembungkus TEXT,
    id_ucapan TEXT,
    instruksi_khusus TEXT,
    tanggal_pesanan TEXT,
    FOREIGN KEY (id_pengunjung) REFERENCES pengunjung(id_pengunjung),
    FOREIGN KEY (id_set) REFERENCES gift_set(id_set),
    FOREIGN KEY (id_pembungkus) REFERENCES pembungkus(id_pembungkus),
    FOREIGN KEY (id_ucapan) REFERENCES ucapan(id_ucapan)
  );
")
## [1] 0
dbExecute(con, "
  CREATE TABLE riwayat_pembelian (
    id_transaksi TEXT PRIMARY KEY,
    id_pesanan TEXT,
    id_staf TEXT,
    metode_pembayaran TEXT,
    total_bayar REAL,
    tanggal_bayar TEXT,
    FOREIGN KEY (id_pesanan) REFERENCES pesanan_custom(id_pesanan),
    FOREIGN KEY (id_staf) REFERENCES staf(id_staf)
  );
")
## [1] 0

Memasukkan Data

Data dimasukkan ke setiap tabel untuk mensimulasikan transaksi nyata dalam toko hadiah.

# Insert data
dbExecute(con, "
  INSERT INTO staf VALUES
    ('S1A241', 'Septi Rahmadani', 'Perangkai Hadiah', 3),
    ('S1A223', 'Olifia Zalianti', 'Perangkai Hadiah', 1),
    ('S2A202', 'Mei Indriyani', 'Kasir', 2);
")
## [1] 3
dbExecute(con, "
  INSERT INTO pengunjung VALUES
    ('P1A011', 'Ahyum Faat', 'Bayi & Anak'),
    ('P1A261', 'Rifqy Haninda', 'Mainan'),
    ('P1A262', 'Chintya Panjaitan', 'Hiasan Rumah');
")
## [1] 3
dbExecute(con, "
  INSERT INTO gift_set VALUES
    ('G1A201', 'Alat Mandi Bayi', 'Bayi & Anak', 500000),
    ('G1B202', 'Boneka Kucing', 'Mainan', 80000),
    ('G1P202', 'Pohon Natal', 'Hiasan Rumah', 1320000);
")
## [1] 3
dbExecute(con, "
  INSERT INTO pembungkus VALUES
    ('PEM233', 'Kardus Premium', 'Putih', 50000),
    ('PEM211', 'Kertas Kado', 'Merah', 30000),
    ('PEM212', 'Kotak Kayu', 'Cokelat', 300000);
")
## [1] 3
dbExecute(con, "
  INSERT INTO ucapan VALUES
    ('CSTM01', 'Kartu Ucapan Elegan', 200),
    ('CSTM04', 'Mini Tag', 50),
    ('CSTM12', 'Kartu Custom Foto', 300);
")
## [1] 3
dbExecute(con, "
  INSERT INTO pesanan_custom VALUES
    ('PC001', 'P1A011', 'G1A201', 'PEM233', 'CSTM01', 'Tulis ucapan selamat kelahiran bayi perempuan.', '2025-06-01'),
    ('PC002', 'P1A261', 'G1B202', 'PEM211', 'CSTM04', 'Tambahkan Pita Emas Besar.', '2025-06-03'),
    ('PC003', 'P1A262', 'G1P202', 'PEM212', 'CSTM12', 'Tulis ucapan selamat natal.', '2025-06-05');
")
## [1] 3
dbExecute(con, "
  INSERT INTO riwayat_pembelian VALUES
    (6, 'PC001', 'S1A241', 'QRIS', 550000, '2025-06-01'),
    (12, 'PC002', 'S1A223', 'Tunai', 110000, '2025-06-03'),
    (21, 'PC003', 'S2A202', 'Transfer', 1620000, '2025-06-05');
")
## [1] 3

Melihat Tabel & Query

Bagian ini digunakan untuk melihat tabel yang tersedia serta menjalankan berbagai query seperti sorting, filtering, dan join.

dbListTables(con)
## [1] "gift_set"          "pembungkus"        "pengunjung"       
## [4] "pesanan_custom"    "riwayat_pembelian" "staf"             
## [7] "ucapan"
dbGetQuery(con, "SELECT * FROM riwayat_pembelian")
##   id_transaksi id_pesanan id_staf metode_pembayaran total_bayar tanggal_bayar
## 1            6      PC001  S1A241              QRIS      550000    2025-06-01
## 2           12      PC002  S1A223             Tunai      110000    2025-06-03
## 3           21      PC003  S2A202          Transfer     1620000    2025-06-05
dbGetQuery(con, "
  SELECT * FROM riwayat_pembelian
  ORDER BY total_bayar ASC;
")
##   id_transaksi id_pesanan id_staf metode_pembayaran total_bayar tanggal_bayar
## 1           12      PC002  S1A223             Tunai      110000    2025-06-03
## 2            6      PC001  S1A241              QRIS      550000    2025-06-01
## 3           21      PC003  S2A202          Transfer     1620000    2025-06-05
dbGetQuery(con, "
  SELECT * FROM riwayat_pembelian
  ORDER BY total_bayar DESC;
")
##   id_transaksi id_pesanan id_staf metode_pembayaran total_bayar tanggal_bayar
## 1           21      PC003  S2A202          Transfer     1620000    2025-06-05
## 2            6      PC001  S1A241              QRIS      550000    2025-06-01
## 3           12      PC002  S1A223             Tunai      110000    2025-06-03
dbGetQuery(con, "
  SELECT * FROM riwayat_pembelian
  WHERE total_bayar > 1000000
  ORDER BY tanggal_bayar ASC;
")
##   id_transaksi id_pesanan id_staf metode_pembayaran total_bayar tanggal_bayar
## 1           21      PC003  S2A202          Transfer     1620000    2025-06-05

Update Data

Pada contoh ini, harga gift set tertentu diperbarui.

dbExecute(con, "
  UPDATE gift_set
  SET harga = harga + 50000
  WHERE id_set = 'G1B202';
")
## [1] 1
dbGetQuery(con, "SELECT * FROM gift_set WHERE id_set = 'G1B202';")
##   id_set      nama_set   tema  harga
## 1 G1B202 Boneka Kucing Mainan 130000

Join Data untuk Laporan

Query join digunakan untuk membuat laporan lengkap tentang transaksi.

query_laporan <- "
  SELECT rb.id_transaksi,
         pg.nama_pengunjung AS pengunjung,
         gs.nama_set AS set_hadiah,
         pb.jenis_pembungkus AS pembungkus,
         u.tipe_kartu AS kartu_ucapan,
         rb.metode_pembayaran,
         rb.total_bayar,
         rb.tanggal_bayar,
         s.nama_staf AS staf
  FROM riwayat_pembelian rb
  JOIN pesanan_custom pc ON rb.id_pesanan = pc.id_pesanan
  JOIN pengunjung pg ON pc.id_pengunjung = pg.id_pengunjung
  JOIN gift_set gs ON pc.id_set = gs.id_set
  JOIN pembungkus pb ON pc.id_pembungkus = pb.id_pembungkus
  JOIN ucapan u ON pc.id_ucapan = u.id_ucapan
  JOIN staf s ON rb.id_staf = s.id_staf;
"

laporan <- dbGetQuery(con, query_laporan)
laporan
##   id_transaksi        pengunjung      set_hadiah     pembungkus
## 1            6        Ahyum Faat Alat Mandi Bayi Kardus Premium
## 2           12     Rifqy Haninda   Boneka Kucing    Kertas Kado
## 3           21 Chintya Panjaitan     Pohon Natal     Kotak Kayu
##          kartu_ucapan metode_pembayaran total_bayar tanggal_bayar
## 1 Kartu Ucapan Elegan              QRIS      550000    2025-06-01
## 2            Mini Tag             Tunai      110000    2025-06-03
## 3   Kartu Custom Foto          Transfer     1620000    2025-06-05
##              staf
## 1 Septi Rahmadani
## 2 Olifia Zalianti
## 3   Mei Indriyani

Kesimpulan

Dari implementasi ini dapat disimpulkan bahwa R dapat digunakan tidak hanya untuk analisis statistik, tetapi juga untuk membuat dan mengelola basis data dengan struktur yang kompleks.
Seluruh proses mulai dari pembuatan tabel, pengisian data, pembaruan data, hingga pembuatan laporan dapat dilakukan dengan mudah menggunakan kombinasi SQLite, DBI, dan RSQLite.

Pendekatan ini sangat bermanfaat untuk membuat simulasi sistem informasi sederhana tanpa harus membuat database eksternal secara manual.