Giao diện
Câu hỏi thường gặp — Collection FDW
Sử dụng chung
FDW có chậm hơn bảng nội bộ không?
Có, vì mỗi truy vấn FDW đều phải đi qua mạng đến database remote. Tuy nhiên, PostgreSQL thực hiện query pushdown — đẩy điều kiện WHERE, LIMIT, ORDER BY xuống database remote để giảm lượng dữ liệu truyền qua mạng. Trong thực tế, nếu network latency thấp (cùng VPC/datacenter), hiệu năng chấp nhận được cho hầu hết use case.
Khuyến nghị tối ưu:
- Đặt database remote cùng region/VPC với server Digiforce
- Đảm bảo bảng remote có index trên các cột thường filter
- Tránh
SELECT *trên bảng lớn — giới hạn số trường cần thiết
Có thể JOIN bảng FDW với bảng nội bộ không?
Có. Đây là ưu điểm chính của FDW so với External Data Source. PostgreSQL xử lý JOIN giữa foreign table và local table trong cùng một query plan. Ví dụ:
sql
SELECT o.id, o.total, c.name
FROM fdw_orders o
JOIN local_customers c ON o.customer_id = c.id
WHERE o.total > 1000;Plugin hỗ trợ những loại database remote nào?
Plugin đăng ký ba loại bridge:
| Local DB | Remote DB | Bridge |
|---|---|---|
| PostgreSQL | PostgreSQL | PgToPgBridge |
| MySQL | MySQL | MySQLToMySQLBridge |
| MariaDB | MariaDB | MariadbToMariadbBridge |
Lưu ý
Hiện tại bridge chỉ hỗ trợ kết nối cùng loại dialect (PostgreSQL → PostgreSQL, MySQL → MySQL). Kết nối chéo (ví dụ PostgreSQL → MySQL) chưa được hỗ trợ trong plugin, mặc dù PostgreSQL native hỗ trợ mysql_fdw.
FDW có hỗ trợ ghi dữ liệu (INSERT/UPDATE/DELETE) không?
Tùy thuộc vào cấu hình FDW và quyền trên database remote:
- PostgreSQL → PostgreSQL (
postgres_fdw): Hỗ trợ đầy đủ read/write nếu user mapping có đủ quyền - MySQL/MariaDB: Hỗ trợ thông qua
FEDERATEDengine, nhưng có giới hạn (không hỗ trợ transaction phân tán)
Tại sao FDW Collection không tự tạo trường id, createdAt?
FDW Collection ánh xạ trực tiếp cấu trúc bảng remote. Mặc định, các option sau đều bị tắt:
typescript
{
autoGenId: false,
createdAt: false,
createdBy: false,
updatedAt: false,
updatedBy: false,
}Bảng remote quyết định cấu trúc — plugin chỉ import và suy luận kiểu trường. Nếu bảng remote có cột created_at, nó sẽ được import nhưng không tự động gán giá trị.
Cấu hình và kết nối
Làm sao kiểm tra kết nối trước khi lưu?
Khi tạo hoặc chỉnh sửa Database Server, nhấn nút Test Connection. Plugin gọi action databaseServers:testConnection, tạo instance database tạm và chạy sequelize.authenticate(). Nếu kết nối thất bại, bạn sẽ thấy thông báo lỗi chi tiết.
Kết nối remote yêu cầu quyền gì?
| Database | Quyền cần thiết |
|---|---|
| PostgreSQL (local) | SUPERUSER hoặc CREATE FOREIGN TABLE, CREATE SERVER |
| PostgreSQL (remote) | SELECT (đọc), INSERT/UPDATE/DELETE (ghi) trên bảng cần truy cập |
| MySQL/MariaDB (local) | SUPER hoặc FEDERATED privilege |
| MySQL/MariaDB (remote) | SELECT, INSERT, UPDATE, DELETE tùy nhu cầu |
Biến môi trường có được hỗ trợ trong cấu hình kết nối không?
Có. Plugin sử dụng app.environment.renderJsonTemplate() để xử lý template trong các giá trị cấu hình. Bạn có thể dùng biến môi trường trong host, port, username, password:
json
{
"host": "{{env.REMOTE_DB_HOST}}",
"port": "{{env.REMOTE_DB_PORT}}",
"username": "{{env.REMOTE_DB_USER}}",
"password": "{{env.REMOTE_DB_PASSWORD}}"
}Lỗi thường gặp
Lỗi "could not connect to server"
Nguyên nhân: Database chính không thể kết nối đến database remote.
Cách xử lý:
- Kiểm tra host/port có đúng không
- Kiểm tra firewall giữa hai server (port PostgreSQL mặc định 5432, MySQL 3306)
- Kiểm tra
pg_hba.conftrên remote PostgreSQL — đảm bảo cho phép kết nối từ IP của server Digiforce - Thử kết nối thủ công bằng
psqlhoặcmysqltừ server Digiforce
Lỗi "sqlite does not support foreign data wrapper"
Nguyên nhân: Bạn đang sử dụng SQLite làm database chính cho Digiforce.
Cách xử lý: Chuyển sang PostgreSQL hoặc MySQL/MariaDB. FDW là tính năng của các database quan hệ lớn, SQLite không hỗ trợ.
Lỗi "bridge not found for X to Y"
Nguyên nhân: Plugin chưa đăng ký bridge cho cặp dialect bạn đang sử dụng. Ví dụ: kết nối từ PostgreSQL local đến MySQL remote.
Cách xử lý: Kiểm tra lại dialect của database chính và remote. Hiện tại chỉ hỗ trợ kết nối cùng loại: PostgreSQL↔PostgreSQL, MySQL↔MySQL, MariaDB↔MariaDB.
Lỗi "remoteServer X not found"
Nguyên nhân: Collection tham chiếu đến database server đã bị xóa hoặc tên server không khớp.
Cách xử lý:
- Vào danh sách Database Server kiểm tra tên server
- Nếu server đã bị xóa, tạo lại với cùng tên
- Kiểm tra collection options xem
remoteServerNamecó đúng không
Trường unsupported hiển thị khi import
Nguyên nhân: Một số kiểu cột trong database remote không có mapping tương ứng trong hệ thống field type của Digiforce.
Cách xử lý: Các trường unsupported sẽ được liệt kê riêng trong component UnSupportFields. Bạn vẫn có thể tạo collection — những trường unsupported sẽ bị bỏ qua, chỉ import các trường có kiểu được hỗ trợ.