Hệ thống Search Tool API áp dụng kiến trúc lưu trữ đa cơ sở dữ liệu (Polyglot Persistence). MySQL (thông qua GORM) được sử dụng để lưu trữ các dữ liệu có tính cấu trúc quan hệ chặt chẽ. MongoDB được sử dụng để lưu trữ các dữ liệu có cấu trúc linh hoạt, tần suất đọc ghi cao và khối lượng lớn.
I. HỆ QUẢN TRỊ CƠ SỞ D Ữ LIỆU QUAN HỆ (MYSQL)#
1. Bảng users (Quản trị tài khoản)#
Lưu trữ thông tin người dùng và phân quyền truy cập hệ thống.| Cột (Field) | Kiểu dữ liệu | Ràng buộc | Đặc tả chi tiết |
|---|
| id | INT | PK, AUTO_INCREMENT | Mã định danh duy nhất của người dùng. |
| name | VARCHAR(255) | NOT NULL | Tên hiển thị đầy đủ. |
| password | VARCHAR(255) | NOT NULL | Mật khẩu truy cập (đã được băm bằng thuật toán bcrypt). |
| email | VARCHAR(255) | UNIQUE, NOT NULL | Địa chỉ email dùng làm thông tin đăng nhập. |
| first_name | VARCHAR(255) | NULL | Tên gọi. |
| last_name | VARCHAR(255) | NULL | Họ. |
| role | INT | DEFAULT 1 | Cấp độ phân quyền: 0 (Quản trị viên / Admin), 1 (Người dùng thường / User). |
| created_at | DATETIME | AUTO | Mốc thời gian khởi tạo tài khoản. |
| updated_at | DATETIME | AUTO | Mốc thời gian cập nhật thông tin gần nhất. |
| deleted_at | DATETIME | NULL | Phục vụ cơ chế xóa mềm (Soft delete của GORM). |
2. Bảng servers (Quản lý Máy chủ Công cụ)#
Lưu trữ danh sách các máy chủ (Tool Server) chịu trách nhiệm thực thi tác vụ quét.| Cột (Field) | Kiểu dữ liệu | Ràng buộc | Đặc tả chi tiết |
|---|
| id | INT | PK, AUTO_INCREMENT | Mã định danh máy chủ. |
| name | VARCHAR(255) | NOT NULL | Tên định danh máy chủ (Ví dụ: Server-01-HN). |
| is_active | TINYINT(1) | DEFAULT 0 | Trạng thái hoạt động: 1 (Đang kích hoạt). |
| ip | VARCHAR(255) | NOT NULL | Địa chỉ IP của máy chủ. |
| is_priority | TINYINT(1) | DEFAULT 0 | Cờ ưu tiên nhận tác vụ: 1 (Mức độ ưu tiên cao). |
| limit_process | INT | | Giới hạn số lượng tiến trình xử lý đồng thời tối đa. |
| current_process | INT | | Số lượng tiến trình đang được thực thi tại thời điểm hiện tại. |
| created_at | DATETIME | AUTO | Mốc thời gian đăng ký máy chủ. |
| updated_at | DATETIME | AUTO | Mốc thời gian cập nhật thông tin gần nhất. |
| deleted_at | DATETIME | NULL | Phục vụ cơ chế xóa mềm. |
3. Bảng activity_logs (Nhật ký Hoạt động)#
Lưu vết toàn bộ thao tác của người dùng phục vụ cho công tác kiểm toán (Audit Trail).| Cột (Field) | Kiểu dữ liệu | Ràng buộc | Đặc tả chi tiết |
|---|
| id | INT | PK, AUTO_INCREMENT | Mã định danh bản ghi nhật ký. |
| user_id | INT | FK, NULL | Khóa ngoại liên kết tới bảng users. |
| action | VARCHAR(255) | NOT NULL | Tên hành động được thực thi (Ví dụ: Đăng nhập, Tạo keyword). |
| parameter | JSON | NULL | Tham số cấu hình đính kèm trong request (Body/Query). |
| model_name | VARCHAR(255) | NOT NULL | Tên thực thể dữ liệu chịu tác động. |
| model_id | INT | NOT NULL | ID của bản ghi chịu tác động. |
| old_value | JSON | NULL | Trạng thái dữ liệu trước khi thay đổi. |
| new_value | JSON | NULL | Trạng thái dữ liệu sau khi thay đổi. |
| ip_address | VARCHAR(255) | | Địa chỉ IP của máy trạm thực hiện yêu cầu. |
| user_agent | VARCHAR(255) | | Chuỗi User-Agent của máy trạm. |
| created_at | DATETIME | AUTO | Mốc thời gian ghi nhận hành động. |
| updated_at | DATETIME | AUTO | Mốc thời gian cập nhật bản ghi. |
II. HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU PHI QUAN HỆ (MONGODB)#
1. Collection keywords (Danh mục Từ khóa)#
Lưu trữ danh sách các từ khóa mục tiêu cần theo dõi biến động xếp hạng SEO.| Trường (Field) | Kiểu dữ liệu | Bắt buộc | Đặc tả chi tiết |
|---|
| _id | ObjectID | Có | Khóa chính tự sinh của MongoDB. |
| keyword | String | Có | Chuỗi từ khóa mục tiêu. |
| status | Number | Có | Trạng thái theo dõi: 0 (Vô hiệu hóa), 1 (Kích hoạt). |
| device | Array[Number] | Có | Nền tảng thiết bị cần quét: 0 (Desktop), 1 (Mobile). |
| engine | Array[Number] | Có | Công cụ tìm kiếm: 0 (GoogleVN), 1 (Google Global), 2 (Cốc Cốc). |
| result_num | Number | Có | Số lượng kết quả tối đa cần trích xuất. |
| created_by | Number | Không | Khóa ngoại tham chiếu người dùng khởi tạo. |
| is_running | Boolean | Không | Cờ trạng thái cho biết từ khóa có đang trong tiến trình quét hay không. |
| created_at | Datetime | Không | Mốc thời gian khởi tạo. |
| updated_at | Datetime | Không | Mốc thời gian cập nhật. |
2. Collection keyword_results (Kết quả Quét Từ khóa)#
Lưu trữ khối lượng lớn dữ liệu kết quả phân tích SERP trả về từ các máy chủ công cụ.| Trường (Field) | Kiểu dữ liệu | Bắt buộc | Đặc tả chi tiết |
|---|
| _id | ObjectID | Có | Mã định danh kết quả. |
| keyword_id | String | Có | Khóa ngoại liên kết tới Collection keywords. |
| keyword_schedule_id | ObjectID | Có | Mã định danh phiên quét cụ thể (phục vụ đối chiếu lịch sử). |
| keyword | String | Có | Chuỗi từ khóa (Lưu trữ dạng giải chuẩn hóa để tối ưu tốc độ truy vấn). |
| device | Number | Có | Nền tảng thiết bị: 0 (Desktop), 1 (Mobile). |
| device_os | Number | Không | Hệ điều hành: 0 (Windows/Android), 1 (MacOS/iOS). |
| engine | Number | Có | Công cụ tìm kiếm: 0 (GoogleVN), 1 (Google), 2 (Cốc Cốc). |
| is_scan_domain | Boolean | Không | Cờ xác nhận có thực hiện quét sâu vào tên miền hay không. |
| search_data | Object | Không | Khối dữ liệu JSON lưu trữ kết quả phân tích quảng cáo (ads) và tìm kiếm tự nhiên (search). |
| status | Number | Không | Mã trạng thái kết quả: 1 (Thành công), -1 (Lỗi), -2 (Không tìm thấy), -3 (Gặp Captcha). |
Cấu trúc đối tượng search_data:{
"ads": [
{ "url": "https://...", "rank": 1, "type": "company", "confirm_status": true, "label": "", "title": "...", "description": "..." }
],
"search": [
{ "url": "https://...", "rank": 1, "type": "competitors", "confirm_status": false, "label": "", "title": "...", "description": "..." }
]
}
3. Collection proxies (Quản lý Mạng lưới Proxy)#
Lưu trữ và điều phối vòng đời của các nút mạng thay thế (Proxy Nodes).| Trường (Field) | Kiểu dữ liệu | Bắt buộc | Đặc tả chi tiết |
|---|
| _id | ObjectID | Có | Khóa chính định danh Proxy. |
| ip | String | Có | Địa chỉ IP của Proxy. |
| port | Number | Có | Cổng kết nối. |
| username | String | Không | Tên tài khoản xác thực Proxy. |
| password | String | Không | Mật khẩu xác thực Proxy. |
| rotate_url | String | Có | Đường dẫn API dùng để kích hoạt tiến trình thay đổi IP. |
| rotate_time | Number | Không | Chu kỳ thay đổi IP tính bằng giây (Mặc định: 60). |
| next_rotate | Datetime | Không | Thời điểm khả dụng cho lần đảo IP tiếp theo. |
| in_use | Number | Không | Biến đếm số lượng tác vụ đang chiếm dụng Proxy này. |
| proxy_used | Array | Không | Mảng chứa danh sách mã tác vụ đã sử dụng Proxy. |
| is_captcha | Boolean | Không | Cờ báo hiệu Proxy đang bị hệ thống mục tiêu chặn bằng Captcha. |
| error_count | Number | Không | Bộ đếm số lần phát sinh lỗi liên tiếp (Tự động đặt lại về 0 nếu thành công). |
| is_active | Boolean | Không | Trạng thái khả dụng tổng thể của Proxy. |
| ip_public | String | Không | Địa chỉ IP thực tế lộ diện sau khi thực hiện quá trình đảo IP. |
| area | String | Không | Phân loại khu vực Proxy: global hoặc vn. |
4. Collection anchor_texts (Kết quả Văn bản Neo)#
Quản lý các tác vụ truy vết liên kết và văn bản neo (Backlinks).| Trường (Field) | Kiểu dữ liệu | Bắt buộc | Đặc tả chi tiết |
|---|
| domain | String | Có | Tên miền mục tiêu cần phân tích. |
| anchor_key | Array[String] | Có | Danh sách từ khóa văn bản neo cần tìm kiếm. |
| webhook_url | String | Có | Đường dẫn hàm gọi lại (Callback URL) để trả kết quả khi tác vụ hoàn tất. |
| proxy_url | String | Có | Địa chỉ Proxy được ấn định cho tác vụ này. |
| searched | Number | Không | Số chu kỳ đã thực hiện quét. |
| status | Number | Không | Mã trạng thái kết quả (Tương tự keyword_results). |
Ngày cập nhật 2026-03-30 03:23:10