Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CQRS - ein neues Modell für Datenhaltung in Con...

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers. →

CQRS - ein neues Modell für Datenhaltung in Contao?

ontao setzt heute auf klassische CRUD-Mechanismen und direkte Datenbankänderungen – ein bewährter Ansatz, der das CMS seit Jahren prägt. Doch moderne Architekturen wie CQRS und Event Sourcing eröffnen neue Möglichkeiten im Umgang mit Zustandsänderungen und Datenhaltung.
In diesem Vortrag werfen wir einen Blick auf diese Konzepte, zeigen ihre Grundideen und diskutieren, welche Chancen sie für die Zukunft von Contao bieten könnten.

Ein Blick auf Contao, wie wir es kennen – und wie es vielleicht einmal werden könnte.

Avatar for Yanick Witschi

Yanick Witschi

October 20, 2026

More Decks by Yanick Witschi

Other Decks in Technology

Transcript

  1. CQRS - ein neues Modell für Datenhaltung in Contao? fl

    Contao Summit 2026 Yanick Witschi @to ar
  2. Darstellung wird austauschbarer. • Layouts lassen sich einfach erzeugen •

    Landingpages lassen sich «günstig» anlegen • Qualität ist manchmal nicht entscheidend, weil die Kampagne bspw. nur 6 Monate läuft • Ja, das sind Pauschalisierungen - but you get the point • Also welchen Mehrwert kann ein CMS noch bieten?
  3. Content. Darstellung Content Layout Komponenten Landingpages Templates Wissen Beziehungen Freigaben

    Verantwortung Historie Kollaboration ständig neu erzeugbar über Jahre gewachsen
  4. Jahr 2. «Wir möchten den News Kategorien zuordnen.» tl_news id

    title published category_id tl_category id name
  5. Jahr 3. «Wir möchten den News Tags zuordnen.» tl_news id

    title published category_id tl_category id name tl_news_tag news_id tag_id tl_tag id name
  6. Jahr 4. «Zeigt die 10 neuesten News aus der Kategorie

    Produkte – inklusive Tags, Autor und Anzahl der Kommentare.» 250ms 🐢
  7. Cache Invalidation is hard. • News geändert • Kategorie geändert

    • Tag geändert • Kommentar hinzugefügt • Autor umbenannt
  8. Cache Tagging to the rescue? • news:list:produkte • news:list:produkte:de •

    news:list:produkte:dealer • category:42 • homepage:news • …
  9. Wir p egen jetzt den Cache. • Leseperformance gelöst ✅

    • Aber plötzlich müssen wir bei jeder Änderung wissen, welche Cache-Einträge invalidiert werden müssen 😟 • Welche müssen neu berechnet werden? 😟 • In welcher Reihenfolge? 😟 fl fl • Der Cache ist mehr als nur ein Performance-P aster 🩹
  10. Wir p egen also schon längst ein zweites Modell! •

    Wir p egen also längst ein zweites Daten-Modell zusätzlich zu unseren Daten in der Datenbank! fl fl • Wir nennen es nur «Cache»
  11. Zwei Verantwortlichkeiten. Command Query «Verö entliche diese News.» «Welche Inhalte

    sind jetzt sichtbar?» Validiert, prüft Regeln Verändert den Zustand Liefert das passende Lesemodell ff ≠ zwei Systeme = zwei Verantwortlichkeiten
  12. Absicht vs. Antwort. WRITE MODEL READ MODEL Commands Geschäftsregeln Konsistenz

    Transaktionen Queries Projection vorberechnete Antworten für einen konkreten Use Case
  13. Eine Projection ist eine vorbereitete Antwort. news_overview id headline category

    tags comments_count published_at 42 Herbstangebot Produkte Sommer, Aktion 17 2026-10-15 09:30 «Das ist doch nur ein glori zierter Cache!» fi Jep - und genau deshalb ist die Idee auch nicht exotisch!
  14. Wo liegt die Komplexität heute? HEUTE tl_news tl_category tl_news_tag tl_tag

    MIT PROJECTION / CQRS Controller Template 4 Queries PHP Logik tl_news tl_category tl_news_tag tl_tag Projection 4 Queries PHP Logik news_overview id headline category tags […] ? API? Controller Einmal aufbereiten. Überall lesen. Template HTML API JSON XML […]
  15. Die Komplexität verschwindet nicht! Heute Mit Read Model / Projection

    Request Query 1 JOIN Query 2 JOIN Änderung Projection Request news_overview JOIN Query 3 Sie bekommt einen de nierten Ort! fi PHP
  16. Wie bleibt das Read Model aktuell? WRITE MODEL READ MODEL

    tl_news tl_category tl_news_tag tl_tag news_overview NewsChanged Synchron, Queue, Message oder Event - CQRS schreibt das nicht vor.
  17. Event ≠ Event Sourcing. UPDATE tl_news NewsChanged Projektion aktualisieren Die

    Wahrheit bleibt in tl_news, tl_category, tl_tag … Events benutzen ist noch kein Event Sourcing. Event weg
  18. Was wissen unsere Modelle? Es ist Oktober 2026. WRITE MODEL

    tl_news tl_category tl_tag READ MODEL id headline category published tl_news_tag Beide wissen nur, was jetzt gilt. März 2026? 🤷 42 Herbstangebot Aktionen 1
  19. Und das Event von damals? UPDATE tl_news NewsChanged Projektion aktualisieren

    Das Event ist längst weg. Eine Projection kann nur projizieren, was ihre Quelle noch weiss. Event weg
  20. Also müssen wir die Veränderungen behalten. 2026-01-01 15:41 NewsCreated headline:

    Sommerangebot 2026-01-01 15:45 CategoryAssigned category: Produkte 2026-01-18 09:42 NewsPublished 2026-06-01 18:33 HeadlineChanged headline: Herbstangebot
  21. «Was wäre, wenn das nicht einfach nur eine Liste an

    Änderungen (Historie) wäre?» «Was, wenn diese Historie einfach unsere Daten wären?»
  22. Der aktuelle Zustand ist jetzt auch nur eine Projection. news_overview

    Aktueller Zustand categories_list EVENT STREAM Projections comments_per_news 2026-01-01 15:41 NewsCreated Search 2026-01-01 15:45 CategoryAssigned Reporting 2026-01-18 09:42 NewsPublished 2026-06-01 18:33 HeadlineChanged Audit / Versionshistorie
  23. Jahr 2030 (unbekannte Zukunft). fi «Ich wüsste gerne welche 10

    News in den letzten 5 Jahren am häu gsten überarbeitet wurden und von welchen Abteilungen.»
  24. Neue Frage - neue Antwort! news_overview Aktueller Zustand categories_list EVENT

    STREAM Projections comments_per_news Neue Projection/Antwort 2026-01-01 15:41 NewsCreated Search 2026-01-01 15:45 CategoryAssigned Reporting 2026-01-18 09:42 NewsPublished 2026-06-01 18:33 HeadlineChanged Audit / Versionshistorie
  25. Nicht alles braucht Geschichte. CONTENT BETRIEBSDATEN GEHEIMNISSE Event Sourcing Current

    State Ohne Historie Versionen Freigaben Redaktionelle Entscheidungen Caches Flüchtige Zustände Synchronisierte Logs Passwort Hashes Tokens API-Keys sensible Daten Die Architektur folgt dem Wert der Information.
  26. Eigentlich haben wir gerade Git für Content diskutiert. GIT EVENT

    SOURCING Commit Event History Event Stream Working Tree Current State Projection
  27. KI: Via MCP verändert sie jetzt den Content. Contao «Überarbeite

    alle 300 Produkttexte auf unsere neue Tonalität.» 300 Änderungen
  28. Historie sagt uns, was passiert ist. Sie verhindert nicht, dass

    es passiert. AI / MCP 300 Änderungen Soll der Agent wirklich direkt die Wahrheit verändern? Live
  29. Branches passen natürlich auf Event Sourcing. Branch: main/live NewsCreated CategoryAssigned

    NewsPublished TitleChanged Branch: ai-does-whatever-it-does TeaserChanged TileChanged
  30. Die Zukunft von Contao könnte sein Gedächtnis sein. Und vielleicht

    seine Fähigkeit, Änderungen zu prüfen, bevor sie zur Wahrheit werden.
  31. Ein Content Repository das alles mitbringt? CONTENT HISTORY Schemas Nodes

    Felder Regeln Events Actor Metadaten Versionen READ WORKFLOW Queries Projections Read Models Branches Compare Merge Permissions
  32. Komplexität hinter den Kulissen ANWENDUNG SILO KÜMMERT SICH UM ALLES

    Schema & Validation Events & History Branches & Merge Projections & Queries Permissions
  33. Contact • Always up for hire! • Fediverse: phpc.social/@to ar

    • X: @to ar • GitHub: to ar • E-Mail: [email protected] fl fl fl • Slack