Lưu ý:
- Đây là repo phục vụ cho bộ môn INT1422 - Kho dữ liệu & Khai phá dữ liệu.
- Giao diện Web (Frontend) hiện tại chỉ được xây dựng ở mức cơ bản (chức năng cốt lõi) nhằm mục đích demo báo cáo và chưa được tối ưu hóa về mặt trải nghiệm người dùng (UX/UI).
Dự án này là một hệ thống phân tích dữ liệu toàn diện (OLAP) kết hợp Data Warehouse (trên nền tảng Oracle) và một ứng dụng web (React + Node.js/Express) để trực quan hóa dữ liệu.
Để hoàn thành toàn bộ hệ thống Kho dữ liệu (Data Warehouse) và giao diện Web (OLAP Web Interface) này, bạn cần thực hiện theo các giai đoạn sau:
- Thiết kế & Khởi tạo (Database & User): Setup kiến trúc PDB trên Oracle và tạo user quản trị độc lập.
- Xây dựng Nguồn Dữ Liệu (OLTP): Tạo các bảng chuẩn hóa (3NF) và nạp dữ liệu giao dịch giả lập.
- Thực thi luồng ETL (Extract - Transform - Load): Rút trích và đổ dữ liệu từ OLTP sang cấu trúc Star Schema (Fact & Dimension) cho Data Warehouse.
- Phân tích Khối (CUBE) bằng SSAS: Kết nối Data Warehouse vào Visual Studio (SSDT) để build OLAP CUBE và xử lý các độ đo (Measures).
- Cấu hình & Khởi chạy Web App: Thiết lập kết nối Node.js với Oracle và chạy giao diện ReactJS để biểu diễn dữ liệu trực quan từ các API.
/Code: Chứa toàn bộ mã nguồn của dự án./client: Frontend (ReactJS). Xử lý giao diện người dùng, biểu đồ./server: Backend (Node.js/Express) kết nối Oracle và chứa các script SQL tạo Cube.start.bat/start.sh: Các file kịch bản khởi chạy dự án.
/Report: Chứa các tài liệu, báo cáo bổ sung của hệ thống.
- Node.js (Phiên bản 16 trở lên)
- Oracle Database (Oracle 12c, 19c, hoặc 21c - có hỗ trợ PDB).
- Visual Studio (Visual Studio Tím - 2019/2022) kèm theo SQL Server Data Tools (SSDT) để xây dựng OLAP CUBE (Analysis Services).
Mở thư mục Code/server/sql. Bạn cần sử dụng Oracle SQL Developer để thực thi các script theo trình tự vô cùng nghiêm ngặt sau:
Bước 1.1: Tạo PDB và User (Yêu cầu quyền DBA)
- Trong SQL Developer, tạo một Connection mới đăng nhập bằng tài khoản
SYS(Role:SYSDBA). - Mở file
DW_Project_SYS.sql. - Sửa lại đường dẫn
FILE_NAME_CONVERThoặcDATAFILEtrong script cho khớp với cấu trúc ổ cứng của bạn (ví dụ:C:\app\oracle\oradata\...). - Chạy toàn bộ script (nhấn F5) để Oracle tạo Pluggable Database (
PDB_IDB) mới, đồng thời tạo useridb_schemavà cấp quyền DBA/Tablespace cho user này.
Bước 1.2: Xây dựng OLTP (Nguồn dữ liệu)
- Tạo một Connection mới trong SQL Developer trỏ tới user vừa tạo:
- Username:
idb_schema - Password:
IDB#2026Secure!(hoặc mật khẩu bạn đã đổi) - Service Name:
PDB_IDB(hoặc cấu hình SID/Port tuỳ theo hệ thống).
- Username:
- Khi kết nối thành công, mở file
DW_Project_IDB.sqlvà chạy toàn bộ lệnh (nhấn F5). Script này sẽ thiết lập cấu trúc bảng chuẩn hóa và nạp dữ liệu giả lập (Dummy Data) cho hệ thống OLTP.
Bước 1.3: Thực hiện ETL (Chuyển đổi sang mô hình Star Schema)
- Vẫn tiếp tục dùng Connection
idb_schema, mở fileDW_Project_IDB (mapping)__1.sql. - Chạy toàn bộ script (nhấn F5). Quá trình này sẽ tự động rút trích dữ liệu từ các bảng OLTP, tạo Sinh Khóa Nhân Tạo (Surrogate Keys) và đổ dữ liệu sạch vào các bảng
Dim_...vàFACT_...để hoàn thiện kho dữ liệu.
Bước 1.4: Xây dựng Metadata
- Cuối cùng, vẫn ở Connection
idb_schema, mở fileDW_Project_IDB(meta).sqlvà chạy lệnh. Hành động này tạo ra bảng Từ điển Dữ liệu chứa siêu dữ liệu mô tả ý nghĩa nghiệp vụ của mọi đối tượng trong kho.
Mở terminal tại thư mục gốc dự án:
- Để cài đặt thư viện cho Backend:
cd Code/server npm install - Để cài đặt thư viện cho Frontend:
cd ../client npm install
Tạo hoặc kiểm tra file Code/server/.env với các thông tin kết nối Oracle:
DB_USER=idb_schema
DB_PASSWORD=IDB#2026Secure!
DB_CONNECTION_STRING=localhost:1521/PDB_IDB
PORT=5000- Tại máy tính Windows: Mở thư mục
Codevà chạystart.bathoặc chạy trên terminal:cd Code .\start.bat
- Tại máy tính Linux/Mac:
sh start.sh
Hệ thống sẽ tự động mở Server ở http://localhost:5000 và Frontend ở http://localhost:3000.
Nếu bạn muốn tạo CUBE chuyên nghiệp bằng SQL Server Analysis Services (SSAS), hãy sử dụng Visual Studio (bản màu Tím) với công cụ SSDT:
Bước 1: Tạo Project Analysis Services
- Mở Visual Studio.
- Chọn Create a new project.
- Tìm kiếm và chọn template Analysis Services Multidimensional and Data Mining Project.
- Đặt tên (ví dụ:
IDB_OLAP_Cube) và chọn thư mục lưu.
Bước 2: Cấu Hình Data Source (Nguồn Dữ Liệu)
- Trong cửa sổ Solution Explorer, chuột phải vào thư mục Data Sources > New Data Source.
- Chọn tạo một connection mới trỏ tới CSDL Oracle của bạn (Có thể cần cài đặt Oracle OLE DB Provider).
- Nhập thông tin kết nối tới user
idb_schema(PDB_IDB) và lưu Data Source.
Bước 3: Tạo Data Source View (DSV)
- Chuột phải vào Data Source Views > New Data Source View.
- Chọn Data Source vừa tạo ở Bước 2.
- Chuyển các bảng trong Data Warehouse từ trái sang phải:
FACT_DOANH_SO,FACT_TON_KHO,Dim_KhachHang,Dim_CuaHang,Dim_MatHang,Dim_ThoiGian. - (Tùy chọn) Kéo thả các đường nối (Relationships) giữa các Khóa chính trong các bảng Dim và Khóa ngoại trong bảng Fact nếu Visual Studio không tự động nhận diện.
Bước 4: Tạo Dimension (Các Chiều Phân Tích)
- Chuột phải vào Dimensions > New Dimension.
- Dùng Wizard tự động, chọn bảng Dim tương ứng (VD:
Dim_ThoiGian). - Khai báo phân cấp (Hierarchies). Ví dụ đối với thời gian:
Năm -> Quý -> Tháng.
Bước 5: Tạo Cube
- Chuột phải vào Cubes > New Cube.
- Chọn Use existing tables và đánh dấu các bảng Fact (
FACT_DOANH_SO,FACT_TON_KHO). - Đánh dấu các độ đo (Measures) bạn muốn tính toán:
TongSoLuong,TongDoanhThu,SoLuongTon,GiaTriTon. - Chọn các Dimensions đã tạo ở Bước 4.
Bước 6: Deploy & Process (Triển Khai & Xử Lý)
- Chuột phải vào Project trong Solution Explorer > Chọn Properties để chắc chắn
Target Servertrỏ tới Server SSAS của bạn (VD:localhost). - Chuột phải vào Project > Chọn Deploy.
- Sau khi Deploy thành công, bạn có thể click tab Browser (trong file .cube) hoặc dùng Excel (Connect to Analysis Services) để kéo thả, lập biểu đồ Pivot Table trực quan.
Việc thiết lập Từ điển dữ liệu (Metadata) và Chỉ mục (Index) đóng vai trò quyết định trong việc đảm bảo hiệu năng và dễ dàng bảo trì kho dữ liệu.
Metadata giúp định nghĩa rõ ràng các khái niệm nghiệp vụ, kiểu dữ liệu và ý nghĩa của từng bảng/cột.
- Cách xây dựng: Chạy file
DW_Project_IDB(meta).sqltrong thư mụcCode/server/sql. - Cấu trúc lưu trữ: Dữ liệu sẽ được tạo ra tại bảng
METADATA_CATALOG. - Cách sử dụng: Bất kỳ Developer hoặc Data Analyst nào khi bắt đầu phân tích dữ liệu đều cần truy vấn vào bảng
METADATA_CATALOGđể tra cứu thông tin (ví dụ:BUSINESS_NAME,BUSINESS_DESC,CALCULATION_RULE). - Quản trị duy trì: Mỗi khi thêm cột mới hoặc bảng Dimension/Fact mới vào mô hình, cần Insert bổ sung thông tin tương ứng vào bảng
METADATA_CATALOGđể tài liệu luôn đồng bộ với Code.
Khi lượng dữ liệu trong Data Warehouse lớn lên, Index là bắt buộc để hỗ trợ tăng tốc OLAP queries.
- Xây dựng Index cơ bản (B-Tree): Các Foreign Keys (Khóa Ngoại) kết nối từ Fact sang Dimension nên được đánh Index (ví dụ trong bảng
KhachHang,DonDatHang,MatHangDuocDatđã được thiết lập mặc định). - Cách tối ưu cho Data Warehouse (Bitmap Index):
Khác với OLTP, Data Warehouse rất phù hợp để sử dụng Bitmap Index trên các cột có số lượng giá trị trùng lặp lớn (low-cardinality) ở các bảng Dimension.
-- Ví dụ tạo Bitmap Index: CREATE BITMAP INDEX idx_dim_kh_loaikh ON Dim_KhachHang(LoaiKH); CREATE BITMAP INDEX idx_dim_ch_bang ON Dim_CuaHang(Bang);
- Lưu ý khi sử dụng:
- Trong quá trình Load ETL đợt lớn (Bulk Insert), bạn nên dùng lệnh
ALTER INDEX ... UNUSABLEđể tạm tắt Index (giúp insert nhanh hơn). - Sau khi Load dữ liệu xong, tiến hành
ALTER INDEX ... REBUILDđể hệ thống tự động cập nhật lại các chỉ mục nhằm phục vụ việc Select nhanh chóng.
- Trong quá trình Load ETL đợt lớn (Bulk Insert), bạn nên dùng lệnh
- Mô Hình OLTP: Chuẩn hóa tốt (3NF), tách rời các thực thể (Khách hàng, Cửa hàng, Sản phẩm). Việc áp dụng subtype (Khách hàng Du lịch, Bưu điện) rõ ràng, phục vụ tốt cho quản lý vận hành.
- Mô Hình OLAP: Sử dụng Star Schema cổ điển (Kimball) là một lựa chọn tuyệt vời. Việc hợp nhất các thông tin rời rạc ở OLTP vào các Dimension phẳng (Denormalization) giúp truy vấn lấy báo cáo (Fact) cực kỳ nhanh chóng.
- Quy tắc ETL (Extract, Transform, Load):
- Tạo Surrogate Keys (SK) kiểu
INTvà giữ Natural Keys (MaKH_Nguon,MaCH_Nguon) là best-practice, cho phép dễ dàng track sự thay đổi dữ liệu (SCD). - Fact tồn kho được thiết kế dưới dạng Periodic Snapshot Fact Table (chụp hình tồn kho cuối kỳ). Việc sử dụng Subquery
MAX(NgayKiemKho)trong mapping đã xử lý tốt nghiệp vụ lấy số tồn cuối tháng. Tuy nhiên có thể cải thiện nhẹ bằng Window Function để tăng tốc độ nếu dữ liệu scale lên hàng triệu dòng.
- Tạo Surrogate Keys (SK) kiểu
- Quản trị (SYS): Áp dụng kiến trúc Multitenant (CDB/PDB) của Oracle mới, phân quyền Role chặt chẽ là một điểm cộng lớn về bảo mật.