Luật Tổ chức Lớp 3 — Hạ tầng Thông tin (Mỗi Object = 1 DB về chính nó)
Luật Tổ chức Lớp 3 — Hạ tầng Thông tin
LUẬT v3.0 | S122 (2026-03-15) — Patch: 4 sections → 6 heading nhất quán (S120 Huyen). +Scored union "Cùng nhóm" per-facet top N (S122 Luật Nhãn). +Layer 5 navigation (S118). +Nhãn = ĐẦU VÀO, Quan hệ 5+6 = ĐẦU RA. +entity_labels junction. Đây là LUẬT PHỨC TẠP NHẤT trong hệ thống Hiến pháp Kiến trúc. Nền tảng: Điều 0 (Thực thể Quản trị) — đọc TRƯỚC:
search_knowledge("luật thực thể được quản trị")Liên quan: Điều 24 (Luật Nhãn) — nhãn là đầu vào, "Cùng nhóm" + "Tương tự" là đầu ra:search_knowledge("luật nhãn label law taxonomy")v2.0: Nâng từ 6 → 8 quy tắc (thêm DEPENDS_ON + TRANSITIVE). Cơ sở lý thuyết IT. Đọc:search_knowledge("luật lớp 3 hạ tầng thông tin")Phụ thuộc: Điều 2 (Registry), Điều 3 (Metadata), Điều 8 (Dependency), Điều 20 (Semantic Linking)
I. TẦM NHÌN
Mỗi object có ID trong hệ thống KHÔNG CHỈ LÀ 1 dòng data trong DB — nó phải là 1 DB VỀ CHÍNH NÓ.
Nguyên tắc dữ liệu quốc gia Việt Nam: "Đúng, đủ, sạch, sống":
| Nguyên tắc | Ý nghĩa | Kiểm chứng |
|---|---|---|
| Đúng | Data khớp thực tế, không sai lệch | Orphan Scanner + Sync Governance |
| Đủ | Không thiếu quan hệ nào theo 8 QUY TẮC | dot-layer3-audit → coverage report |
| Sạch | Không trùng, không orphan, không rác | Duplicate Engine + Orphan Scanner |
| Sống | Tự cập nhật khi data thay đổi | Directus Flows + scheduled scan |
Vị trí: Lớp 3 = ĐẠI DIỆN của Tầng 2 (Hạ tầng Thông tin). Tầng 1 = hạ tầng kỹ thuật. Tầng 2 = hạ tầng thông tin. Lớp 3 = GIAO DIỆN cho hạ tầng đó — phục vụ MỌI nhu cầu tương lai của Tầng 4 (Business).
II. CƠ SỞ LÝ THUYẾT — TẠI SAO 8 QUY TẮC
8 quy tắc không phải con số tuỳ ý — chúng bắt nguồn từ 3 nhánh lý thuyết cốt lõi trong IT:
Nhánh 1: Entity-Relationship Model (Peter Chen, 1976)
Nền tảng mọi database. Mọi quan hệ giữa entities thuộc 1 trong các loại:
- Is-a (kế thừa) → bao phủ bởi classification/PEERS
- Has-a (sở hữu) → bao phủ bởi CONTAINS
- Part-of (thuộc về) → bao phủ bởi BELONGS_TO
- Uses (sử dụng) → bao phủ bởi DEPENDS_ON ★
- Used-by (bị sử dụng) → bao phủ bởi USED_BY
- Associated-with (liên kết) → bao phủ bởi SIMILAR
Nhánh 2: Graph Theory (Euler → hiện đại)
Mọi hệ thống entities = 1 đồ thị (graph). Mỗi entity = node, mỗi quan hệ = edge.
- Direct edge (A→B) → 6 quy tắc trực tiếp (1-5, 7)
- Transitive closure (A→B→C ⟹ A~C) → bao phủ bởi TRANSITIVE ★
- Bidirectional → BELONGS_TO + CONTAINS là cặp ngược
- Weighted → SIMILAR có confidence score
Nhánh 3: Ontology / Semantic Web (OWL/RDF)
- TransitiveProperty: nếu A partOf B và B partOf C → A partOf C
- Directus relations = direct edges. Cần TÍNH TOÁN để có transitive.
Kết luận: 8 quy tắc bao phủ TOÀN BỘ lý thuyết quan hệ đã biết. Bất kỳ quan hệ thực tế nào cũng rơi vào 1 trong 8 loại.
III. 8 QUY TẮC QUAN HỆ PHỔ QUÁT
Nhóm A: BẢN THÂN (1 quy tắc)
Quy tắc 1: IDENTITY — "Tôi là ai?"
Metadata gốc: code, name, description, classification, status, owner, layer, dates.
- Nguồn: Registry collection item
- Luôn có: Mọi entity tuân thủ Điều 2+3
- Tự động: Đọc record by code → hiển thị
Nhóm B: QUAN HỆ CẤU TRÚC — Trực tiếp trong schema (3 quy tắc)
Quy tắc 2: BELONGS_TO — "Tôi thuộc về ai?" (↑ lên parent)
Quan hệ M2O hướng LÊN. Entity này là CON của ai?
- Nguồn: Directus relations — FK fields trỏ tới parent collection
- Ví dụ: ND-0001 → WF-001 (node thuộc workflow). Task → Module M-002.
- Phát hiện: Quét relations WHERE collection = entity's collection AND type = m2o
Quy tắc 3: CONTAINS — "Tôi chứa gì?" (↓ xuống children)
Quan hệ O2M ngược. Entity nào là CON của entity này?
- Nguồn: Directus relations — FK fields ở collections KHÁC trỏ về entity này
- Ví dụ: WF-001 chứa ND-0001..ND-0010. CPS-001 chứa CP-003, CP-005, CP-008.
- Phát hiện: Quét relations WHERE related_collection = entity's collection
Quy tắc 4: DEPENDS_ON — "Tôi cần gì để hoạt động?" (→ xuôi, functional) ★ MỚI
Quan hệ phụ thuộc CHỨC NĂNG hướng XUÔI. Khác BELONGS_TO (cấu trúc) — đây là "tôi SỬ DỤNG gì?".
- Nguồn:
entity_dependenciesWHERE source_code = entity's code - Ví dụ: PG-015 depends_on collection
workflows(đọc data từ đó). DOT-042 depends_on Admin token. DirectusTable depends_on table_registry config. - Phát hiện: Query entity_dependencies WHERE source = entity
- Tại sao cần (tách khỏi BELONGS_TO): BELONGS_TO = "tôi NẰM TRONG parent" (cấu trúc cây). DEPENDS_ON = "tôi CẦN entity khác để HOẠT ĐỘNG" (đồ thị phụ thuộc). Page DEPENDS_ON collection nhưng KHÔNG BELONGS_TO collection. Nếu collection bị xoá → page hỏng → phải biết TRƯỚC.
Nhóm C: QUAN HỆ PHỤ THUỘC — Qua entity_dependencies (2 quy tắc)
Quy tắc 5: USED_BY — "Ai đang dùng tôi?" (← ngược)
Ngược của DEPENDS_ON. Entity nào phụ thuộc vào entity này?
- Nguồn:
entity_dependenciesWHERE target_code = entity's code - Ví dụ: Collection
workflowsused_by PG-015, PG-020, DOT-042. - Phát hiện: Query entity_dependencies WHERE target = entity
- Quan trọng cho deprecate/retire: Trước khi retire entity → query USED_BY → nếu > 0 → CHẶN retire, phải migrate trước.
Quy tắc 6: TRANSITIVE — "Ai liên quan tới tôi qua trung gian?" (→→→ bắc cầu) ★ MỚI
Quan hệ BẮC CẦU: A→B→C ⟹ A liên quan C. Đây là "quan hệ thứ cấp" Huyen nêu.
- Nguồn: TÍNH TOÁN từ entity_dependencies — duyệt đồ thị N bước (max depth = 3)
- Ví dụ: CP-005 → CPS-001 (belongs_to) → ND-0007 (used_by) → WF-001 (belongs_to). Vậy CP-005 liên quan WF-001 qua 3 bước. Hiển thị: "CP-005 → ... → WF-001 (qua CPS-001, ND-0007)".
- Phát hiện: BFS/DFS trên entity_dependencies graph, depth ≤ 3
- Hiển thị: "Liên quan gián tiếp" — danh sách entities + path ngắn nhất
- Tại sao cần: Đây chính là mô hình Wikipedia. User click CP-005 → thấy ngay WF-001 liên quan (dù không trực tiếp) → click WF-001 → thấy modules liên quan → vòng lặp. Nếu chỉ có direct relations → phải click 3 lần mới tới WF-001. Transitive cho phép NHÌN THẤY toàn cảnh ngay.
- Giới hạn: Max depth = 3 (đủ cho 99% cases, tránh explosion). Chỉ hiện top-10 entities gần nhất.
Nhóm D: QUAN HỆ NGẦM — Phát hiện tự động (2 quy tắc)
Quy tắc 7: PEERS — "Ai giống tôi?" (↔ ngang)
Entity cùng NHÓM: cùng classification, category, layer, owner, parent.
- Nguồn: Query cùng collection WHERE field = same value AND id ≠ self
- Ví dụ: CP-005 cùng category="ci" → CP-001, CP-003, CP-012.
- Phát hiện: Đọc entity's classification fields → query peers
- Không cần entity_dependencies: Query realtime, không cần lưu trước.
Quy tắc 8: SIMILAR — "Ai liên quan ngữ nghĩa?" (~ gần)
Entity có description/purpose TƯƠNG TỰ nhưng KHÁC TYPE.
- Nguồn: Qdrant vector search cross-type
- Ví dụ: CP-005 "Code Review" ≈ DOT-042 "dot-health-check" (0.89)
- Giai đoạn: Triển khai SAU khi Quy tắc 1-7 ổn định.
IV. BẢNG INDEX NGUYÊN TẮC QUAN HỆ
8 quy tắc phổ quát. Mọi quan hệ trong thế giới thực đều rơi vào 1 trong 8 loại.
| # | Quy tắc | Nhóm | Hướng | Nguồn | Phát hiện tự động |
|---|---|---|---|---|---|
| 1 | IDENTITY | A: Bản thân | — | Registry item | Đọc record |
| 2 | BELONGS_TO | B: Cấu trúc | ↑ lên | Directus M2O | Quét FK fields |
| 3 | CONTAINS | B: Cấu trúc | ↓ xuống | Directus O2M | Quét reverse FK |
| 4 | DEPENDS_ON | C: Phụ thuộc | → xuôi | entity_dependencies | source = entity |
| 5 | USED_BY | C: Phụ thuộc | ← ngược | entity_dependencies | target = entity |
| 6 | TRANSITIVE | C: Phụ thuộc | →→→ bắc cầu | entity_dependencies graph | BFS depth ≤ 3 |
| 7 | PEERS | D: Ngầm | ↔ ngang | Cùng collection | Query same field value |
| 8 | SIMILAR | D: Ngầm | ~ gần | Qdrant vectors | Cosine similarity ≥ 0.7 |
Quy trình khi phát hiện thiếu:
- Kiểm tra 8 quy tắc → quy tắc nào bị vi phạm?
- Quy tắc ĐỦ phổ quát → lỗi ở DOT/code → sửa DOT/code
- Quy tắc CHƯA ĐỦ → bổ sung quy tắc → sửa áp dụng TOÀN HỆ THỐNG
- KHÔNG BAO GIỜ sửa cho 1 object rồi bỏ qua phần còn lại
V. PHÂN LOẠI QUAN HỆ: TRỰC TIẾP vs BẮC CẦU vs NGẦM
┌─────────────────────────────────────────────────────────────────────┐
│ CP-005 "Code Review" │
├───── TRỰC TIẾP (Nhóm B — đọc từ schema) ───────────────────────────┤
│ BELONGS_TO: CPS-001 (qua checkpoint_set_items) │
│ CONTAINS: — (leaf entity, không chứa con) │
├───── PHỤ THUỘC (Nhóm C — đọc từ entity_dependencies) ──────────────┤
│ DEPENDS_ON: — (checkpoint không phụ thuộc gì) │
│ USED_BY: CPS-001, CPS-005 (2 sets dùng CP này) │
│ ND-0007 (node gắn set chứa CP này) │
│ TRANSITIVE: │
│ CP-005 →[in]→ CPS-001 →[gắn]→ ND-0007 →[in]→ WF-001 │
│ ⟹ CP-005 liên quan WF-001 (depth=3, path: CPS-001→ND-0007) │
│ CP-005 →[in]→ CPS-001 →[gắn]→ ND-0032 →[in]→ WF-002 │
│ ⟹ CP-005 liên quan WF-002 (depth=3) │
├───── NGẦM (Nhóm D — tính toán runtime) ────────────────────────────┤
│ PEERS: CP-001, CP-003, CP-012 (cùng category="ci") │
│ SIMILAR: DOT-042 (0.89), PG-015 (0.82) — vector search │
└─────────────────────────────────────────────────────────────────────┘
⟹ Chỉ từ 1 checkpoint, ta thấy TOÀN BỘ: sets, nodes, workflows,
peers, tools liên quan. ĐÂY MỚI LÀ "1 DB VỀ CHÍNH NÓ".
VI. CƠ CHẾ TỰ ĐỘNG — "SỐNG"
6.1 dot-relation-discover — Phát hiện quan hệ
Quét Directus schema → populate entity_dependencies:
BƯỚC 1: Quét M2O relations → BELONGS_TO + CONTAINS
BƯỚC 2: Quét M2M junction tables → USED_BY pairs
BƯỚC 3: Quét functional dependencies (page→collection, DOT→token) → DEPENDS_ON
BƯỚC 4: So sánh → bổ sung thiếu (idempotent)
6.2 Transitive computation — Không cần lưu trước
Transitive KHÔNG lưu vào entity_dependencies (sẽ explode). Tính toán ON-DEMAND:
// API endpoint hoặc composable
async function getTransitive(entityCode, maxDepth = 3) {
const visited = new Set()
const results = []
const queue = [{ code: entityCode, depth: 0, path: [] }]
while (queue.length > 0) {
const { code, depth, path } = queue.shift()
if (depth > maxDepth || visited.has(code)) continue
visited.add(code)
// Query direct dependencies
const deps = await directus.items('entity_dependencies').readByQuery({
filter: { _or: [
{ source_code: { _eq: code } },
{ target_code: { _eq: code } }
]}
})
for (const dep of deps.data) {
const neighbor = dep.source_code === code ? dep.target_code : dep.source_code
if (!visited.has(neighbor)) {
results.push({ code: neighbor, depth: depth + 1, path: [...path, code] })
queue.push({ code: neighbor, depth: depth + 1, path: [...path, code] })
}
}
}
return results.filter(r => r.depth > 1) // Chỉ lấy indirect (depth > 1)
}
Performance: entity_dependencies ~200 records → BFS depth 3 = milliseconds. Khi 10.000 records → cache kết quả, recompute daily.
6.3 Tự mở rộng
Thêm entity MỚI:
→ Auto-ID flow gán code ✅
→ Đăng ký registry ✅
→ Lớp 3 trang TỰ HIỆN (discovery mode) ✅
Thêm relation MỚI (vd: gắn CP vào CPS):
→ dot-relation-discover (scheduled) → entity_dependencies cập nhật ✅
→ Lớp 3 của CẢ HAI entities tự cập nhật (USED_BY + CONTAINS) ✅
→ Transitive tự tính lại (on-demand) ✅
XOÁ / RETIRE:
→ Query USED_BY → nếu > 0 → CHẶN ✅
→ Retire → status = "retired" → Lớp 3 vẫn hiện nhưng đánh dấu ✅
KHÔNG AI SỬA CODE. HỆ THỐNG TỰ SỐNG.
6.4 dot-layer3-audit — Kiểm tra "Đúng đủ sạch sống"
Cho MỖI entity (sample per registry):
☐ ĐÚNG: Record tồn tại? Metadata đủ?
☐ ĐỦ: 8 quy tắc — bao nhiêu applicable? bao nhiêu có data?
☐ SẠCH: Dependencies trỏ tới entity đã retired?
☐ SỐNG: entity_dependencies date_updated < 24h?
Score: N/M applicable rules PASS
Output: Coverage Report per registry + tổng hợp
VII. LỚP 3 UI — RENDERING ENGINE
7.1 Discovery-First
1 Vue page DUY NHẤT render TẤT CẢ entity types:
entityType + id (từ URL)
→ Map → registry collection (qua meta_catalog)
→ Query entity (Quy tắc 1: Identity)
→ Query Directus relations (Quy tắc 2-3: Belongs_to + Contains)
→ Query entity_dependencies source (Quy tắc 4: Depends_on)
→ Query entity_dependencies target (Quy tắc 5: Used_by)
→ Compute transitive (Quy tắc 6: BFS depth ≤ 3)
→ Query peers (Quy tắc 7: cùng classification)
→ [Future] Vector search (Quy tắc 8: Similar)
→ Render sections — trống → ẩn
Discovery = DEFAULT. Config = OVERRIDE cho tuỳ chỉnh.
7.2 Auto-Link + Permissions
- PREFIX-NNN → NuxtLink tự động (mapping từ meta_catalog)
- Section đọc Directus API → 403/empty → ẩn. Directus permissions = đủ.
VIII. NGUYÊN TẮC BẢO TRÌ
- Thiếu thông tin → kiểm tra 8 quy tắc. Không sửa 1 object. Sửa quy tắc/DOT → toàn hệ thống.
- Entity type mới → KHÔNG viết config. Discovery tự hiện.
- Relation type mới → kiểm tra 8 quy tắc bao phủ chưa. (Rất hiếm phải thêm.)
- Scale 10.000 entities → không thay đổi gì. BFS cache + Directus pagination.
- Section thêm tay → cho phép SAU khi discovery ổn. Config override cho từng entity type.
- Link ưu tiên (S107 — Huyen): Nếu entity ĐÃ CÓ dedicated page/UI trong hệ thống (workflows có
/knowledge/workflows/{id}, modules có/knowledge/modules/{id}) → Lớp 3 PHẢI hiện link tới page đó ở VỊ TRÍ ĐẦU TIÊN (ngay sau Identity). Discovery BỔ SUNG thông tin quan hệ — KHÔNG THAY THẾ UI đã xây.
Luật Tổ chức Lớp 3 v2.0 | S107 (2026-03-08) Cơ sở: Entity-Relationship Model (Chen 1976) + Graph Theory + Ontology (OWL/RDF) Tác giả: Huyen (tầm nhìn "Đúng đủ sạch sống", quan hệ bắc cầu) + Claude (8 quy tắc phổ quát)