Bedah Tuntas Skema Prisma ORM: Merancang Relasi Database yang Tahan Banting

Membangun aplikasi web berskala besar seperti Learning Management System (LMS) tidak hanya sebatas membuat tampilan antarmuka yang indah. Jantung dari setiap aplikasi yang aman dan efisien terletak pada bagaimana data dihubungkan satu sama lain di dalam database.

Jika Anda sudah mengikuti Panduan Utama Inisialisasi Next.js dan Prisma (Part 1), Anda pasti sudah memahami bahwa Prisma ORM mampu mencegah serangan SQL Injection secara otomatis. Namun, keamanan data (Data Integrity) juga sangat bergantung pada arsitektur relasi antar tabel (Schema Design) yang Anda rancang.

Dalam artikel pendalaman (Cluster Article) ini, kita akan membedah cara merancang skema database menggunakan Prisma ORM. Kita akan fokus pada implementasi relasi One-to-Many dan Many-to-Many, serta bagaimana mencegah penghapusan data krusial secara tidak sengaja melalui aturan referensial (Referential Actions).

1. Memahami Anatomi schema.prisma

File schema.prisma adalah pusat komando database Anda. Di sinilah Anda mendefinisikan model data (tabel) menggunakan sintaks yang sangat intuitif dan mudah dibaca (Human-readable). Berbeda dengan SQL mentah yang terkadang membingungkan, Prisma menggunakan pendekatan deklaratif.

Mari kita lihat contoh deklarasi model dasar untuk pengguna (Users) dan kelas (Grades):

model Users {
  id        Int      @id @default(autoincrement())
  username  String   @unique
  password  String
  role      String   @default("3") // 1: Admin, 2: Guru, 3: Siswa
  createdAt DateTime @default(now())
}

model Grades {
  id         Int      @id @default(autoincrement())
  name       String   @unique
  sort_order Int
}

2. Membangun Relasi One-to-Many (Satu ke Banyak)

Kasus paling umum dalam LMS adalah: Satu Kelas bisa memiliki Banyak Siswa, tetapi seorang Siswa hanya bisa berada di satu Kelas (dalam konteks tahun ajaran yang sama). Ini disebut relasi One-to-Many.

Untuk menghubungkannya di Prisma, kita hanya perlu menambahkan dua baris kode. Satu di model Grades, dan satu di model Users (sebagai Foreign Key).

model Grades {
  id         Int      @id @default(autoincrement())
  name       String   @unique
  sort_order Int
  
  // Relasi: Satu kelas memiliki banyak pengguna (siswa)
  students   Users[]  
}

model Users {
  id        Int      @id @default(autoincrement())
  username  String   @unique
  password  String
  role      String   @default("3")
  
  // Foreign Key ke tabel Grades
  gradeId   Int?     // Menggunakan tanda tanya (?) berarti opsional (boleh null)
  grade     Grades?  @relation(fields: [gradeId], references: [id])
}

Sangat elegan, bukan? Saat melakukan query nanti, Anda bisa dengan mudah menarik data sebuah Kelas beserta seluruh daftar siswanya hanya dengan satu baris perintah Prisma.

3. Keamanan Tingkat Lanjut: Referential Actions (onDelete & onUpdate)

Di sinilah letak praktik Secure Coding pada level database. Apa yang terjadi jika seorang Admin secara tidak sengaja menghapus "Kelas 7A" (Grades)? Apakah semua data siswa (Users) di kelas tersebut juga harus ikut terhapus?

Tentu saja tidak! Kehilangan data siswa adalah bencana (Data Destruction Incident). Untuk mencegah hal ini, Prisma memiliki fitur Referential Actions. Kita akan menggunakan Restrict agar database menolak penghapusan kelas jika masih ada siswa di dalamnya.

model Users {
  // ... kolom lainnya
  gradeId   Int?
  
  // Mencegah kelas dihapus jika masih ada siswa (Restrict)
  grade     Grades?  @relation(
    fields: [gradeId], 
    references: [id], 
    onDelete: Restrict, 
    onUpdate: Cascade
  )
}
  • onDelete: Restrict : Memblokir query DELETE pada tabel Kelas. Sistem akan melempar error untuk menyelamatkan data siswa Anda.
  • onUpdate: Cascade : Jika ID Kelas berubah, ID di tabel Siswa akan ikut diperbarui secara otomatis.

Kesimpulan

Merancang skema database dengan Prisma ORM bukan hanya mempercepat proses penulisan kode, tetapi juga mengamankan integritas data secara sistematis. Dengan menerapkan relasi yang benar dan aturan referensial yang ketat, arsitektur backend Anda akan tahan banting dari potensi human error (kesalahan manusia) maupun anomali sistem.

Jika fondasi database Anda sudah kokoh seperti ini, langkah selanjutnya adalah memastikan logika aplikasinya juga terisolasi dari publik. Pelajari kembali bagaimana Next.js mengunci keamanan dari sisi server di artikel pendahuluan jurnal ini.

Berlangganan update artikel terbaru via email:

0 Response to "Bedah Tuntas Skema Prisma ORM: Merancang Relasi Database yang Tahan Banting"

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel