Tutorial Relasi One-to-One Prisma ORM: Pisahkan Data Login & Profil Biar Aman
Lagi asyik ngoding bikin fitur dashboard siswa buat web edukasi kamu? Berhenti sebentar dan coba cek file schema.prisma kamu.
Biasanya, developer pemula bakal masukin semua data pengguna ke dalam satu tabel Users yang super gemuk. Mulai dari username, password hash, nama lengkap, alamat rumah, tanggal lahir, sampai foto profil, semuanya tumplek blek di situ.
Padahal, praktik kayak gini itu bahaya banget buat keamanan (Web Security) dan bikin beban database MySQL kamu jadi berat! Melanjutkan obrolan kita di Bedah Tuntas Skema Prisma ORM (Klaster 1), yuk kita bahas solusi jitunya: Relasi One-to-One.
Kenapa Tabel "Users" Harus Dipisah?
Coba bayangin kamu lagi bikin komponen Header di Next.js App Router yang cuma butuh nampilin "Foto Profil" dan "Nama Lengkap" di pojok kanan atas. Kalau semua data digabung di satu tabel Users, pas kamu narik data (fetch), ada risiko password hash atau data sensitif lainnya ikut keangkut secara nggak sengaja ke browser pengunjung. Ini yang namanya kebocoran data (Data Exposure)!
Cara yang paling aman dan pro adalah memecahnya jadi dua tabel:
- Tabel Users: Khusus buat data otentikasi (ID, username, password, role). Intinya, data rahasia buat urusan login.
- Tabel UserProfiles: Khusus buat data pelengkap (nama asli, alamat, bio, foto).
Satu akun cuma boleh punya satu profil. Makanya, hubungan ini disebut One-to-One Relationship.
Cara Bikin Relasi One-to-One di Prisma
Biar kebayang praktiknya, coba buka file prisma/schema.prisma kamu, terus ketik kode simpel tapi *powerful* ini:
model Users {
id Int @id @default(autoincrement())
username String @unique
password String // Password yang udah di-hash
role String @default("3") // 1: Admin, 3: Siswa
// Ini jembatan relasi One-to-One ke tabel UserProfiles
profile UserProfiles?
}
model UserProfiles {
id Int @id @default(autoincrement())
fullName String
address String? // Tanda tanya (?) berarti opsional
avatarUrl String?
// Foreign Key yang nyambung ke tabel Users
userId Int @unique // Wajib @unique biar cuma bisa 1 lawan 1
user Users @relation(fields: [userId], references: [id], onDelete: Cascade)
}
Kunci Rahasianya: Perhatikan tulisan @unique di kolom userId pada tabel UserProfiles. Kata kunci inilah yang ngasih tahu Prisma dan MySQL, "Hei, satu User ID cuma boleh dipakai sekali aja di tabel profil ini!". Kalau nggak ada @unique, relasinya bakal berubah jadi One-to-Many.
Terus, ada onDelete: Cascade. Artinya, kalau suatu saat ada siswa yang drop out dan akunnya dihapus dari tabel Users, maka otomatis data profilnya di tabel UserProfiles bakal ikut kehapus. Database kamu jadi bersih tanpa ada data sampah (orphan data)!
Cara Mengambil Datanya (Fetching) di Next.js
Nah, karena datanya udah misah, gimana cara nariknya? Gampang banget! Prisma punya fungsi include.
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function getProfilSiswa(usernameSiswa) {
const data = await prisma.users.findUnique({
where: { username: usernameSiswa },
// Cuma ambil username dan relasi profilnya aja. Password aman!
select: {
username: true,
role: true,
profile: true // Otomatis narik data dari tabel UserProfiles
}
});
return data;
}
Kesimpulan
Mecah tabel pakai Relasi One-to-One adalah trik rahasia developer senior biar aplikasinya tetep ringan dan kebal dari insiden salah panggil data sensitif. Kalau struktur dasar ini udah rapi, kamu bakal jauh lebih gampang buat ngelola fitur-fitur kompleks ke depannya.
Di artikel selanjutnya, kita bakal naik level buat ngebahas Relasi One-to-Many secara mendalam (misalnya: cara ngebungkus satu kelas yang isinya puluhan siswa). Stay tune terus di seri Masterclass Prisma ORM ini, ya!
0 Response to "Tutorial Relasi One-to-One Prisma ORM: Pisahkan Data Login & Profil Biar Aman"
Posting Komentar