Ebook2LateX (6) - Phân tích và thiết kế các bảng

Bài trước: Ebook2LateX (5) - Cài đặt hệ quản trị cơ sở dữ liệu
-----

6. Phân tích và thiết kế các bảng

Để giải quyết yêu cầu [FR3], chúng ta cần tạo hai bảng dữ liệu chính với mối quan hệ một-nhiều (một tài liệu có nhiều mục công thức).

Ngoài ra, chúng ta cũng tạo thêm 2 bảng để quản lý việc đăng nhập; theo dõi hiệu suất và lỗi khi thực hiện OCR của mô hình AI.

[1] Bảng lưu trữ tài liệu (ví dụ: Documents)

Bảng này dùng để quản lý các tập tin PDF mà người dùng tải lên hệ thống. Các trường thông tin cần thiết bao gồm:

- ID: Khóa chính (Primary Key), định danh duy nhất cho mỗi tài liệu

- FileName: Tên tập tin gốc khi tải lên

- FilePath/URL: Đường dẫn lưu trữ tệp trên máy chủ hoặc Cloud để có thể mở lại khi cần

- UploadDate: Thời gian tài liệu được tải lên hệ thống

- Status: Trạng thái xử lý của tài liệu (ví dụ: Đang chờ, Đã xử lý, Lỗi)

[2] Bảng lưu trữ công thức (ví dụ: FormulaEntries)

Đây là bảng quan trọng nhất để thực hiện yêu cầu [FR3] (Lưu dữ liệu dạng LateX vào Database). Theo thiết kế dự án, mỗi tài liệu sẽ có nhiều mục công thức, bao gồm:

- ID: Khóa chính của mục công thức

- DocumentID: Khóa ngoại (Foreign Key) liên kết với bảng Documents (quan hệ 1-nhiều)

- RawImage/ImagePath: Lưu ảnh vùng công thức đã được cắt ra từ tập tin PDF (hoặc đường dẫn tới ảnh đó) để đối chiếu

- LatexContent: Nội dung mã LaTeX đã được mô hình pix2tex trích xuất hoặc người dùng đã chỉnh sửa thủ công

- OrderIndex: Thứ tự của công thức trong tài liệu để hiển thị lại đúng cấu trúc ban đầu

- CreatedAt/UpdatedAt: Thời gian tạo và lần cuối cùng chỉnh sửa công thức

[3] Bảng thông tin người dùng (ví dụ: Users)

Bảng này dùng để quản lý định danh, quyền truy cập

- UserID: Khóa chính (Primary Key), mã định danh duy nhất cho mỗi người dùng

- Username/Email: Tên đăng nhập hoặc địa chỉ email dùng để xác thực và liên lạc

- PasswordHash: Lưu trữ mật khẩu đã được mã hóa (không lưu mật khẩu thô để đảm bảo bảo mật theo chuẩn OAuth2/JWT)

- FullName: Họ và tên đầy đủ của người dùng để hiển thị trên giao diện

- Role: Vai trò của người dùng (ví dụ: Admin, Editor, Viewer) để phân quyền

- LastLogin: Thời gian cuối cùng người dùng đăng nhập vào hệ thống

- IsActive: Trạng thái tài khoản (Đang hoạt động hoặc Đã khóa)

[4] Bảng theo dõi hiệu suất và lỗi khi thực hiện OCR của mô hình AI (ví dụ: Logs)

Bảng này dùng để giám sát chất lượng của mô hình AI (pix2tex/Mathpix), giúp lập trình viên phát hiện lỗi kỹ thuật và cải thiện độ chính xác của việc trích xuất công thức.

- LogID: Khóa chính, định danh duy nhất cho mỗi bản ghi nhật ký

- FormulaID: Khóa ngoại liên kết với bảng FormulaEntries, giúp biết lỗi hoặc hiệu suất này thuộc về công thức cụ thể nào

- ProcessingTime: Thời gian (tính bằng mili giây hoặc giây) mà mô hình AI cần để chuyển đổi từ ảnh sang LaTeX. Chỉ số này giúp đánh giá tốc độ hệ thống

- ConfidenceScore: Độ tin cậy của kết quả OCR do mô hình trả về (thường từ 0 đến 1). Nếu điểm quá thấp, hệ thống có thể đánh dấu để người dùng kiểm tra kỹ hơn

- ErrorType: Loại lỗi phát sinh nếu quá trình OCR thất bại (ví dụ: Timeout, InvalidImageFormat, ModelCrash)

- ErrorMessage: Nội dung chi tiết thông báo lỗi kỹ thuật để phục vụ việc sửa lỗi (debugging)

- Timestamp: Thời điểm chính xác sự kiện xảy ra

- EnvironmentInfo: Thông tin về môi trường chạy (ví dụ: Docker_Container_ID, CPU/GPU_Usage) để phân tích tải hệ thống

-----
Bài sau:

Ebook2LateX (5) - Cài đặt hệ quản trị cơ sở dữ liệu

Bài trước: Ebook2LateX (4) - Khởi tạo dự án
-----

5. Cài đặt hệ quản trị cơ sở dữ liệu

Phần này sẽ cài đặt hệ quản trị cơ sở dữ liệu để lưu trữ thông tin tập tin (PDF) và các nội dung LaTeX đã được trích xuất.

Bước 1. Cài đặt PostgreSQL

- Tải phần mềm: Truy cập trang chủ PostgreSQL (https://www.postgresql.org/) và tải bản cài đặt phù hợp với hệ điều hành bạn đang sử dụng (Windows/Linux/macOS)

- Thực hiện cài đặt như một chương trình bình thường

- Cấu hình ban đầu: Thiết lập mật khẩu cho tài khoản quản trị mặc định (tài khoản: postgres; mật khẩu: p@ssword1)

- Ghi nhớ cổng kết nối mặc định (thường là 5432)

- Sau khi cài đặt PostgreSQL thành công, sử dụng công cụ pgAdmin4 (được cài đặt tự động với quá trình cài đặt PostgresQL) để đăng nhập vào hệ thống

Bước 2. Tạo Database cho dự án

(sử dụng pgAdmin4)

- Mở pgAdmin4 và đăng nhập với mật khẩu đã tạo ở bước cài đặt (postgres - p@ssword1)

- Chuột phải vào mục Databases -> chọn Create -> Database…

- Tại ô Database, nhập tên: ebook2latex_db

- Nhấn Save

Bước 3: Cấu hình chuỗi kết nối trong tập tin .env

Để ứng dụng Backend (FastAPI) có thể giao tiếp với cơ sở dữ liệu mà vẫn đảm bảo tính bảo mật, chúng ta lưu thông tin cấu hình trong tập tin môi trường.

- Truy cập vào thư mục backend/ của dự án

- Tạo một tập tin mới tên là .env (nếu chưa có)

- Thêm nội dung cấu hình chuỗi kết nối theo định dạng của SQLAlchemy như sau:

[.env]

# Định dạng: postgresql://[user]:[password]@[host]:[port]/[database_name]

DATABASE_URL=postgresql://postgres:mat_khau_cua_ban@localhost:5432/ebook2latex_db

Giải thích các thành phần của đoạn mã trên:

- postgres: Tên người dùng mặc định

- mat_khau_cua_ban: Thay bằng mật khẩu bạn đã thiết lập ở bước cài đặt

- localhost: Chạy trên máy cục bộ (hoặc db nếu bạn chạy trong Docker)

- 5432: Cổng mặc định của PostgreSQL

- ebook2latex_db: Tên cơ sở dữ liệu vừa tạo

Việc tách và lưu thông tin cấu hình ra tập tin .env giúp bạn dễ dàng thay đổi môi trường (từ máy cá nhân sang Docker hoặc Cloud) mà không cần sửa mã nguồn ứng dụng.

-----
Bài sau: Ebook2LateX (6) - Phân tích và thiết kế các bảng

Ebook2LateX (3) - Các giai đoạn thực hiện

Bài trước: Ebook2LateX (2) - Phân tích hệ thống
-----

3.1 Giai đoạn 1: Thiết lập nền tảng và Cơ sở dữ liệu

Giai đoạn này chuẩn bị môi trường để thực hiện yêu cầu [FR3]

[GD1.1] Khởi tạo dự án

- Tạo cấu trúc thư mục gồm tên dự án Ebook2LateX, backend/ và frontend/ như sơ đồ

- Khởi tạo Git

- Tạo file: .gitignore

- Tạo repo trên Github

[GD1.2] Cài đặt cơ sở dữ liệu

- Cài đặt PostgreSQL

- Tạo database

- Cấu hình chuỗi kết nối trong tập tin .env

- Tạo các bảng dữ liệu

[GD1.3] Cấu hình Backend: Cài đặt FastAPI và SQLAlchemy. Kết nối thành công từ Python đến PostgreSQL để sẵn sàng ghi dữ liệu

[GD1.4] Docker hóa môi trường phát triển

- Tạo Dockerfile cho Backend: Định nghĩa môi trường chạy Python, cài đặt các thư viện OCR và FastAPI

- Tạo Dockerfile cho Frontend: Định nghĩa môi trường chạy Node.js để build ứng dụng React

- Tạo docker-compose.yml: Đây là "nhạc trưởng" điều phối 3 dịch vụ: db: Chạy hình ảnh của PostgreSQL; backend: Chạy mã FastAPI; frontend: Chạy mã React

3.2 Giai đoạn 2: Xây dựng "Parse tool" (Xử lý PDF & OCR)

Giai đoạn này tập trung vào việc giải quyết yêu cầu [FR1]

[GD2.1] Trích xuất hình ảnh từ PDF: Sử dụng thư viện PyMuPDF để đọc tập tin PDF và cắt ra các vùng chứa công thức toán học

[GD2.2] Tích hợp Model OCR: Cài đặt mô hình pix2tex (LaTeX-OCR) vào thư mục services/

[GD2.3] Tạo API xử lý: Viết endpoint trong FastAPI để nhận tập tin PDF từ người dùng, chạy qua quy trình OCR và trả về chuỗi ký tự LaTeX

3.3 Giai đoạn 3: Phát triển Giao diện và Logic đồng bộ

Giai đoạn này hiện thực hóa yêu cầu [FR2] về tính tương tác

[GD3.1] Khởi tạo Frontend: Sử dụng React (Vite) và Tailwind CSS để dựng giao diện cơ bản gồm khu vực tải tập tin và khu vực biên tập

[GD3.2] Tích hợp MathLive: Nhúng thành phần <math-field> vào ứng dụng để hiển thị công thức trực quan

[GD3.3] Lập trình đồng bộ hai chiều:

    + Tạo State latexContent trong React

    + Viết logic để khi sửa ô văn bản (LaTeX raw), công thức trong MathLive tự động cập nhật

    + Ngược lại, khi sửa bằng biểu tượng trong MathLive, nội dung text LaTeX cũng thay đổi tương ứng

3.4 Giai đoạn 4: Hoàn thiện quy trình dữ liệu (Submit)

Kết nối các thành phần lại để hoàn tất yêu cầu [FR3]

[GD4.1] Kết nối Front-End và Back-End: Sử dụng thư viện axios để gửi nội dung LaTeX cuối cùng từ giao diện về API của FastAPI

[GD4.2] Xử lý lưu trữ: Backend nhận dữ liệu và sử dụng SQLAlchemy để lưu bản ghi vào PostgreSQL

3.5 Giai đoạn 5: Kiểm thử và Triển khai

[GD5.1] Kiểm thử (Testing): Thử nghiệm với các tập tin PDF toán học có độ phức tạp khác nhau để tinh chỉnh model OCR

[GD5.1] Đóng gói dự án: Viết tập tin docker-compose.yml để có thể chạy toàn bộ hệ thống (Web, API, DB) chỉ bằng một câu lệnh

-----
Bài sau: Ebook2LateX (4) - Khởi tạo dự án

Excel (4) - Hàm điều kiện

Bài trước: Excel (3) - Làm quen với Hàm
-----

Bài 4. Hàm điều kiện

Tới bài học này, bạn đã:

- Làm quen với các ô dữ liệu

- Thực hiện được các phép tính cơ bản

- Biết sử dụng các hàm SUM, AVERAGE, MAX, MIN

Trong bài học này, chúng ta sẽ tìm hiểu tiếp về hàm điều kiện

4.1 Hàm điều kiện IF

Chữ IF là một từ tiếng Anh, dịch ra tiếng Việt có nghĩa là NẾU.

Bạn hãy tưởng tượng hàm IF giống như một lời hứa của cha mẹ: "NẾU con hoàn thành việc học, THÌ con được đi chơi, CÒN KHÔNG thì con phải ở nhà học tiếp."

Hàm IF trong Excel cũng hoạt động y hệt như vậy. Nó sẽ kiểm tra một điều kiện và trả về kết quả tương ứng.

Cú pháp của hàm IF:

=IF(Điều_kiện, "Kết_quả_nếu_Điều_kiện_Đúng", "Kết_quả_nếu_Điều_kiện_Sai")

- Điều_kiện: Là thứ bạn muốn kiểm tra (Ví dụ: Điểm có lớn hơn 5 không?)

- Kết_quả_nếu_Điều_kiện_Đúng: Giá trị hiện ra nếu điều kiện thỏa mãn

- Kết_quả_nếu_Điều_kiện_Sai": Giá trị hiện ra nếu điều kiện không thỏa mãn

Ví dụ:



A

B

C

D

E

F

G

H

1

BẢNG ĐIỂM CỦA EM

2









3

STT

Môn học

Hệ số 1

Hệ số 1

Hệ số 2

Thi HK

(hệ số 3)

Điểm TB

Xếp loại

4

1

Toán

8

9

7

8.5

Tự tính

Dùng hàm IF

5

2

Ngữ Văn

7

6

8

7.5

Tự tính

Dùng hàm IF

6

3

Tiếng Anh

9

10

9

9.5

Tự tính

Dùng hàm IF

7

4

Vật Lý

6

5

7

4.5

Tự tính

Dùng hàm IF


- Bạn hãy tự tính cột Điểm TB

- Tại ô H4, bạn nhập công thức sau:

=if(H5>7, "Học được", "Cần cố gắng thêm")

- Bấm Enter, để Excel thực hiện hàm IF

- Bạn hãy sử dụng chức năng “chép công thức” để Excel thực hiện hàm IF cho các hàng dữ liệu còn lại trong bảng

- Bạn hãy thử thay đổi điểm Thi HK của môn Vật Lý (ô F7) thành 9.0. Hãy quan sát xem ô G7 và H7 có tự động đổi từ "Cần cố gắng thêm" sang "Học được" không?

Vậy là bạn đã trải nghiệm khả năng “suy nghĩ” và đưa ra lựa chọn của Excel với hàm IF.

4.2 Hàm IF lồng nhau

Ở bài học trước, bạn đã biết cách dùng hàm IF để đưa ra 2 lựa chọn (ví dụ: "Học được" hoặc "Cần cố gắng thêm"). Tuy nhiên, thực tế thường phức tạp hơn thế. Ví dụ: Xếp loại học tập không chỉ có Đậu/Rớt mà còn có Giỏi, Khá, Trung bình, Yếu.

Để giải quyết vấn đề này, chúng ta sẽ đặt một hàm IF khác vào ngay vị trí của "Kết_quả_nếu_Điều_kiện_Sai". Đây gọi là Hàm IF lồng nhau.

Ý tưởng làm việc của hàm IF lồng nhau

Hãy tưởng tượng bạn đang phân loại kẹo:

- NẾU kẹo màu đỏ THÌ là vị Dâu

- CÒN KHÔNG (NẾU kẹo màu xanh THÌ là vị Bạc hà, CÒN LẠI là vị Cam)

Cú pháp

Giả sử chúng ta xếp loại dựa trên Điểm Trung Bình (DTB) tại ô G4:

- Nếu DTB >= 8.0: Giỏi

- Nếu DTB >= 6.5: Khá

- Còn lại: Trung bình

Công thức sẽ như sau: =IF(G4>=8, "Giỏi", IF(G4>=6.5, "Khá", "Trung bình"))

Lưu ý quan trọng:

- Mỗi khi mở một dấu ngoặc đơn “(“, bạn phải nhớ đóng nó lại ở cuối công thức “)”

- Excel sẽ kiểm tra từ trái qua phải. Nếu điều kiện đầu tiên đúng, nó sẽ dừng lại và trả kết quả ngay

Thực hành: Nâng cấp Bảng điểm

Bạn hãy quay lại bảng điểm ở Mục 4.1 và thực hiện các bước sau:

Bước 1: Nhập công thức mới

- Tại ô H4 (thay cho công thức cũ), bạn gõ: =IF(G4>=8, "Giỏi", IF(G4>=6.5, "Khá", IF(G4>=5, "Trung bình", "Yếu")))

- Nhấn Enter

Bước 2: Sử dụng Auto Fill

- Dùng chuột kéo dấu cộng mảnh, màu đen từ ô H4 xuống các ô bên dưới (H5, H6, H7) để áp dụng cho tất cả các môn học

Bước 3: Thử nghiệm

- Thử thay đổi điểm số ở các cột Hệ số để G7 (Vật Lý) thay đổi

- Quan sát ô H7: Khi điểm trung bình nhảy từ 4.5 lên 5.5, hoặc 8.2, bạn sẽ thấy kết quả tự động chuyển từ "Yếu" sang "Trung bình" hoặc "Giỏi"



-----
Bài sau: