Giao diện
@digiforce-nc/plugin-field-m2m-array
Plugin cung cấp kiểu field many-to-many qua array — lưu quan hệ nhiều-nhiều trực tiếp trong một cột ARRAY/JSON/JSONB mà không cần tạo bảng junction trung gian.
Plugin này làm gì?
Hãy hình dung: quan hệ M2M truyền thống cần 3 bảng (source, junction, target). Plugin này đơn giản hóa bằng cách lưu danh sách target key trong một cột mảng trên bảng source. Ví dụ: bản ghi post có cột tagIds: [1, 3, 5] thay vì bảng posts_tags. Phù hợp cho quan hệ đơn giản, số lượng nhỏ-trung bình.
Ba nhiệm vụ chính
| # | Nhiệm vụ | Chi tiết |
|---|---|---|
| 1 | Relation type mới | Đăng ký belongsToArray trên SequelizeCollectionManager |
| 2 | Array column | Lưu target keys trong cột ARRAY (PostgreSQL) hoặc JSON/JSONB |
| 3 | Nested operations | Resolve nested create/update khi thao tác với target collection |
Kiến trúc
Tổng quan
Plugin đăng ký relation type belongsToArray — biến thể của belongsTo nhưng cho phép nhiều target. Server xử lý FK wiring, nested operations; client cung cấp UI chọn nhiều record.
Luồng tạo bản ghi với M2M Array
Luồng nested create
Relation type: belongsToArray
| Thuộc tính | Mô tả |
|---|---|
| foreignKey | Tên cột ARRAY trên source table (ví dụ: tagIds) |
| targetKey | Primary key trên target table (ví dụ: id) |
| target | Tên target collection |
| Column type | ARRAY (PostgreSQL), JSON hoặc JSONB (MySQL, SQLite) |
Hooks
| Hook | Sự kiện | Hành động |
|---|---|---|
afterCreate | Tạo bản ghi mới | Verify FK integrity — kiểm tra target keys tồn tại |
beforeDestroy | Xóa bản ghi | Cleanup FK wiring — xóa references nếu cần |
So sánh với M2M truyền thống
| Tiêu chí | M2M truyền thống | M2M Array |
|---|---|---|
| Số bảng | 3 (source + junction + target) | 2 (source + target) |
| Query | JOIN qua junction | Resolve array trực tiếp |
| Hiệu năng | Tốt cho quan hệ lớn | Tốt cho quan hệ nhỏ-trung bình |
| Extra data | Junction có thể chứa metadata | Không có metadata trên quan hệ |
| DB support | Mọi DB | Tốt nhất với PostgreSQL (ARRAY native) |
Ví dụ sử dụng
Cấu hình field M2M Array
typescript
const tagsField = {
name: 'tags',
type: 'belongsToArray',
interface: 'mbm',
target: 'tags',
foreignKey: 'tagIds',
targetKey: 'id',
};Thành phần client
| Thành phần | Mô tả |
|---|---|
MBMFieldInterface | Định nghĩa interface cho field M2M array |
MBMForeignKey | Component hiển thị/cấu hình foreign key (array column) |
MBMTargetKey | Component hiển thị/cấu hình target key |
Dependencies
| Package | Vai trò |
|---|---|
@digiforce-nc/server | Server framework (peer) |
@digiforce-nc/database | Database ORM — đăng ký relation type |
@digiforce-nc/client | Client framework — đăng ký component |