Tầng dữ liệu
Cơ sở dữ liệu
RivaLMS dùng PostgreSQL 16 với Prisma ORM 7. Môi trường dev và UAT chạy PostgreSQL trong Docker; schema được quản lý bằng Prisma Migrate.
Tổng quan schema
Schema trong prisma/schema.prisma gồm 30 model, chia theo nhóm.
Tài khoản và xác thực
User
Role
Account
Session
VerificationToken
Tổ chức đào tạo
Department
Course
CourseTeacher
Class
Nội dung khóa học
Lesson
Material
Assignment
ClassAssignment
Học tập
Enrollment
LessonProgress
Submission
Grade
Certificate
Trò chơi hóa
GamificationProfile
XPTransaction
Badge
UserBadge
AI
AIConversation
AIMessage
AISettings
Hệ thống
Notification
Discussion
DiscussionReply
AuditLog
SystemSettings
Nguyên tắc thiết kế
- Bài học, tài liệu và bài tập thuộc khóa học, dùng chung cho mọi lớp học của khóa.
- Lớp học là một đợt mở của khóa học: có giảng viên phụ trách (phải được phân công vào khóa), ngày bắt đầu và kết thúc, sĩ số và cờ cho phép tự ghi danh.
- Học viên ghi danh vào lớp học; mỗi học viên chỉ có một bản ghi ghi danh cho mỗi lớp.
- Hạn nộp bài tập theo từng lớp nằm ở
ClassAssignment; nếu không có, hạn nộp tính từ ngày bắt đầu lớp cộngdueOffsetDays.
Prisma ORM
Prisma sinh TypeScript type từ schema nên truy vấn được kiểm tra kiểu. Trang (Server Component) đọc dữ liệu trực tiếp bằng prisma; thao tác ghi đi qua Route Handler.
Ví dụ truy vấn
// Lấy người dùng kèm ghi danh, tiến độ và hồ sơ trò chơi hóa
const user = await prisma.user.findUnique({
where: { id: userId },
include: {
enrollments: {
include: {
class: { include: { course: true } },
lessonProgress: true,
},
},
gamificationProfile: true,
earnedBadges: { include: { badge: true } },
},
});Lệnh thường dùng
npm run db:migrateTạo và áp dụng migration (dev)npm run db:deployÁp dụng migration (UAT, production)npm run db:seedTạo dữ liệu mẫunpm run db:studioMở Prisma Studionpx prisma generateSinh lại Prisma ClientThay đổi schema
Dự án dùng migration có phiên bản trong prisma/migrations, không dùng db push.
# sửa prisma/schema.prisma, rồi tạo migration và áp dụng vào DB dev
npm run db:migrate -- --name them_bang_moi
# áp dụng migration có sẵn (máy mới, UAT, production)
npm run db:deployDriver kết nối
// src/lib/prisma.ts
import { PrismaClient } from "@prisma/client";
import { createDbAdapter } from "./db-adapter";
function createPrismaClient() {
const adapter = createDbAdapter(process.env.DATABASE_URL);
return new PrismaClient({ adapter });
}
export const prisma = globalForPrisma.prisma ?? createPrismaClient();src/lib/db-adapter.ts chọn driver theo DATABASE_URL: PostgreSQL thường (Docker) dùng @prisma/adapter-pg, host *.neon.tech dùng @prisma/adapter-neon. Có thể ép bằng DATABASE_ADAPTER=pg hoặc neon.