Skip to content

Cơ sở dữ liệu ​

Cloudflare D1, database conan-compass. Một database cho cả ba mặt phẳng của Conan1.

FileNội dung
0001_init.sqlBảng lõi: năng lực, Brand, đánh giá, người dùng, nhật ký
0002_seed.sqlSinh tự động từ scripts/model.mjs
0003_execution.sqlTầng thực thi và chuyển đổi
0004_execution_seed.sqlSinh tự động từ scripts/execution.mjs
0005_planes.sqlHai mặt phẳng Products và Requirements, cộng sequences
0006_planes_seed.sqlSinh tự động từ scripts/planes.mjs (và trường product / repository trong execution.mjs)
0007_requirement_depth.sqlTiêu chí chấp nhận thành dòng và phụ thuộc giữa các yêu cầu — cộng thêm, chỉ tạo bảng mới
0008_requirement_depth_seed.sqlSinh tự động từ scripts/planes.mjs — 12 tiêu chí tách từ văn xuôi nghiệm thu, 2 phụ thuộc; toàn INSERT OR IGNORE

capabilities — mô hình chuẩn ​

CộtKiểuGhi chú
idTEXT PKCAP-02-01-03 — bản thân ID thể hiện cây
codeTEXT UNIQUEslug dùng trong URL
levelINTEGER1–3
parent_idTEXT FKNULL với L1
sortINTEGERthứ tự hiển thị
name_en / name_viTEXTsong ngữ
definition_en / definition_viTEXTmô tả WHAT
statusTEXTactive · draft · deprecated

Khoá ngoại parent_id dùng ON DELETE RESTRICT: không thể xoá một năng lực còn con.

brands ​

id dạng BRD-nemo12, code là slug, tên và mô tả song ngữ, status là active · draft · archived. Brand là bản sắc thị trường và phạm vi của Compass; nó không phải sản phẩm — xem Mô hình Products.

brand_capabilities — thực tế của Brand ​

Một dòng ở đây nghĩa là Brand đã kích hoạt năng lực đó.

CộtGhi chú
importance, priority, health, maturity, target_maturity1–5, cho phép NULL
likelihood, impact, detectability1–5, ba nguyên nhân của risk
ownertên người chịu trách nhiệm
rationalebắt buộc khi priority = 5
notesghi chú tự do

UNIQUE (brand_id, capability_id) đảm bảo mỗi Brand chỉ có một đánh giá cho mỗi năng lực.

Điểm rủi ro không được lưu thành cột. Nó là tích của ba nguyên nhân và được tính khi hiển thị — lưu lại chỉ tạo cơ hội để nó lệch khỏi nguồn.

users ​

CộtGhi chú
emailPK, khớp với email trong Access JWT
rolearchitect · executive · brand_owner · viewer
brand_idphạm vi của brand_owner

audit_log ​

actor, action, entity, entity_id, before, after (JSON), created_at. Mọi thao tác ghi đều tạo một dòng. Bảng này không bao giờ bị xoá.

Tầng thực thi (0003_execution.sql) ​

BảngVai trò
value_streamsChuỗi giá trị, mỗi chuỗi nêu rõ stakeholder_en/vi
value_stream_stagesChặng, mang câu statement_en/vi (phép thử "Tôi") và outcome_en/vi
stage_capabilitiesChặng phụ thuộc vào năng lực nào
processesQuy trình L4, gắn với một năng lực, brand_id rỗng nghĩa là dùng chung
activitiesBước trong quy trình, có thứ tự
applicationsDanh mục ứng dụng, có vòng đời; từ 0005 thêm product_id và repository
data_entitiesThực thể dữ liệu, có steward và mức phân loại
technologiesCông nghệ nền
capability_applications, capability_dataNăng lực ↔ ứng dụng, năng lực ↔ dữ liệu
application_technologies, application_dataỨng dụng ↔ công nghệ, ứng dụng ↔ dữ liệu

Công nghệ không có bảng nối trực tiếp tới năng lực. Quan hệ đó được suy ra qua ứng dụng, nên không thể xuất hiện mâu thuẫn giữa hai đường dẫn.

Chuyển đổi ​

BảngVai trò
initiativesSáng kiến, trạng thái, giai đoạn, đầu tư, tiến độ
initiative_capabilitiesSáng kiến cải thiện năng lực nào
kpisBaseline / current / target, neo vào đúng một trong capability_id hoặc stage_id (cưỡng chế bằng CHECK)

OKR (0015_okr.sql) ​

BảngVai trò
objectivesKết quả muốn đạt: neo vào capability_id hoặc stage_id (CHECK), strategic_objective_id nối lên chiến lược, owner, period, status
key_resultsThước đo dưới một Objective: direction (up/down), baseline / current / target, status, và kpi_id trỏ về KPI nó được chuyển từ đó

Xem OKR về luật chuyển đổi và ý nghĩa của not_measured.

Products và Requirements (0005_planes.sql) ​

BảngVai trò
sequencesname, last — bộ đếm cho id REQ- Q- D- EVI- REL- AC-, cấp bằng UPDATE … RETURNING
productsSản phẩm: mệnh đề giá trị, miền kinh doanh domain_en/vi, kind, status; brand_id = NULL là nền tảng Conan1
product_capabilitiesNăng lực ↔ sản phẩm — mắt xích đầu của chuỗi truy vết
application_urlsĐiểm truy cập của ứng dụng, url UNIQUE, kind
featuresKhả năng của sản phẩm, gắn ứng dụng và năng lực
requirementsYêu cầu: Intent / User / Problem / Outcome / Acceptance, product_id NOT NULL … ON DELETE RESTRICT
questionsCâu hỏi hạng nhất: câu trả lời nháp, gợi ý đã chọn, câu trả lời cuối, người trả lời
ai_runsMỗi lần gọi Workers AI: model, phiên bản prompt, token, trạng thái
ai_suggestionsVăn bản do AI sinh — chỉ ở đây, bất biến
decisionsBộ nhớ quyết định: tuyên bố, lý do, người quyết, phân tích AI, neo
decision_linksDải Liên quan đóng băng lúc quyết
evidencePR, commit, deployment, ảnh, tài liệu, mockup — điểm cuối của chuỗi
releasesBản phát hành của một ứng dụng: version, released_at, status
release_requirementsYêu cầu nào ra trong bản nào

Hai bảng thêm ở 0007_requirement_depth.sql, cùng mặt phẳng Requirements:

BảngCộtVai trò
acceptance_criteriaid (AC-NNNN), requirement_id (ON DELETE CASCADE), brand_id (ON DELETE SET NULL), sort, name_en/vi, description_en/vi, evidence_id (ON DELETE SET NULL), status CHECK (pending·met·failed), created_at, updated_atMột dòng một tiêu chí nghiệm thu, mang được trạng thái và trỏ được sang bằng chứng đã chốt nó. Chỉ mục theo requirement_id và brand_id
requirement_dependenciesrequirement_id, depends_on_id, PRIMARY KEY cả cặp, CHECK (requirement_id <> depends_on_id), cả hai ON DELETE CASCADE"Cái này chờ cái kia." Một chiều; chỉ mục ngược theo depends_on_id cho chiều Chặn

requirements.acceptance_en/vi không bị bỏ: chúng là bản dự phòng khi một yêu cầu chưa có dòng acceptance_criteria nào. Không có cột blocked — trạng thái bị chặn được tính từ trạng thái của các yêu cầu đang chờ.

Chi tiết cột ở Mô hình Products, Requirements, Làm rõ có AI hỗ trợ và Quyết định.

Hai ràng buộc đáng nhớ: ai_suggestions có CHECK ((kind = 'question') = (question_id IS NULL)) — gợi ý câu hỏi thì chưa có câu hỏi, gợi ý trả lời thì phải có; và requirements.product_id là ON DELETE RESTRICT — không xoá được sản phẩm còn yêu cầu.

Quy ước brand_id ​

Với processes, applications, value_streams, initiatives và kpis, brand_id = NULL nghĩa là dùng chung toàn doanh nghiệp, không phải "thiếu dữ liệu". Giao diện hiển thị nhãn Dùng chung, và khi xem ở phạm vi một Brand thì các bản ghi dùng chung vẫn hiện.

Với products, features, requirements, questions, decisions, evidence và releases, NULL nghĩa là nền tảng Conan1 (nhãn Nền tảng Conan1), cùng quy tắc hiển thị. Trên features, requirements, questions, evidence, releases, cột này do Worker điền từ bản ghi cha — người dùng không gõ.

Nạp lại dữ liệu ​

bash
cd api.conan1.com
node scripts/seed.mjs   # sinh lại 0002, 0004, 0006 và 0008 từ scripts/model.mjs + execution.mjs + planes.mjs
npm run db:local        # nạp toàn bộ migrations vào D1 local

Đưa lên production: sao lưu trước, rồi dựng lại — xem Chuyển dữ liệu.

bash
npx wrangler d1 export conan-compass --remote --output=backup.sql
npm run db:remote

DANGER

0001, 0003 và 0005 bắt đầu bằng DROP TABLE IF EXISTS; các file seed (0002, 0004, 0006) bằng DELETE FROM, và 0006 còn đặt lại sequences. npm run db:remote trên production xoá sạch dữ liệu hiện có — và chạy riêng 0005 / 0006 cũng xoá sạch hai mặt phẳng Products và Requirements, không phải cộng thêm. Hôm nay điều đó chấp nhận được vì mọi thứ đều đến từ seed. Ngay khi production có yêu cầu hay quyết định do người nhập, không chạy lại file nào từ 0001 đến 0006; mọi thay đổi schema hay dữ liệu về sau phải là một file migration mới, tăng số thứ tự (0007 trở đi), không DROP / DELETE bảng, áp dụng riêng bằng wrangler d1 execute --remote --file=… — xem Chuyển dữ liệu.

0007 và 0008 là ví dụ đầu tiên của đường đi cộng thêm đó: CREATE TABLE IF NOT EXISTS, INSERT OR IGNORE, UPDATE sequences SET last = MAX(last, 12) — không DROP, không DELETE dòng nào, không đặt lại bộ đếm, không chạm bảng đã có. Hai file này áp dụng được lên database đang chạy đã có yêu cầu và quyết định thật, và chạy lại được mà không mất gì — khác hẳn 0005 / 0006:

bash
npx wrangler d1 execute conan-compass --remote --file=migrations/0007_requirement_depth.sql
npx wrangler d1 execute conan-compass --remote --file=migrations/0008_requirement_depth_seed.sql

Hai bảng mới chỉ bị xoá bởi 0001_init.sql và 0003_execution.sql, tức đường dựng lại toàn bộ. 0007 cố ý không có dòng DROP nào, và chính file đó nói vì sao: xoá ở đây sẽ khiến chạy lại file này "erase hand-entered criteria and dependencies, which is exactly what an additive migration must not do".