Mapping: Beziehungen
Status: Entwurf
Wie werden die Beziehungen aus 30-domain/07-relations.md auf relation_type-Einträge der Spec (docs/spec/30-domain-model/04-relation-type.md) abgebildet?
Konvention
relation_type.keyist sprechend, lowercase, snake_case.from_entity_type_id/to_entity_type_idzeigen auf dieentity_type-Einträge aus01-fachobjekte-zu-entity-types.md.delete_policy∈restrict,detach,cascade,archive_only. Default:restrict.- Beziehungs-Eigenschaften (z. B. Zeitfenster, Anteil, Rolle in der Beziehung) liegen in
entity_relation.attributes jsonb, validiert viarelation_type_attribute(Spec).
Mapping-Tabelle
relation_type.key | from | to | Kardinalität | delete_policy | Beziehungs-Attribute |
|---|---|---|---|---|---|
holding_has_subsidiary | holding | subsidiary | 1:n | restrict | — |
subsidiary_has_subfirm | subsidiary | subfirm | 1:n | restrict | — |
subsidiary_provides_service | subsidiary | service | 1:n | detach | seit, bis |
subsidiary_provides_module | subsidiary | module | 1:n | restrict | — — primäre Tochter pro Modul (Inverse von module.primary_subsidiary) |
owner_owns_property | owner | property | 1:n | restrict | seit, bis (Eigentümerwechsel = neue Beziehungs-Periode, keine In-Place-Änderung) |
provider_offers_service | external_provider | service | n:m | detach | seit, bis, regional_scope |
provider_offers_material | external_provider | material | n:m | detach | seit, bis, lieferzeit_wochen, mengenrabatt_json |
service_uses_material | service | material | n:m | detach | menge_pro_einheit |
property_has_building | property | building | 1:n | cascade | — |
building_has_unit | building | unit | 1:n | cascade | — |
building_has_pv | building | pv_system | 1:n | restrict | — |
pv_has_storage | pv_system | battery_storage | 1:0..1 | detach | — |
unit_has_meter | unit | meter | 1:n | detach | — |
building_has_meter | building | meter | 1:n | detach | funktion (Hausanschluss, Allgemeinstrom, …) |
pv_has_meter | pv_system | meter | 1:n | detach | — |
unit_has_rent_contract | unit | contract | 1:0..n | restrict | is_active (nur eines true) |
unit_has_tenant_power | unit | tenant_power_contract | 1:0..1 | restrict | — |
unit_has_tenant_access | unit | tenant_access_contract | 1:0..1 | restrict | perspektivisch — Modul mieter_access |
subsidiary_responsible_for_property | subsidiary | property | n:m | detach | rolle, seit, bis, anteil_prozent |
property_booked_module | property | module | n:m | detach | seit, bis, case_id (welcher Case hat das Modul gebucht) |
case_targets_property | case | property | n:1 | restrict | — |
case_mandated_by | case | owner | n:1 | restrict | Pflicht bei case_type=liegenschafts_bewertung/unit_case; leer bei reinem eigenbestand |
case_selects_module | case | module | n:m | cascade | is_primary (für unit_case), Snapshot-Zustand der Modul-Konfiguration des Cases |
case_parent | case | case | n:0..1 | detach | Folge-Case verweist auf Vorgänger (Modul nachbuchen / kündigen). Self-Relation. |
case_belongs_to_subsidiary | case | subsidiary | n:1 | restrict | — |
case_uses_model | case | model_version | n:1 | restrict | — |
case_aggregates_unit_case | case (holding_case) | case (unit_case) | 1:n | restrict | — |
case_has_scenario | case | scenario | 1:n | cascade | — |
case_has_demand | case | demand | 1:n | cascade | — |
case_has_attachment | case | attachment | 1:n | cascade | kategorie |
demand_targets_property | demand | property | n:1 | restrict | — |
demand_targets_trade | demand | trade | n:1 | restrict | — |
demand_assigns_service | demand | service | n:0..1 | detach | — |
demand_assigns_material | demand | material | n:0..n | detach | menge, einheit |
demand_assigns_provider | demand | subsidiary ∪ external_provider | n:0..1 | detach | siehe Hinweis unten |
contract_provider_is_subsidiary | contract | subsidiary | n:1 | restrict | is_internal_to_holding |
contract_provider_is_external | contract | external_provider | n:1 | restrict | — |
contract_for_property | contract | property | n:0..1 | restrict | — |
contract_for_unit | contract | unit | n:0..1 | restrict | — |
contract_for_pv | contract | pv_system | n:0..1 | restrict | — |
contract_uses_template | contract | contract_template | n:0..1 | detach | — |
model_version_of | model_version | model | n:1 | restrict | — |
model_test_belongs_to | model_test_case | model_version | n:1 | restrict | — |
Hinweis: heterogene Endpunkte
demand_assigns_provider kann sowohl auf subsidiary (interner Provider) als auch auf external_provider zeigen. Optionen:
- Zwei
relation_type-Einträge (demand_assigns_subsidiary_provider,demand_assigns_external_provider) — sauber, redundant. - Ein
relation_typemit Polymorphie über zusätzliches Feld — nicht im aktuellen Spec-Schema unterstützt.
V1: Variante 1 (zwei Relations-Typen). Phase 2 ggf. polymorph. Siehe docs/spec/90-governance/03-open-questions.md (potentiell neuer Punkt).
Beziehungs-Attribute (Beispiel)
subsidiary_responsible_for_property.attributes:
{ "rolle": "verwaltung", "seit": "2024-01-01", "bis": null, "anteil_prozent": 100}relation_type_attribute definiert, welche Felder erlaubt / pflicht sind — siehe docs/spec/30-domain-model/16-relation-type-attribute.md.
Verwandte Dokumente
01-fachobjekte-zu-entity-types.md../30-domain/07-relations.mddocs/spec/30-domain-model/04-relation-type.mddocs/spec/30-domain-model/16-relation-type-attribute.md