title: “Studi Kasus Implementasi Basis Data Pada Sistem Manajemen Toko Hadiah” author: “Chintya Heppy Putri Panjaitan” date: “2025-11-30” output: html_document —
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.
# 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:")
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
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
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
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
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
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.