diff --git a/spring-batch-docs/modules/ROOT/assets/images/meta-data-erd.png b/spring-batch-docs/modules/ROOT/assets/images/meta-data-erd.png
deleted file mode 100644
index 4c2a858131..0000000000
Binary files a/spring-batch-docs/modules/ROOT/assets/images/meta-data-erd.png and /dev/null differ
diff --git a/spring-batch-docs/modules/ROOT/assets/images/meta-data-erd.svg b/spring-batch-docs/modules/ROOT/assets/images/meta-data-erd.svg
new file mode 100644
index 0000000000..0fecf34274
--- /dev/null
+++ b/spring-batch-docs/modules/ROOT/assets/images/meta-data-erd.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/spring-batch-docs/modules/ROOT/pages/schema-appendix.adoc b/spring-batch-docs/modules/ROOT/pages/schema-appendix.adoc
index 34056a578d..cc5320f1c6 100644
--- a/spring-batch-docs/modules/ROOT/pages/schema-appendix.adoc
+++ b/spring-batch-docs/modules/ROOT/pages/schema-appendix.adoc
@@ -22,7 +22,7 @@ variations in how individual database vendors handle data types. The following i
shows an ERD model of all six tables and their relationships to one another:
.Spring Batch Meta-Data ERD
-image::meta-data-erd.png[Spring Batch Meta-Data ERD, scaledwidth="60%"]
+image::meta-data-erd.svg[Spring Batch Meta-Data ERD, scaledwidth="60%"]
[[exampleDDLScripts]]
=== Example DDL Scripts
@@ -322,7 +322,7 @@ CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT (
The following list describes each column:
* `JOB_EXECUTION_ID`: Foreign key representing the `JobExecution` to which the context
-belongs. There may be more than one row associated with a given execution.
+belongs. It is also the primary key, so there can be only one row per job execution.
* `SHORT_CONTEXT`: A string version of the `SERIALIZED_CONTEXT`.
* `SERIALIZED_CONTEXT`: The entire context, serialized.
@@ -351,7 +351,7 @@ CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT (
The following list describes each column:
* `STEP_EXECUTION_ID`: Foreign key representing the `StepExecution` to which the context
-belongs. There may be more than one row associated with a given execution.
+belongs. It is also the primary key, so there can be only one row per step execution.
* `SHORT_CONTEXT`: A string version of the `SERIALIZED_CONTEXT`.
* `SERIALIZED_CONTEXT`: The entire context, serialized.
diff --git a/spring-batch-docs/src/main/models/meta-data-erd.puml b/spring-batch-docs/src/main/models/meta-data-erd.puml
new file mode 100644
index 0000000000..668291652e
--- /dev/null
+++ b/spring-batch-docs/src/main/models/meta-data-erd.puml
@@ -0,0 +1,86 @@
+@startuml
+' Regenerate with PlantUML 1.2026.9 from the repository root:
+' java -jar plantuml.jar -tsvg -o ../../../modules/ROOT/assets/images spring-batch-docs/src/main/models/meta-data-erd.puml
+!pragma layout smetana
+hide circle
+skinparam linetype ortho
+skinparam shadowing false
+skinparam defaultFontName SansSerif
+skinparam classBackgroundColor white
+skinparam classHeaderBackgroundColor #E8EEF2
+skinparam classBorderColor #4B5963
+skinparam ArrowColor #4B5963
+
+entity "BATCH_JOB_INSTANCE" as jobInstance {
+ * JOB_INSTANCE_ID : BIGINT <>
+ --
+ VERSION : BIGINT
+ * JOB_NAME : VARCHAR(100)
+ * JOB_KEY : VARCHAR(32)
+}
+
+entity "BATCH_JOB_EXECUTION" as jobExecution {
+ * JOB_EXECUTION_ID : BIGINT <>
+ --
+ VERSION : BIGINT
+ * JOB_INSTANCE_ID : BIGINT <>
+ * CREATE_TIME : DATETIME(6)
+ START_TIME : DATETIME(6)
+ END_TIME : DATETIME(6)
+ STATUS : VARCHAR(10)
+ EXIT_CODE : VARCHAR(2500)
+ EXIT_MESSAGE : VARCHAR(2500)
+ LAST_UPDATED : DATETIME(6)
+}
+
+entity "BATCH_JOB_EXECUTION_PARAMS" as jobParams {
+ * JOB_EXECUTION_ID : BIGINT <>
+ * PARAMETER_NAME : VARCHAR(100)
+ * PARAMETER_TYPE : VARCHAR(100)
+ PARAMETER_VALUE : VARCHAR(2500)
+ * IDENTIFYING : CHAR(1)
+}
+
+entity "BATCH_STEP_EXECUTION" as stepExecution {
+ * STEP_EXECUTION_ID : BIGINT <>
+ --
+ * VERSION : BIGINT
+ * STEP_NAME : VARCHAR(100)
+ * JOB_EXECUTION_ID : BIGINT <>
+ * CREATE_TIME : DATETIME(6)
+ START_TIME : DATETIME(6)
+ END_TIME : DATETIME(6)
+ STATUS : VARCHAR(10)
+ COMMIT_COUNT : BIGINT
+ READ_COUNT : BIGINT
+ FILTER_COUNT : BIGINT
+ WRITE_COUNT : BIGINT
+ READ_SKIP_COUNT : BIGINT
+ WRITE_SKIP_COUNT : BIGINT
+ PROCESS_SKIP_COUNT : BIGINT
+ ROLLBACK_COUNT : BIGINT
+ EXIT_CODE : VARCHAR(2500)
+ EXIT_MESSAGE : VARCHAR(2500)
+ LAST_UPDATED : DATETIME(6)
+}
+
+entity "BATCH_JOB_EXECUTION_CONTEXT" as jobContext {
+ * JOB_EXECUTION_ID : BIGINT <>
+ --
+ * SHORT_CONTEXT : VARCHAR(2500)
+ SERIALIZED_CONTEXT : TEXT
+}
+
+entity "BATCH_STEP_EXECUTION_CONTEXT" as stepContext {
+ * STEP_EXECUTION_ID : BIGINT <>
+ --
+ * SHORT_CONTEXT : VARCHAR(2500)
+ SERIALIZED_CONTEXT : TEXT
+}
+
+jobInstance ||..o{ jobExecution
+jobExecution ||..o{ stepExecution
+jobExecution ||..o{ jobParams
+jobExecution ||--|| jobContext
+stepExecution ||--|| stepContext
+@enduml