# ED-02 Context Persistence

**Status:** Ready for Implementation\
**Phase:** Engineering\
**Prerequisite:** ED-01 abgeschlossen

## Ziel

ED-02 erweitert die in ED-01 eingeführten `ContextItem`-Objekte um eine
persistente Speicherung. Die bestehende Datenbankstruktur wird genutzt;
das Domain-Modell bleibt unverändert.

## Scope

ED-02 umfasst:

-   Persistenz von `ContextItem`
-   Nutzung der bestehenden Tabelle `context_item`
-   Erweiterung der relationalen Repositories
-   Data Mapping zwischen Domain und Persistenz
-   Rehydration
-   Persistenztests

Nicht Bestandteil:

-   Transport Mapping (ED-01)
-   Änderungen am Domain-Modell
-   Candidate Discovery
-   SourceDelivery
-   SourceSystem
-   Provenance

## Fachliche Einordnung

`ContextItem` gehört zum Aggregate `SourceValue`.

``` text
SourceValue
 ├── id
 └── ContextItem[*]
      ├── contextTypeUri
      └── value
```

Ein `ContextItem` besitzt keine eigenständige Lebensdauer außerhalb
seines `SourceValue`.

## Persistenzmodell

Die bestehende Tabelle `context_item` wird verwendet.

``` sql
CREATE TABLE context_item (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    source_value_id BIGINT UNSIGNED NOT NULL,
    context_type_uri VARCHAR(512) NOT NULL,
    value TEXT NOT NULL,
    PRIMARY KEY (id),
    KEY idx_context_item_source_value (source_value_id),
    KEY idx_context_item_type (context_type_uri(191)),
    CONSTRAINT fk_context_item_source_value
        FOREIGN KEY (source_value_id)
        REFERENCES source_value(id)
        ON DELETE CASCADE
);
```

## Mapping

  Domain                            Tabelle `context_item`
  --------------------------------- ------------------------
  `ContextItem::contextTypeUri()`   `context_type_uri`
  `ContextItem::value()`            `value`
  Zugehöriger `SourceValue`         `source_value_id`

## Reihenfolge

Die Tabelle enthält kein `sort_order`.

Für ED-02 gilt:

-   Rehydration erfolgt deterministisch über `id ASC`.
-   Es wird keine fachliche Sortierreihenfolge eingeführt.
-   Eine spätere Einführung eines `sort_order` ist eine eigenständige
    Schemaänderung.

## Repository-Integration

Die bestehende Repository-Implementierung wird erweitert um:

-   Speichern aller ContextItems eines SourceValue
-   Aktualisieren des Context-Bestands innerhalb der
    Aggregate-Persistenz
-   Laden aller ContextItems über `source_value_id`
-   Rehydration der Domain-Objekte

Es wird **kein** eigenes Repository für `ContextItem` eingeführt.

## Transaktionsgrenze

`ContextItem` wird gemeinsam mit `SourceValue` innerhalb derselben
Transaktion gespeichert.

## Migration

Für ED-02 ist keine neue Schema-Migration erforderlich. Es wird die
bereits vorhandene Tabelle `context_item` genutzt.

## Architekturentscheidung

`source_uri` ist **bewusst kein Bestandteil** von `ContextItem`.

Begründung:

-   `ContextItem` beschreibt ausschließlich fachlichen Kontext.
-   Herkunfts- und Provenance-Informationen werden zukünftig im Rahmen
    des Provenance-/SourceDelivery-Modells gemäß ADR002 verwaltet.
-   Dadurch bleiben fachlicher Kontext und Herkunft sauber voneinander
    getrennt.

## Tests

-   T001 -- SourceValue ohne ContextItems
-   T002 -- Ein ContextItem
-   T003 -- Mehrere ContextItems
-   T004 -- Aggregate Update
-   T005 -- Cascade Delete
-   T006 -- Rehydration
-   T007 -- Rückwärtskompatibilität

## Akzeptanzkriterien

ED-02 ist abgeschlossen, wenn:

-   die bestehende Tabelle `context_item` verwendet wird,
-   `ContextItem` gemeinsam mit `SourceValue` persistiert wird,
-   Rehydration vollständig funktioniert,
-   die Aggregate-Grenze erhalten bleibt,
-   kein eigenes Repository für `ContextItem` eingeführt wird,
-   alle bestehenden und neuen Tests erfolgreich sind.

## Teildokumente

``` text
ED-02-001_Relational_Mapping.md
ED-02-002_Repository_Integration.md
ED-02-003_Rehydration.md
ED-02-004_Tests.md
```
