RivaLMS
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ộng dueOffsetDays.

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ẫu
npm run db:studioMở Prisma Studio
npx prisma generateSinh lại Prisma Client

Thay đổ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:deploy

Driver 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.