Internal Developer Platform  ·  View 12 of 21  ·  Data

Core Data Model

Twelve entities, and the one edge every attribution resolves through.

Editable source SVG draw.io All views
team team_id PK entra_group_id unique cost_centre on_call_rota component component_id PK team_id FK -> team lifecycle enum tier enum tmpl_version_id FK tracks_template bool golden_path path_id PK kind_of_workload supported_floor owner_team_id FK template_version tmpl_version_id PK path_id FK -> golden_path semver published_at retired_at null environment env_id PK component_id FK -> component name dev|stg|prod subscription_id resource resource_id PK env_id FK -> environment kind catalogue entry size named azure_resource_id reclaim_after null deploy deploy_id PK env_id FK -> environment digest FK -> artefact actor_id outcome enum rolled_back_at null artefact digest PK commit_sha builder_identity attestation_uri sbom_uri policy policy_id PK version strength advisory|binding bundle_digest evaluation eval_id PK policy_id FK -> policy subject_ref point pr|pipeline|admission verdict evaluated_at exception exception_id PK policy_id FK -> policy component_id FK -> component approver_id not requester expires_at not null dependency from_component_id FK to_component_id FK kind calls|reads|publishes discovered_from 1 : N 1 : N 1 : N 1 : N 1 : N 1 : N 1 : N 1 : N 1 : N 1 : N Internal Developer Platform — Core Data Model Ownership hangs off one edge, team to component; everything attributable resolves through it. Two foreign keys are deliberately not drawn — exception.component_id and evaluation.subject_ref — because they cross the whole model and the picture is clearer without them. v 1.0 · owner Platform Architecture · date 2026-09

Decisions

  • team → component is the load-bearing relationship: cost, on-call, entitlement and exception approval all resolve through it, which is why a component cannot exist without one (ADR-10).
  • template_version is an entity rather than a string on the component, so drift, supported floors and retirement are queryable facts (ADR-03).
  • evaluation records the point at which it was produced — pull request, pipeline or admission — so an advisory-pass, admission-fail pair is detectable as the defect it is (ADR-06).

Reads as

  • exception carries a mandatory expiry and an approver who is not the requester; both are schema constraints rather than process (ADR-08).
  • dependency is populated from both declaration and observation, and carries which one it came from.

Omitted

  • Two foreign keys are deliberately not drawn — exception.component_id and evaluation.subject_ref — because they cross the whole model and the picture is clearer without them.
  • The audit event store, which is append-only, separate by design, and not joined to any of this (ADR-16).