Lewati ke isi
ORACLEDECK

Audit

Audit materi dan proyek terdahulu

Pemeriksaan jujur terhadap skema praktikum, laporan Project UAS Kelompok 3, dan proyek ini sendiri — beserta perbaikan yang sudah diterapkan.

Audit ini memeriksa tiga hal: skema praktikum yang dipakai sepanjang mata kuliah,

Project UAS Kelompok 3 beserta repositori kodenya, dan proyek ORACLEDECK ini sendiri.

Setiap temuan disertai bukti dan perbaikan yang sudah diterapkan.

Yang diperiksa langsung (bukan disimpulkan): berkas 01_database_schema.sql,

hospital_db_manager.py, .env.example, keluaran git ls-files pada repositori

Tugas 3 - Hospital, serta LAPORAN_DBMS_RUMAHSAKIT_LENGKAP.md.


1. Skema praktikum rumah sakit

Enam tabel dari Praktikum 2. Yang berikut bukan soal selera — masing-masing punya akibat

yang bisa diukur.

1.1 Temuan tingkat tinggi

#TemuanBuktiAkibatTingkat
A1ON DELETE CASCADE pada pasien_dokter01_database_schema.sql baris FKMenghapus satu dokter menghapus seluruh riwayat pemeriksaannya. Rekam medis elektronik wajib disimpan paling singkat 25 tahun sejak kunjungan terakhir pasien (Permenkes 24/2022 Pasal 39).Kritis
A2no_hp bertipe numerik pada sebagian generatorTerkaan tipe dari data contohNol di depan hilang: 081234567001 menjadi 81234567001. Nomor menjadi tidak bisa dihubungi.Kritis
A3nohp UNIQUE pada laporan Kelompok 3LAPORAN ... 5.2Satu keluarga sering memakai satu nomor. Pasien kedua ditolak sistem.Tinggi
A4Tidak ada kolom kunci fragmentasiSeluruh skemaTanpa kolom seperti kota, fragmentasi horizontal tidak punya dasar — padahal ini mata kuliah basis data terdistribusi.Tinggi
A5jenis_kelamin VARCHAR(1) tanpa CHECKSkema + komentar laporanLaporan menulis 1=Pria, 0=Wanita, data contoh memakai L/P. Dua konvensi dalam satu proyek.Sedang
A6penyakit VARCHAR(100) teks bebasSkema"Demam Berdarah", "DBD", dan "demam berdarah" menjadi tiga penyakit berbeda saat dikelompokkan.Sedang
A7INT(3) dipakai sebagai pembatas nilaiSkemaINT(3) hanya lebar tampilan, bukan batas nilai. Sudah deprecated sejak MySQL 8.0.19.Sedang
A8Tidak ada unik gabungan pada pasien_dokterSkemaSatu pemeriksaan bisa tercatat dua kali tanpa ada yang menghalangi.Sedang
A9Tidak ada kolom jejak auditSeluruh skemaTidak ada dibuat_pada, diubah_pada, maupun diubah_oleh. Pada data kesehatan ini masalah kepatuhan, bukan kenyamanan.Sedang
A10Data kesehatan tanpa kendali khususSeluruh skemaData kesehatan tergolong data pribadi spesifik (UU PDP No. 27/2022 Pasal 4 ayat 2). Wajib ada pembatasan akses dan pencatatan akses.Tinggi

1.2 Perbaikan yang diterapkan di ORACLEDECK


-- SEBELUM (Praktikum 2)
CREATE TABLE pasien (
  id_pasien INT(3) PRIMARY KEY,      -- lebar tampilan, bukan batas nilai
  nama_pasien VARCHAR(30) NOT NULL,
  jenis_kelamin VARCHAR(1),          -- tanpa CHECK
  penyakit VARCHAR(100),             -- teks bebas
  no_hp VARCHAR(15)                  -- tanpa keunikan yang tepat
);

-- SESUDAH (02_skema_global.sql)
CREATE TABLE PASIEN (
  ID_PASIEN     NUMBER(8) NOT NULL,
  NAMA_PASIEN   VARCHAR2(60),
  JENIS_KELAMIN CHAR(1),
  PENYAKIT      VARCHAR2(100),
  NO_HP         VARCHAR2(20),        -- VARCHAR2: nol di depan aman
  KOTA          VARCHAR2(40),        -- kunci fragmentasi horizontal
  CONSTRAINT PK_PASIEN PRIMARY KEY (ID_PASIEN),
  CONSTRAINT CK_PASIEN_JK CHECK (JENIS_KELAMIN IN ('L','P'))
);

Perubahan lain: kolom biaya dan tanggal_daftar ditambahkan agar laporan dapat diuji,

ON DELETE CASCADE tetap dipakai hanya pada tabel penghubung murni, dan seluruh foreign key

diberi indeks penunjang.

Pemeriksaan tipe terkaan itu sendiri diuji: engine/oracle/emit.js menolak menjadikan

kolom bernama no_hp, nik, npwp, ktp, atau kode_pos sebagai NUMBER, dan setiap

nilai teks berawalan nol tetap VARCHAR2. Uji yang menjaganya ada di tests/oracle-emit.test.js.

1.3 Yang belum diperbaiki dan alasannya

dari lembar praktikum, sehingga situs tetap memakai teks bebas agar contohnya masih

bisa dicocokkan dengan soal aslinya. Rekomendasinya ada di bagian 4.

lisensi Advanced Security pada edisi berbayar dan tidak dapat diuji tanpa instans.


1A. Materi kuliah

Materi juga diaudit, karena contoh di modul ikut dipakai sebagai acuan jawaban.

1A.1 Contoh fragmentasi S1/S2 pada Modul 6 dan 7 tidak disjoint

Modul menaruh sex, DOB, dan salary di fragmen vertikal S1 dan di S2

(yang kemudian dipecah menjadi S21, S22, S23). Diuji dengan menjalankan operator

relasional atas data sungguhan di Lab Perancang Fragmentasi:

AturanHasilKeterangan
KelengkapanLulussemua atribut dan semua tupel tiap kelompok horizontal terliput
RekonstruksiLulusSTAFF = S1 ⋈ (S21 ∪ S22 ∪ S23) mengembalikan 10 dari 10 tupel
KedisjoinanGagalatribut non-kunci sex, dob, salary muncul di dua fragmen vertikal

Akibat praktisnya: setiap perubahan gaji harus ditulis ke dua fragmen yang disimpan di situs

berbeda, dan keduanya bisa tidak sinkron. Lab menampilkan versi yang diperbaiki (S2 hanya

memuat staffno, fname, lname, branchno) yang lulus ketiga aturan. Uji regresinya ada di

tests/ddb-fragment.test.js, grup "fragmentasi campuran".

Satu inkonsistensi kecil lain di contoh yang sama: teks menyebut S1 ditempatkan di site 3,

tetapi kueri transparansi pemetaan lokal menulis FROM S1 AT SITE 5. ORACLEDECK mengikuti

definisi penempatannya (site 3).

1A.2 Studi kasus skripsi kependudukan: klaim konsistensi tanpa transaksi atomik

Skripsi di folder mata kuliah (*Implementasi Basis Data Terdistribusi untuk Meningkatkan

Konsistensi Data Kependudukan*, UIN Sunan Kalijaga, 2016) menyambung Oracle XE kecamatan

dengan MySQL desa lewat database link berbasis ODBC, dan menyimpulkan data tidak akan hilang

karena sudah direplikasi.

Dokumentasi Oracle untuk gateway itu menyatakan ia *cannot participate in distributed

transactions; only single-site transactions supported*, dan pada mode

SINGLE_SITE_AUTOCOMMIT setiap perubahan langsung di-commit

(Oracle Database Gateway for ODBC Features and Restrictions).

Artinya transaksi yang mengubah Oracle dan MySQL sekaligus tidak dapat dijamin atomik — tepat

keterbatasan gateway yang sudah diperingatkan Modul 1. Simulator 2PC/3PC kini punya peserta

"di balik gateway" untuk menunjukkan hasil campurannya, dan Lab Studi Kasus Kependudukan

membedahnya lengkap dengan data karangan.

1A.3 Dokumen salah folder

Folder SBDT juga berisi dokumen mata kuliah Manajemen Proyek Perangkat Lunak: dua salinan

20251104_UTS Manajemen Proyek Perangkat Lunak, UTS MPPL - 20210801207 - Daniel Hutajulu.pdf,

Pertemuan 8_MPPL (2).pptx, dan jawaban soal perencanaan risiko proyek. Dokumen-dokumen itu

sengaja tidak dimasukkan ke situs ini karena bukan materi basis data terdistribusi.


2. Project UAS Kelompok 3

Laporannya rapi dan lengkap — 1.240 baris, ERD, skrip, dan dokumentasi pengujian.

Tiga hal berikut perlu dikoreksi sebelum dipakai sebagai rujukan.

2.1 Klaim yang tidak didukung bukti

Klaim di laporanMasalahnya
"Project Status: COMPLETE & PRODUCTION-READY"Koneksi yang didokumentasikan memakai root dengan sandi kosong (phpMyAdmin → Login: SUCCESS (root / kosong)). Tidak ada sistem produksi yang berjalan begitu.
Tabel "Query Performance Testing" dengan angka <50ms, <100msTabel terbesar berisi 30 baris. Pada ukuran itu, angka tersebut mengukur latensi klien, bukan kinerja kueri. Tidak ada metodologi, jumlah pengulangan, maupun keadaan cache yang disebutkan.
"Testing & Validation Results ✅"Isinya daftar centang hasil klik manual di DBeaver dan phpMyAdmin — bukan pengujian yang dapat diulang orang lain.
"Optimal untuk database size <100K records"Tidak ada tolok ukur yang mendasarinya.
"Backup created: READY"Strategi cadangannya ekspor manual lewat phpMyAdmin. Tidak ada satu pun langkah yang menguji pemulihannya. Cadangan yang belum pernah dipulihkan belum bisa disebut cadangan.

2.2 Kesenjangan terbesar: tidak ada aspek terdistribusi

Ini temuan paling penting. Project UAS untuk mata kuliah Sistem Basis Data Terdistribusi

menghasilkan basis data MySQL satu instans, satu mesin, tanpa:

Seluruh isi laporan dapat dikerjakan pada mata kuliah Basis Data dasar. Bagian 2 sampai 14

Rencana Pembelajaran Semester tidak tersentuh sama sekali.

Perbaikan di ORACLEDECK: rancangan yang sama dibawa sampai ke bentuk terdistribusi —

PARTITION BY LIST (KOTA) per situs, PARTITION BY REFERENCE untuk tabel anak,

materialized view untuk tabel referensi, database link antar situs, dan diagnosa

DBA_2PC_PENDING. Semuanya ada di folder oracle/.

2.3 Repositori Tugas 3 - Hospital

Diperiksa lewat git ls-files (23 berkas terlacak):

TemuanBuktiTingkat
exported-assets (1).zip ikut di-committercantum di git ls-filesRendah — arsip biner membuat riwayat repo membengkak dan tidak bisa di-diff
Sebelas berkas script.pyscript_10.pytercantum di git ls-filesRendah — tidak ada satu pun nama yang menjelaskan isinya
.env.example memakai DB_USER=root, DB_PASSWORD= kosongisi berkasSedang — berkas contoh menjadi pola yang disalin orang lain apa adanya
Sandi baku password='' di konstruktorhospital_db_manager.py baris 18Sedang — sama seperti di atas
venv/ ada di direktori kerjadaftar berkas direktoriRendah — sudah tidak terlacak git, jadi hanya mengotori direktori lokal

Yang ternyata sudah benar dan layak disebut: hospital_db_manager.py tidak rentan

injeksi SQL. Satu-satunya f-string yang membentuk kueri (baris 174) hanya menyusun nama

kolom dari daftar tetap, sedangkan seluruh nilai tetap lewat placeholder %s. Ini poin

yang sering salah di kode mahasiswa, dan di sini sudah tepat.


3. Audit proyek ini sendiri

Proyek yang mengaudit orang lain harus siap diaudit.

3.1 Yang benar-benar diverifikasi

AspekCara verifikasiHasil
Mesin relasional, SQL & DML, terminal, algoritma terdistribusi, penilai soal, pembantu build, pemeriksa situs677 uji otomatis di NodeLulus semua — node tests/run.js
Semantik SQL dan DML53 kueri (termasuk CASE, EXISTS berkorelasi, WITH, INTERSECT/EXCEPT, ORDER BY + LIMIT pada UNION) dan 7 skrip INSERT/UPDATE/DELETE dijalankan di mesin ini dan di SQLite 3.50.4, hasil dibandingkan baris demi baris60/60 identik — python tools/verify_sqlite.py
Contoh dan kueri per topik di situs40 contoh Terminal SQL dan 31 kueri "Coba di terminal" dijalankan pada preset masing-masing; galat yang disengaja wajib muncul dengan kode ORA yang dijanjikanLulus semua
Tombol ▶ JalankanDipasang hanya bila SQL berjalan tanpa galat pada salah satu preset — diperiksa saat build (materi) dan saat peramban senggang (keluaran lab)11 blok DDL khusus Oracle di Lab Generator DDL dengan benar tidak diberi tombol
Ekspor terminalSkrip \ekspor dari empat preset dijalankan ulang pada skema kosong; jumlah baris setiap tabel dibandingkanIdentik
Anggaran kinerjaMedian pratinjau seluruh contoh < 16 ms, maksimum < 250 ms, pelengkap otomatis < 8 ms per panggilan (uji Node; CI)Lulus
Aturan kebenaran fragmentasiOperator relasional dijalankan atas data sungguhan, bukan diperiksa dari definisiLulus
Reduksi lokalisasiHasil dari fragmen dibandingkan dengan hasil kueri atas relasi global untuk setiap predikat ujiSetara semuanya
Strategi join terdistribusiKeempat strategi dijalankan, hasilnya dibandingkan sebagai himpunanIdentik semuanya
2PC dan 3PCMesin keadaan dijalankan dengan injeksi kegagalanSifat blokir/tidak-blokir terbukti sesuai teori
Bentuk DDL Oracle40+ uji atas pembangkitnyaLulus
Keluaran situstools/cek_situs.js: 907 tautan, 91 impor modul, 37 URL sitemap, judul unik, CSP, skrip inline, satu <h1>, landmark, urutan judul, label, kebocoran surel/teleponBersih
Build deterministikDua kali build berturut-turut dibandingkan berkas demi berkasIdentik
Seluruh 16 lab + beranda, materi, kualitas, glosarium di perambanDimuat satu per satu sambil menangkap galat konsol; terminal diketik sungguhan (Tab-lengkapi, Enter, pratinjau), laci terminal dari materi menjalankan 2PC, bank soal DML dinilai saat mengetik, pencarian Ctrl+K, catatan istilah, ganti temaNol galat konsol
Tata letak ponselTerminal dan materi diukur pada lebar 375 pxTidak ada yang melebar

3.1a Bug yang ditemukan saat merender sungguhan — dan sudah diperbaiki

Seluruh uji unit lulus ketika bug-bug berikut masih ada. Semuanya baru ketahuan setelah situs

dibuka dan diklik di peramban. Masing-masing kini punya uji regresi.

BugGejalaPerbaikan
Audit fragmentasi campuran dinilai datarContoh Modul 6 tampil "Rekonstruksi GAGAL, 0 tupel", karena dihitung S1 ⋈ S21 ⋈ S22 ⋈ S23Penilaian bertingkat: anak horizontal disatukan dulu, baru tingkat vertikal dinilai
Variabel mode dibayangi di lab fragmentasiLab akan berhenti dengan ReferenceErrorDiganti nama sebelum dirilis
Modul lama tertahan di cache perambanHalaman baru berpasangan dengan mesin lama tanpa pesan galatSetiap impor dan aset diberi ?v=<sidik isi> saat build
Navigasi disembunyikan di bawah 860 pxPengguna ponsel tidak bisa berpindah halamanBaris navigasi yang dapat digeser
Anak grid CSS tidak boleh menyusutTabel lebar memaksa halaman ponsel melebar dua kali lipatmin-width: 0 pada anak grid
2PC dengan koordinator jatuh di "fase 4"Tampil "selesai" tanpa penjelasan, padahal fase itu hanya ada di 3PCDijelaskan eksplisit pada analisis 2PC
Parser jadwal konkurensiToken asing seperti hello diabaikan diam-diam, analisis memakai jadwal yang terbaca sebagianSetiap token wajib sah, token asing ditolak

3.1b Temuan putaran upgrade 2.0.0 — dan sudah diperbaiki

TemuanGejalaPerbaikan
Dekomposisi pada rantai UNION tiga cabangGalat karena cabang kiri dianggap SELECT padahal masih UNIONcabangSelect mengurai seluruh pohon WITH/UNION/INTERSECT/MINUS; setiap cabang dianalisis
Penilai soal membaca ORDER BY di cabang kanan UNIONSetelah parser mengangkat ORDER BY ke simpul himpunan, urutan tidak lagi dinilaipunyaOrderBy membaca simpul himpunan dan badan WITH
Pesan GROUP BY menyesatkanSELECT nim FROM mhs GROUP BY alamat_mhs berkata "kolom nim tidak ada"ORA-00979 / ORA-00937 dengan contoh yang benar
soal.js mengimpor ../../engineBenar di src/, tetapi di docs/content/ menunjuk ke luar situs (404 di GitHub Pages)Soal memakai penanda integritas: 'cascade'; penilai yang memetakan ke kunci
Tombol Enter di terminal saat diuji otomatisAlat uji mengirim Return tanpa key; diverifikasi ulang dengan Enter sungguhanTidak ada bug; dicatat agar uji berikutnya memakai tombol yang benar
Pratinjau berbasis requestAnimationFrameHasil pratinjau tertinggal satu ketikan bila panel peramban tidak menggambar framePenjadwal digabung per putaran event loop (setTimeout 0)
Catatan istilah pendek di dalam frasa panjang"fragmentasi" ditandai di dalam "fragmentasi horizontal" kemunculan keduaFrasa istilah yang lebih panjang mengunci seluruh kemunculannya
Urutan judulHalaman audit, daftar materi, dan daftar lab meloncat dari h1 ke h3Markdown ##h2; judul kartu daftar → h2
Karakter kontrol mentahPenulisan berkas mengubah \u0001 menjadi byte kontrol di pewarna SQL terminalDikembalikan ke escape; skrip pemindai memastikan tidak ada byte kontrol di sumber

3.1c Putaran 2.1.0 — dijalankan di Oracle sungguhan

Seluruh skrip oracle/ dijalankan pada Oracle AI Database 26ai Free Release 23.26.3.0.0 (container

gvenzl/oracle-free:23-slim, tiga PDB + database link): 21/21 skrip lulus, 60 pemeriksaan mandiri LULUS. Mesin terminal

dibandingkan dengan Oracle yang sama: kueri 53/53, DML 7/7, kode galat 39/39, ekspor 4/4. Bukti: oracle/HASIL_UJI.md,

oracle/VERIFIKASI_MESIN.md, log SQL*Plus di oracle/bukti/.

Skrip versi 2.0.0 — yang hanya diuji pembangkitnya — ternyata tidak akan berjalan di Oracle:

TemuanBukti dari OraclePerbaikan
Nama PDB XEPDB1 tertulis matiOracle Free memakai FREEPDB1Situs dan layanan menjadi parameter runner
MV log dibuat lewat database linkDDL ke basis data remote ditolakMV log di situs sumber (Langkah 11), MV di replika (Langkah 12)
UPDATE kolom kunci partisiORA-14402 tanpa ENABLE ROW MOVEMENTDiperagakan sebagai galat, lalu ROW MOVEMENT diaktifkan
AT SITE dan link SITES1_LINKBukan sintaks Oracle; link dan sinonim PASIEN_JAKARTA tidak pernah dibuatLima tingkat transparansi ditulis ulang dengan objek yang benar-benar ada
Data contoh dimuat di langkah terakhirLangkah transaksi dan rencana eksekusi berjalan atas tabel kosongData dimuat di Langkah 5
PARTITION BY REFERENCE setelah induk ROW MOVEMENTORA-14661Anak ikut ENABLE ROW MOVEMENT
Membaca DBA_2PC_PENDING tepat setelah ORA-02054Masih kosong — catatan ditulis asinkronPolling sampai catatan muncul
COMMIT FORCE setelah kueri lewat linkORA-02043COMMIT dulu
PURGE_LOST_DB_ENTRY sebagai pemilik skemaORA-00942 pada SYS.PENDING_TRANS$Dijalankan sebagai SYS (Langkah 14d)

Verifikasi silang juga menemukan mesin terminal menyimpang dari Oracle, dan sudah disamakan:

kolom salah pada tabel kosong lolos tanpa galat (Oracle memeriksa saat parse), TRUNCATE induk

selalu ditolak padahal Oracle 23ai mengizinkannya bila anak kosong, CHECK tingkat kolom yang

menyebut kolom lain (ORA-02438), pengurai tanggal yang terlalu ketat, dan pembacaan tabel yang

dikunci transaksi ragu-ragu (Oracle menolak dengan ORA-01591).

3.2 Yang TIDAK diverifikasi — batas yang jujur

1. Tiga situs diuji dalam satu container Oracle Free, bukan tiga server. Latensi, partisi

jaringan sungguhan, dan perbedaan versi antarsitus tidak ikut teruji. Kegagalan 2PC

disimulasikan dengan fasilitas resmi ORA-2PC-CRASH-TEST-n, bukan dengan mematikan server.

2. Model biaya adalah model, bukan pengukuran. Angka biaya pada Lab Alokasi dan Lab Join

memakai fungsi biaya abstrak (biaya per pesan + biaya per byte). Ia menunjukkan arah dan

titik impas dengan benar, tetapi angkanya bukan milidetik pada jaringan sungguhan.

3. Simulator 2PC/3PC menyederhanakan waktu. Tidak ada jam sungguhan, tidak ada pesan yang

datang tidak berurutan, tidak ada kegagalan sebagian pesan. Sifat yang ditunjukkan

(blokir vs tidak blokir) benar; ketepatan waktunya bukan tujuan.

4. Terminal SQL bukan Oracle. SELECT lanjutan, DML, DDL, transaksi, dan kamus data sudah

didukung, tetapi belum ada window function, MERGE, ALTER TABLE, PL/SQL, sequence, dan

trigger. Rencana eksekusi mengikuti evaluasi logis, bukan pengoptimal biaya Oracle. Kode

galat dijamin sama dengan Oracle hanya untuk kasus terdaftar; teks pesannya ditulis ulang.

Kunci transaksi ragu-ragu diterapkan per tabel, sedangkan Oracle menguncinya per baris.

4a. Kontras warna dan pembaca layar belum diuji. Pemeriksa situs hanya memeriksa struktur

HTML statis (judul, landmark, label, alt). Isi yang digambar skrip lab dan kontras setiap

kombinasi tema belum diaudit dengan alat khusus maupun pembaca layar sungguhan.

5. Situs hanya berbahasa Indonesia. Materinya berbahasa Indonesia dan pembacanya peserta

kuliah berbahasa Indonesia. Versi dwibahasa yang setengah jadi lebih buruk daripada satu

bahasa yang utuh — jadi tidak dipaksakan. Lihat rekomendasi bagian 4.

6. Data contoh adalah data karangan. Nama pasien, dokter, dan penyakit dibuat sendiri.

Tidak ada satu pun data pribadi nyata di repositori ini.

3.3 Utang teknis yang diketahui

engine/core/terminal.js ~1.100 baris. Keduanya masih terbaca dan teruji, tetapi sudah waktunya

dipecah: parser DDL ke ddl.js, kamus data dan preset ke modul sendiri.

(puluhan baris) tidak terasa; untuk data ribuan baris perlu salinan malas (copy-on-write).

20 atribut. Untuk keperluan kuliah ini cukup; untuk skema nyata perlu algoritma yang lebih baik.

pencariannya melampaui 200.000 kombinasi. Batas itu ditetapkan berdasarkan kenyamanan,

bukan pengukuran.


4. Rekomendasi

Diurutkan menurut dampak dibagi usaha.

Sudah dieksekusi pada putaran 2.0.0

menutup kesenjangan "materi dibaca, tidak dijalankan" pada topik 6, 9, 12, dan 14.

catatan istilah lengkap, pencarian, kemajuan belajar, tema, PWA luring.

halaman Standar Kualitas yang memetakan ISO/IEC 25010:2023 ke bukti yang bisa diperiksa.

Segera (untuk nilai mata kuliah)

1. Sudah dieksekusi di 2.1.0: skrip oracle/ dan \ekspor terminal dijalankan di Oracle Free lewat

Docker, lengkap dengan log bukti. Langkah berikutnya yang paling bernilai: ulangi uji 2PC pada

dua container terpisah lalu matikan salah satunya sungguhan setelah PREPARE.

Satu perintah: docker run -d -p 1521:1521 -e ORACLE_PASSWORD=oracle gvenzl/oracle-free:23-slim.

Ini mengubah satu-satunya bagian yang belum terverifikasi menjadi terverifikasi, dan

menghasilkan bukti yang jauh lebih kuat daripada laporan mana pun di folder mata kuliah.

2. Hapus klaim "production-ready" dari laporan Kelompok 3, atau lengkapi syaratnya:

pengguna basis data non-root dengan hak minimal, sandi yang tidak kosong, dan prosedur

pemulihan cadangan yang pernah dijalankan minimal satu kali.

3. Ganti tabel "Query Performance Testing" dengan pengukuran yang bisa diulang: jalankan

tiap kueri 100 kali, laporkan median dan persentil ke-95, sebutkan apakah cache dikosongkan.

Pada 30 baris, jawaban jujurnya adalah "terlalu kecil untuk diukur" — dan itu jawaban yang sah.

Menengah

4. Tambahkan tabel referensi penyakit dengan kode ICD-10. Teks bebas membuat setiap

pengelompokan tidak bisa dipercaya, dan pengelompokan itulah isi hampir semua laporan medis.

5. Ganti ON DELETE CASCADE pada tabel rekam medis menjadi ON DELETE RESTRICT ditambah

kolom penanda nonaktif. Rekam medis tidak boleh hilang karena satu baris induk dihapus.

6. Tambahkan kolom jejak audit (dibuat_pada, diubah_pada, diubah_oleh) pada seluruh

tabel yang memuat data kesehatan, dan catat setiap pembacaan data pasien. UU PDP No. 27/2022

menuntut pengendali data dapat menunjukkan siapa mengakses apa.

Jangka panjang

7. Uji ketahanan sungguhan. Jalankan dua kontainer Oracle, buat database link di antaranya,

mulai transaksi terdistribusi, lalu matikan salah satu kontainer tepat setelah fase PREPARE.

Amati DBA_2PC_PENDING. Itulah satu-satunya cara membuktikan sendiri bahwa 2PC memblokir —

dan pengalaman itu tidak tergantikan simulasi mana pun.

8. Versi bahasa Inggris bila situs ini hendak dipakai di luar kelas. Kerjakan sebagai

lapisan terpisah dengan kamus penuh dan uji kebocoran antarbahasa, bukan sebagai terjemahan

sebagian.

9. Bandingkan dengan sistem terdistribusi modern. Konsep yang sama muncul lagi dengan nama

berbeda: sharding di MongoDB, Raft di CockroachDB dan etcd, consistent hashing di Cassandra.

Menautkan 2PC klasik ke konsensus modern akan membuat materi ini terasa hidup, bukan sejarah.