FR-037 · 2026-06-10 · 精準同名(rename)計畫

把欄位名改成與 OSCAL 完全相同

方向從「意義相同(additive 雙欄)」改為「名稱完全相同(直接 rename)」。本表只列需改名新增的欄位,未異動的不列。必填等級依 5 份 schema 的 required 抽出。

🟢 可精準改名

無衝突,直接 rename 成 OSCAL 名。

🔴 無法精準同名

撞 PK id 或 Python 保留字 class/type

🟣 新增

新表/欄直接用 OSCAL 原名,無歷史包袱。

必填:Req 根必填 Opt* 用到才必填 Opt 選填

🟢 可精準改名(rename,無衝突)

直接把現欄位改成 OSCAL 名。屬 breaking(要同步改 mapper / service / 查詢 / FE),但語言層無阻礙。

🟢rename 對照
現名 → 異動後名稱OSCAL 出處必填
多個(有 uuid 的 assembly)
ssps / ssp 子表 / assessment_plans / assessment_results / result_datas / findings / oscal_parties / oscal_locations / catalogs / profiles …
uiduuid各 assembly 的 uuidReq
ssp_control_implementationscontrol_identifiercontrol_idssp: implemented-requirement.control-idReq
ssp_control_implementation_objectivesstatement_identifierstatement_idssp: statement.statement-idReq
assessment_result_datasstarted_atstartar: result.startReq
assessment_result_datascompleted_atendar: result.endOpt
assessment_result_evidencesreference_urlhrefar: relevant-evidence.hrefOpt
catalog_groupsdescriptiontitle
(現在 description 存的是顯示名 = OSCAL title)
catalog: group.titleReq
⚠️ uid→uuid 兩個注意:(1) 成本最大——每個 model / mapper / 查詢 / FE 讀 .uid 都要改。(2) 只改「OSCAL 真的有 uuid」的表;catalog 的 group / control / part / parameter OSCAL 用 id token、沒有 uuid,它們的 uid 是我們內部發明的,不要改成 uuid(否則對不到 OSCAL)。

🔴 無法精準同名(兩道硬牆)

這些欄位想用 OSCAL 原名會撞 PK 或 Python 語法。除非付出代價(改 PK 名),否則只能用近似名。

牆 1:OSCAL id token 撞我們的整數 PK id

表 . 現欄位OSCAL 出處(想要的精準名)必填為何擋住 / 折衷
catalog_controls.control_id(存 "AC-1")catalog: control.idReq精準名是 id → 撞整數 PK。折衷保留 control_id
catalog_groups.name(存代碼)catalog: group.idOpt同上 → 折衷 group_id(仍非精準 id
catalog_control_parameters.param_idcatalog: parameter.idOpt同上 → 保留 param_id
oscal_roles.role_idcommon: role.idReq同上 → 保留 role_id
catalog_control_parts(無此欄)catalog: part.idOpt新增也只能 part_id(不能 id
唯一能精準的辦法:把整數主鍵 id 全表改名(如 row_id / pk),讓 id 空出來給 OSCAL token。代價極大:動到每張表 PK、所有 relationship/FK、所有 .id 查詢、jedi-oscal + BE + FE。需你決定值不值得。

牆 2:Python 保留字 / builtin

表 . 現欄位OSCAL 出處(想要的精準名)必填為何擋住 / 折衷
oscal_props.prop_classcommon: property.classOptclass 是 Python 保留字,不能當屬性名 → 保留 prop_class(或 DB 欄叫 class、ORM 屬性仍 prop_class)
oscal_parties.party_typecommon: party.typeReqtype 會 shadow builtin → 不建議;保留 party_type
ssp_components.component_typessp: system-component.typeReq同上 → 保留 component_type
變通(DB 名精準、Python 名不變):SQLAlchemy 可 mapped_column("class", ...)DB 欄位名class,但 ORM 屬性仍叫 prop_class。這樣 DB schema / 匯出 JSON key 精準,Python 端避開保留字——是 class/type 唯一可「DB 精準」的解。

🟣 新增(直接用 OSCAL 原名)

新表/欄沒有歷史包袱,欄位名一律取 OSCAL snake 原名(唯獨 token id 仍受 PK 牆限制,用 <entity>_id)。

🟣SSP 新表
新表OSCAL 原名欄位必填
ssp_system_information_typestitle Req · description Req · system(categorization) Opt* · base/selected(C/I/A impact) Opt*
security-impact-level(3 欄於 sys-char)security_objective_confidentiality / _integrity / _availabilityOpt*
ssp_system_usersuuid Opt* · title · role_ids
ssp_authorized_privilegestitle Opt* · functions_performed Opt*
ssp_by_componentscomponent_uuid Opt* · uuid · description · implementation_status
ssp_set_parametersparam_id Opt* · values Opt*
ssp_diagramsuuid Opt* · caption · description
🟣AR 新表
新表OSCAL 原名欄位必填
assessment_result_finding_targetstype⚠ · target_id · status(state) · implementation_statusReq(finding 必填 target)
assessment_result_observationsuuid · description · methods · collectedOpt*
assessment_result_risksuuid · title · description · statement · statusOpt*
assessment_result_datas(補欄)description(result.description)Req
🟣共用 / 控制 / Profile 新表
新表OSCAL 原名欄位必填
oscal_resources(back-matter)uuid · title · description · rlink href · base64 value · citation textOpt*
oscal_hashesvalue · algorithmOpt*
oscal_document_idsidentifier · schemeOpt*
oscal_revisionsversion · title · published · last_modified · oscal_versionOpt*
profile_importshref · include_all · with_child_controls · matchingReq(profile 必填 imports)
import 欄(root 表)import_profile / import_ssp / import_ap
(OSCAL 為物件 import-*.href;扁平存 href 值)
Req
finding_targets.typeset_parametersvalues 等:若 ORM 屬性會撞 builtin(type/values),同牆 2 處理(DB 名精準、Python 屬性加後綴)。

決策點

1PK id 那道牆:要不要為了精準把整數 PK 改名(row_id/pk)釋放 id?代價極大(全 codebase FK/查詢)。不改 → token-id 用 control_id/group_id 等近似名。
2class/type:接受「DB 欄名精準、Python 屬性加後綴」(mapped_column("class") + 屬性 prop_class)嗎?這是唯一能讓 DB/匯出精準的解。
3uid → uuid 大改名:確認要做?成本最大(全 .uid 引用),且只改「OSCAL 有 uuid」的表。
4rename 是 breaking:每條改名都要同步 model / mapper / domain service / 查詢 / FE 欄位。建議與 FR-036 動表時一起做,並逐表驗證。