<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://mediawiki.wissen-ahrensburg.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Thorsten</id>
	<title>Dokument - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.wissen-ahrensburg.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Thorsten"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/Spezial:Beitr%C3%A4ge/Thorsten"/>
	<updated>2026-08-19T16:07:57Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Drupal&amp;diff=615</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Drupal&amp;diff=615"/>
		<updated>2026-08-18T16:42:33Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: /* Content Sync */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;br /&gt;
==Konfiguration exportieren (YAML)==&lt;br /&gt;
Die gesamte Website-Struktur (Content-Typen, Felder, Views, Taxonomie-Vokabulare, Rollen-Berechtigungen) wird als standardisierte YAML-Dateien exportiert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush config:export --destination=/pfad/zum/backup/config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Inhalts Backup==&lt;br /&gt;
===Inhalte als CSV/XLSX===&lt;br /&gt;
Modul Views Data Export (drush en views_data_export). Du legst eine View auf Inhalte an, fügst eine Anzeige „Data Export&amp;quot; hinzu, wählst CSV/JSON/XML und die gewünschten Felder. Ergebnis ist ein Download-Pfad, den du auch per Cron automatisiert schreiben lassen kannst.&lt;br /&gt;
===Inhalte auf eine andere Drupal-Site übertragen===&lt;br /&gt;
====Default Content====&lt;br /&gt;
Modul: &amp;lt;pre&amp;gt;drush en default_content&amp;lt;/pre&amp;gt;&lt;br /&gt;
Exportiert Nodes samt referenzierter Entitäten (Taxonomiebegriffe, Medien, …) als YAML/JSON-API-Dateien, ideal um Inhalte mit einem Modul/Install-Profil auszuliefern.&lt;br /&gt;
* Export: &amp;lt;pre&amp;gt;drush default-content-export node &amp;lt;nid&amp;gt;&amp;lt;/pre&amp;gt; bzw. &amp;lt;pre&amp;gt;drush default-content-export-module &amp;lt;modulname&amp;gt;&amp;lt;/pre&amp;gt; schreibt die Dateien nach &amp;lt;code&amp;gt;MODULENAME/content/node/&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Import: Modul auf der Zielsite aktivieren – die Inhalte werden bei der Installation automatisch importiert (Hook &amp;lt;code&amp;gt;hook_install&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;default_content_deploy&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Einsatzzweck: Demo-Inhalte, die zusammen mit einem Feature/Modul ausgeliefert werden sollen.&lt;br /&gt;
&lt;br /&gt;
====Content Sync====&lt;br /&gt;
Modul: &amp;lt;code&amp;gt;content_sync&amp;lt;/code&amp;gt;. Funktioniert wie &amp;lt;code&amp;gt;drush config:export/import&amp;lt;/code&amp;gt;, aber für Content-Entitäten.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush content-sync:export&lt;br /&gt;
drush content-sync:import&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Export schreibt Inhalte als YAML in einen Content-Sync-Ordner, Import liest sie auf der Zielsite wieder ein. Eignet sich für Staging→Live-Workflows mit identischer Site-Struktur, bei denen Content wie Konfiguration versioniert/deployed werden soll.&lt;br /&gt;
&lt;br /&gt;
====Migrate API====&lt;br /&gt;
Module: &amp;lt;code&amp;gt;migrate_plus&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;migrate_tools&amp;lt;/code&amp;gt;. Der robusteste, aber aufwändigste Weg – funktioniert auch bei unterschiedlichen Strukturen/Content-Types zwischen Quelle und Ziel.&lt;br /&gt;
* Migration-Definition als YAML (&amp;lt;code&amp;gt;migrate_plus.migration.*.yml&amp;lt;/code&amp;gt;) mit drei Teilen:&lt;br /&gt;
** &#039;&#039;&#039;source&#039;&#039;&#039; – z. B. &amp;lt;code&amp;gt;url&amp;lt;/code&amp;gt; (JSON:API der Quellsite), &amp;lt;code&amp;gt;csv&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sql&amp;lt;/code&amp;gt; (direkter DB-Zugriff)&lt;br /&gt;
** &#039;&#039;&#039;process&#039;&#039;&#039; – Feld-Mapping/Transformation (Quellfeld → Zielfeld, inkl. Transformationen wie Datumsformate)&lt;br /&gt;
** &#039;&#039;&#039;destination&#039;&#039;&#039; – z. B. &amp;lt;code&amp;gt;entity:node&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ausführen: &amp;lt;pre&amp;gt;&lt;br /&gt;
drush migrate:import migration_id&lt;br /&gt;
drush migrate:status&lt;br /&gt;
drush migrate:rollback migration_id&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vorteil: wiederholbar und idempotent, daher gut geeignet für große oder strukturell abweichende Sites.&lt;br /&gt;
&lt;br /&gt;
====Core JSON:API====&lt;br /&gt;
Kein Zusatzmodul nötig, nur Core-Modul &amp;lt;code&amp;gt;jsonapi&amp;lt;/code&amp;gt; aktivieren.&lt;br /&gt;
* Alle Artikel: &amp;lt;pre&amp;gt;GET /jsonapi/node/article&amp;lt;/pre&amp;gt; (Pagination über &amp;lt;code&amp;gt;page[offset]&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;page[limit]&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Einzelner Node: &amp;lt;pre&amp;gt;GET /jsonapi/node/article/{uuid}&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Referenzen mitladen: &amp;lt;pre&amp;gt;GET /jsonapi/node/article?include=field_tags,uid&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Anlegen auf Zielsite: &amp;lt;pre&amp;gt;POST /jsonapi/node/article&amp;lt;/pre&amp;gt; mit Bearer-Token oder Basic-Auth-Berechtigung.&lt;br /&gt;
* Eignet sich als Quelle für eine Migration (siehe Migrate API, &amp;lt;code&amp;gt;source: plugin: url&amp;lt;/code&amp;gt;) oder für eigene Skripte, die Daten abholen und auf der Zielsite wieder anlegen.&lt;br /&gt;
&lt;br /&gt;
====Entscheidungshilfe====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Methode !! Für !! Aufwand&lt;br /&gt;
|-&lt;br /&gt;
| [[Default Content]] || Demo-Inhalte mit Modul ausliefern || gering&lt;br /&gt;
|-&lt;br /&gt;
| Content Sync || Staging→Live, identische Site-Struktur || gering–mittel&lt;br /&gt;
|-&lt;br /&gt;
| Migrate API || große/strukturell abweichende Sites, wiederholbare Importe || hoch&lt;br /&gt;
|-&lt;br /&gt;
| JSON:API || Ad-hoc-Abfragen, eigene Skripte, Migrate-Quelle || gering (aber manuell)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Benutzerdaten ausschließen====&lt;br /&gt;
Bei allen vier Wegen hängt am Node standardmäßig ein Autor-Feld (&amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;), das sonst die komplette User-Entität (Name, E-Mail, Passwort-Hash, Rollen) mit hochziehen kann.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Views Data Export&#039;&#039;&#039;: unkritisch – nur Felder, die explizit zur View hinzugefügt werden, landen im Export. Das Feld „Authored by“/„uid“ einfach nicht hinzufügen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Default Content&#039;&#039;&#039;: Der Exporter zieht referenzierte Entitäten (also auch den Autor) standardmäßig mit.&lt;br /&gt;
* Vor dem Export den Node-Autor auf einen neutralen, auf beiden Sites vorhandenen Account setzen (z. B. &amp;lt;code&amp;gt;uid: 1&amp;lt;/code&amp;gt;), oder&lt;br /&gt;
* Nach dem Export das &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;-Feld in der generierten YAML-Datei manuell entfernen/überschreiben, oder&lt;br /&gt;
* Per &amp;lt;code&amp;gt;hook_default_content_export_alter()&amp;lt;/code&amp;gt; das &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;-Feld aus dem zu exportierenden Entity-Array streichen, bevor die YAML geschrieben wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Content Sync&#039;&#039;&#039;: Im Konfigurationsformular wählst du gezielt aus, welche Entity-Types synchronisiert werden. Lässt du „User“ dort weg, werden keine Benutzer-Entitäten exportiert/importiert – das &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;-Feld am Node bleibt dann nur eine ID-Referenz, die auf der Zielsite auf einen dort bereits existierenden User zeigen muss (sonst leer/ungültig).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Migrate API&#039;&#039;&#039;: am saubersten steuerbar – im &amp;lt;code&amp;gt;process&amp;lt;/code&amp;gt;-Mapping das Quellfeld &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt; einfach nicht mappen oder fix auf einen Default-Wert setzen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
process:&lt;br /&gt;
  uid:&lt;br /&gt;
    plugin: default_value&lt;br /&gt;
    default_value: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Damit wird die User-Quelle für diese Migration gar nicht erst abgefragt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;JSON:API&#039;&#039;&#039;:&lt;br /&gt;
* Beim Abruf per Sparse Fieldset das &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;-Feld weglassen und nicht in &amp;lt;code&amp;gt;include&amp;lt;/code&amp;gt; aufführen: &amp;lt;pre&amp;gt;GET /jsonapi/node/article?fields[node--article]=title,body,field_tags&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Der anonymen/API-Rolle nicht die Berechtigung „View user information“ geben – dann liefert &amp;lt;code&amp;gt;/jsonapi/user/user&amp;lt;/code&amp;gt; ohnehin nichts.&lt;br /&gt;
* Beim Anlegen (&amp;lt;code&amp;gt;POST /jsonapi/node/article&amp;lt;/code&amp;gt;) die &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;-Relationship einfach weglassen – Drupal setzt automatisch den authentifizierten API-User als Autor.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Empfehlung&#039;&#039;&#039;: Statt echte Benutzerkonten zu übertragen, auf beiden Sites einen festen technischen Autor anlegen (z. B. „content-import“, gleiche &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;/Name) und alle migrierten Inhalte auf diesen Account mappen. Das vermeidet auch DSGVO-Probleme, da Passwort-Hashes/E-Mails nie den Server verlassen.&lt;br /&gt;
==Hinweis==&lt;br /&gt;
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Drupal&amp;diff=614</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Drupal&amp;diff=614"/>
		<updated>2026-08-18T16:38:56Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;br /&gt;
==Konfiguration exportieren (YAML)==&lt;br /&gt;
Die gesamte Website-Struktur (Content-Typen, Felder, Views, Taxonomie-Vokabulare, Rollen-Berechtigungen) wird als standardisierte YAML-Dateien exportiert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush config:export --destination=/pfad/zum/backup/config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Inhalts Backup==&lt;br /&gt;
===Inhalte als CSV/XLSX===&lt;br /&gt;
Modul Views Data Export (drush en views_data_export). Du legst eine View auf Inhalte an, fügst eine Anzeige „Data Export&amp;quot; hinzu, wählst CSV/JSON/XML und die gewünschten Felder. Ergebnis ist ein Download-Pfad, den du auch per Cron automatisiert schreiben lassen kannst.&lt;br /&gt;
===Inhalte auf eine andere Drupal-Site übertragen===&lt;br /&gt;
====Default Content====&lt;br /&gt;
Modul: &amp;lt;pre&amp;gt;drush en default_content&amp;lt;/pre&amp;gt;&lt;br /&gt;
Exportiert Nodes samt referenzierter Entitäten (Taxonomiebegriffe, Medien, …) als YAML/JSON-API-Dateien, ideal um Inhalte mit einem Modul/Install-Profil auszuliefern.&lt;br /&gt;
* Export: &amp;lt;pre&amp;gt;drush default-content-export node &amp;lt;nid&amp;gt;&amp;lt;/pre&amp;gt; bzw. &amp;lt;pre&amp;gt;drush default-content-export-module &amp;lt;modulname&amp;gt;&amp;lt;/pre&amp;gt; schreibt die Dateien nach &amp;lt;code&amp;gt;MODULENAME/content/node/&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Import: Modul auf der Zielsite aktivieren – die Inhalte werden bei der Installation automatisch importiert (Hook &amp;lt;code&amp;gt;hook_install&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;default_content_deploy&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Einsatzzweck: Demo-Inhalte, die zusammen mit einem Feature/Modul ausgeliefert werden sollen.&lt;br /&gt;
&lt;br /&gt;
====Content Sync====&lt;br /&gt;
Modul: &amp;lt;code&amp;gt;content_sync&amp;lt;/code&amp;gt;. Funktioniert wie &amp;lt;code&amp;gt;drush config:export/import&amp;lt;/code&amp;gt;, aber für Content-Entitäten.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[drush]] content-sync:export&lt;br /&gt;
drush content-sync:import&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Export schreibt Inhalte als YAML in einen Content-Sync-Ordner, Import liest sie auf der Zielsite wieder ein. Eignet sich für Staging→Live-Workflows mit identischer Site-Struktur, bei denen Content wie Konfiguration versioniert/deployed werden soll.&lt;br /&gt;
&lt;br /&gt;
====Migrate API====&lt;br /&gt;
Module: &amp;lt;code&amp;gt;migrate_plus&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;migrate_tools&amp;lt;/code&amp;gt;. Der robusteste, aber aufwändigste Weg – funktioniert auch bei unterschiedlichen Strukturen/Content-Types zwischen Quelle und Ziel.&lt;br /&gt;
* Migration-Definition als YAML (&amp;lt;code&amp;gt;migrate_plus.migration.*.yml&amp;lt;/code&amp;gt;) mit drei Teilen:&lt;br /&gt;
** &#039;&#039;&#039;source&#039;&#039;&#039; – z. B. &amp;lt;code&amp;gt;url&amp;lt;/code&amp;gt; (JSON:API der Quellsite), &amp;lt;code&amp;gt;csv&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sql&amp;lt;/code&amp;gt; (direkter DB-Zugriff)&lt;br /&gt;
** &#039;&#039;&#039;process&#039;&#039;&#039; – Feld-Mapping/Transformation (Quellfeld → Zielfeld, inkl. Transformationen wie Datumsformate)&lt;br /&gt;
** &#039;&#039;&#039;destination&#039;&#039;&#039; – z. B. &amp;lt;code&amp;gt;entity:node&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ausführen: &amp;lt;pre&amp;gt;&lt;br /&gt;
drush migrate:import migration_id&lt;br /&gt;
drush migrate:status&lt;br /&gt;
drush migrate:rollback migration_id&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vorteil: wiederholbar und idempotent, daher gut geeignet für große oder strukturell abweichende Sites.&lt;br /&gt;
&lt;br /&gt;
====Core JSON:API====&lt;br /&gt;
Kein Zusatzmodul nötig, nur Core-Modul &amp;lt;code&amp;gt;jsonapi&amp;lt;/code&amp;gt; aktivieren.&lt;br /&gt;
* Alle Artikel: &amp;lt;pre&amp;gt;GET /jsonapi/node/article&amp;lt;/pre&amp;gt; (Pagination über &amp;lt;code&amp;gt;page[offset]&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;page[limit]&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Einzelner Node: &amp;lt;pre&amp;gt;GET /jsonapi/node/article/{uuid}&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Referenzen mitladen: &amp;lt;pre&amp;gt;GET /jsonapi/node/article?include=field_tags,uid&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Anlegen auf Zielsite: &amp;lt;pre&amp;gt;POST /jsonapi/node/article&amp;lt;/pre&amp;gt; mit Bearer-Token oder Basic-Auth-Berechtigung.&lt;br /&gt;
* Eignet sich als Quelle für eine Migration (siehe Migrate API, &amp;lt;code&amp;gt;source: plugin: url&amp;lt;/code&amp;gt;) oder für eigene Skripte, die Daten abholen und auf der Zielsite wieder anlegen.&lt;br /&gt;
&lt;br /&gt;
====Entscheidungshilfe====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Methode !! Für !! Aufwand&lt;br /&gt;
|-&lt;br /&gt;
| [[Default Content]] || Demo-Inhalte mit Modul ausliefern || gering&lt;br /&gt;
|-&lt;br /&gt;
| Content Sync || Staging→Live, identische Site-Struktur || gering–mittel&lt;br /&gt;
|-&lt;br /&gt;
| Migrate API || große/strukturell abweichende Sites, wiederholbare Importe || hoch&lt;br /&gt;
|-&lt;br /&gt;
| JSON:API || Ad-hoc-Abfragen, eigene Skripte, Migrate-Quelle || gering (aber manuell)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Benutzerdaten ausschließen====&lt;br /&gt;
Bei allen vier Wegen hängt am Node standardmäßig ein Autor-Feld (&amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;), das sonst die komplette User-Entität (Name, E-Mail, Passwort-Hash, Rollen) mit hochziehen kann.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Views Data Export&#039;&#039;&#039;: unkritisch – nur Felder, die explizit zur View hinzugefügt werden, landen im Export. Das Feld „Authored by“/„uid“ einfach nicht hinzufügen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Default Content&#039;&#039;&#039;: Der Exporter zieht referenzierte Entitäten (also auch den Autor) standardmäßig mit.&lt;br /&gt;
* Vor dem Export den Node-Autor auf einen neutralen, auf beiden Sites vorhandenen Account setzen (z. B. &amp;lt;code&amp;gt;uid: 1&amp;lt;/code&amp;gt;), oder&lt;br /&gt;
* Nach dem Export das &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;-Feld in der generierten YAML-Datei manuell entfernen/überschreiben, oder&lt;br /&gt;
* Per &amp;lt;code&amp;gt;hook_default_content_export_alter()&amp;lt;/code&amp;gt; das &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;-Feld aus dem zu exportierenden Entity-Array streichen, bevor die YAML geschrieben wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Content Sync&#039;&#039;&#039;: Im Konfigurationsformular wählst du gezielt aus, welche Entity-Types synchronisiert werden. Lässt du „User“ dort weg, werden keine Benutzer-Entitäten exportiert/importiert – das &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;-Feld am Node bleibt dann nur eine ID-Referenz, die auf der Zielsite auf einen dort bereits existierenden User zeigen muss (sonst leer/ungültig).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Migrate API&#039;&#039;&#039;: am saubersten steuerbar – im &amp;lt;code&amp;gt;process&amp;lt;/code&amp;gt;-Mapping das Quellfeld &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt; einfach nicht mappen oder fix auf einen Default-Wert setzen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
process:&lt;br /&gt;
  uid:&lt;br /&gt;
    plugin: default_value&lt;br /&gt;
    default_value: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Damit wird die User-Quelle für diese Migration gar nicht erst abgefragt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;JSON:API&#039;&#039;&#039;:&lt;br /&gt;
* Beim Abruf per Sparse Fieldset das &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;-Feld weglassen und nicht in &amp;lt;code&amp;gt;include&amp;lt;/code&amp;gt; aufführen: &amp;lt;pre&amp;gt;GET /jsonapi/node/article?fields[node--article]=title,body,field_tags&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Der anonymen/API-Rolle nicht die Berechtigung „View user information“ geben – dann liefert &amp;lt;code&amp;gt;/jsonapi/user/user&amp;lt;/code&amp;gt; ohnehin nichts.&lt;br /&gt;
* Beim Anlegen (&amp;lt;code&amp;gt;POST /jsonapi/node/article&amp;lt;/code&amp;gt;) die &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;-Relationship einfach weglassen – Drupal setzt automatisch den authentifizierten API-User als Autor.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Empfehlung&#039;&#039;&#039;: Statt echte Benutzerkonten zu übertragen, auf beiden Sites einen festen technischen Autor anlegen (z. B. „content-import“, gleiche &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;/Name) und alle migrierten Inhalte auf diesen Account mappen. Das vermeidet auch DSGVO-Probleme, da Passwort-Hashes/E-Mails nie den Server verlassen.&lt;br /&gt;
==Hinweis==&lt;br /&gt;
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Drush_installieren&amp;diff=613</id>
		<title>Drush installieren</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Drush_installieren&amp;diff=613"/>
		<updated>2026-08-18T16:37:46Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: Die Seite wurde neu angelegt: „mmm“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;mmm&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Drupal&amp;diff=612</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Drupal&amp;diff=612"/>
		<updated>2026-08-18T15:39:47Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;br /&gt;
==Konfiguration exportieren (YAML)==&lt;br /&gt;
Die gesamte Website-Struktur (Content-Typen, Felder, Views, Taxonomie-Vokabulare, Rollen-Berechtigungen) wird als standardisierte YAML-Dateien exportiert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush config:export --destination=/pfad/zum/backup/config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Inhalts Backup==&lt;br /&gt;
===Inhalte als CSV/XLSX===&lt;br /&gt;
Modul Views Data Export (drush en views_data_export). Du legst eine View auf Inhalte an, fügst eine Anzeige „Data Export&amp;quot; hinzu, wählst CSV/JSON/XML und die gewünschten Felder. Ergebnis ist ein Download-Pfad, den du auch per Cron automatisiert schreiben lassen kannst.&lt;br /&gt;
===Inhalte auf eine andere Drupal-Site übertragen===&lt;br /&gt;
====Default Content====&lt;br /&gt;
Modul: &amp;lt;pre&amp;gt;drush en default_content&amp;lt;/pre&amp;gt;&lt;br /&gt;
Exportiert Nodes samt referenzierter Entitäten (Taxonomiebegriffe, Medien, …) als YAML/JSON-API-Dateien, ideal um Inhalte mit einem Modul/Install-Profil auszuliefern.&lt;br /&gt;
* Export: &amp;lt;pre&amp;gt;drush default-content-export node &amp;lt;nid&amp;gt;&amp;lt;/pre&amp;gt; bzw. &amp;lt;pre&amp;gt;drush default-content-export-module &amp;lt;modulname&amp;gt;&amp;lt;/pre&amp;gt; schreibt die Dateien nach &amp;lt;code&amp;gt;MODULENAME/content/node/&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Import: Modul auf der Zielsite aktivieren – die Inhalte werden bei der Installation automatisch importiert (Hook &amp;lt;code&amp;gt;hook_install&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;default_content_deploy&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Einsatzzweck: Demo-Inhalte, die zusammen mit einem Feature/Modul ausgeliefert werden sollen.&lt;br /&gt;
&lt;br /&gt;
====Content Sync====&lt;br /&gt;
Modul: &amp;lt;code&amp;gt;content_sync&amp;lt;/code&amp;gt;. Funktioniert wie &amp;lt;code&amp;gt;drush config:export/import&amp;lt;/code&amp;gt;, aber für Content-Entitäten.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush content-sync:export&lt;br /&gt;
drush content-sync:import&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Export schreibt Inhalte als YAML in einen Content-Sync-Ordner, Import liest sie auf der Zielsite wieder ein. Eignet sich für Staging→Live-Workflows mit identischer Site-Struktur, bei denen Content wie Konfiguration versioniert/deployed werden soll.&lt;br /&gt;
&lt;br /&gt;
====Migrate API====&lt;br /&gt;
Module: &amp;lt;code&amp;gt;migrate_plus&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;migrate_tools&amp;lt;/code&amp;gt;. Der robusteste, aber aufwändigste Weg – funktioniert auch bei unterschiedlichen Strukturen/Content-Types zwischen Quelle und Ziel.&lt;br /&gt;
* Migration-Definition als YAML (&amp;lt;code&amp;gt;migrate_plus.migration.*.yml&amp;lt;/code&amp;gt;) mit drei Teilen:&lt;br /&gt;
** &#039;&#039;&#039;source&#039;&#039;&#039; – z. B. &amp;lt;code&amp;gt;url&amp;lt;/code&amp;gt; (JSON:API der Quellsite), &amp;lt;code&amp;gt;csv&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sql&amp;lt;/code&amp;gt; (direkter DB-Zugriff)&lt;br /&gt;
** &#039;&#039;&#039;process&#039;&#039;&#039; – Feld-Mapping/Transformation (Quellfeld → Zielfeld, inkl. Transformationen wie Datumsformate)&lt;br /&gt;
** &#039;&#039;&#039;destination&#039;&#039;&#039; – z. B. &amp;lt;code&amp;gt;entity:node&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ausführen: &amp;lt;pre&amp;gt;&lt;br /&gt;
drush migrate:import migration_id&lt;br /&gt;
drush migrate:status&lt;br /&gt;
drush migrate:rollback migration_id&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vorteil: wiederholbar und idempotent, daher gut geeignet für große oder strukturell abweichende Sites.&lt;br /&gt;
&lt;br /&gt;
====Core JSON:API====&lt;br /&gt;
Kein Zusatzmodul nötig, nur Core-Modul &amp;lt;code&amp;gt;jsonapi&amp;lt;/code&amp;gt; aktivieren.&lt;br /&gt;
* Alle Artikel: &amp;lt;pre&amp;gt;GET /jsonapi/node/article&amp;lt;/pre&amp;gt; (Pagination über &amp;lt;code&amp;gt;page[offset]&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;page[limit]&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Einzelner Node: &amp;lt;pre&amp;gt;GET /jsonapi/node/article/{uuid}&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Referenzen mitladen: &amp;lt;pre&amp;gt;GET /jsonapi/node/article?include=field_tags,uid&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Anlegen auf Zielsite: &amp;lt;pre&amp;gt;POST /jsonapi/node/article&amp;lt;/pre&amp;gt; mit Bearer-Token oder Basic-Auth-Berechtigung.&lt;br /&gt;
* Eignet sich als Quelle für eine Migration (siehe Migrate API, &amp;lt;code&amp;gt;source: plugin: url&amp;lt;/code&amp;gt;) oder für eigene Skripte, die Daten abholen und auf der Zielsite wieder anlegen.&lt;br /&gt;
&lt;br /&gt;
====Entscheidungshilfe====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Methode !! Für !! Aufwand&lt;br /&gt;
|-&lt;br /&gt;
| [[Default Content]] || Demo-Inhalte mit Modul ausliefern || gering&lt;br /&gt;
|-&lt;br /&gt;
| Content Sync || Staging→Live, identische Site-Struktur || gering–mittel&lt;br /&gt;
|-&lt;br /&gt;
| Migrate API || große/strukturell abweichende Sites, wiederholbare Importe || hoch&lt;br /&gt;
|-&lt;br /&gt;
| JSON:API || Ad-hoc-Abfragen, eigene Skripte, Migrate-Quelle || gering (aber manuell)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Benutzerdaten ausschließen====&lt;br /&gt;
Bei allen vier Wegen hängt am Node standardmäßig ein Autor-Feld (&amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;), das sonst die komplette User-Entität (Name, E-Mail, Passwort-Hash, Rollen) mit hochziehen kann.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Views Data Export&#039;&#039;&#039;: unkritisch – nur Felder, die explizit zur View hinzugefügt werden, landen im Export. Das Feld „Authored by“/„uid“ einfach nicht hinzufügen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Default Content&#039;&#039;&#039;: Der Exporter zieht referenzierte Entitäten (also auch den Autor) standardmäßig mit.&lt;br /&gt;
* Vor dem Export den Node-Autor auf einen neutralen, auf beiden Sites vorhandenen Account setzen (z. B. &amp;lt;code&amp;gt;uid: 1&amp;lt;/code&amp;gt;), oder&lt;br /&gt;
* Nach dem Export das &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;-Feld in der generierten YAML-Datei manuell entfernen/überschreiben, oder&lt;br /&gt;
* Per &amp;lt;code&amp;gt;hook_default_content_export_alter()&amp;lt;/code&amp;gt; das &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;-Feld aus dem zu exportierenden Entity-Array streichen, bevor die YAML geschrieben wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Content Sync&#039;&#039;&#039;: Im Konfigurationsformular wählst du gezielt aus, welche Entity-Types synchronisiert werden. Lässt du „User“ dort weg, werden keine Benutzer-Entitäten exportiert/importiert – das &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;-Feld am Node bleibt dann nur eine ID-Referenz, die auf der Zielsite auf einen dort bereits existierenden User zeigen muss (sonst leer/ungültig).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Migrate API&#039;&#039;&#039;: am saubersten steuerbar – im &amp;lt;code&amp;gt;process&amp;lt;/code&amp;gt;-Mapping das Quellfeld &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt; einfach nicht mappen oder fix auf einen Default-Wert setzen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
process:&lt;br /&gt;
  uid:&lt;br /&gt;
    plugin: default_value&lt;br /&gt;
    default_value: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Damit wird die User-Quelle für diese Migration gar nicht erst abgefragt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;JSON:API&#039;&#039;&#039;:&lt;br /&gt;
* Beim Abruf per Sparse Fieldset das &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;-Feld weglassen und nicht in &amp;lt;code&amp;gt;include&amp;lt;/code&amp;gt; aufführen: &amp;lt;pre&amp;gt;GET /jsonapi/node/article?fields[node--article]=title,body,field_tags&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Der anonymen/API-Rolle nicht die Berechtigung „View user information“ geben – dann liefert &amp;lt;code&amp;gt;/jsonapi/user/user&amp;lt;/code&amp;gt; ohnehin nichts.&lt;br /&gt;
* Beim Anlegen (&amp;lt;code&amp;gt;POST /jsonapi/node/article&amp;lt;/code&amp;gt;) die &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;-Relationship einfach weglassen – Drupal setzt automatisch den authentifizierten API-User als Autor.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Empfehlung&#039;&#039;&#039;: Statt echte Benutzerkonten zu übertragen, auf beiden Sites einen festen technischen Autor anlegen (z. B. „content-import“, gleiche &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;/Name) und alle migrierten Inhalte auf diesen Account mappen. Das vermeidet auch DSGVO-Probleme, da Passwort-Hashes/E-Mails nie den Server verlassen.&lt;br /&gt;
==Hinweis==&lt;br /&gt;
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Drupal&amp;diff=611</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Drupal&amp;diff=611"/>
		<updated>2026-08-18T15:35:00Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: /* Entscheidungshilfe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Konfiguration exportieren (YAML)==&lt;br /&gt;
Die gesamte Website-Struktur (Content-Typen, Felder, Views, Taxonomie-Vokabulare, Rollen-Berechtigungen) wird als standardisierte YAML-Dateien exportiert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush config:export --destination=/pfad/zum/backup/config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Inhalts Backup==&lt;br /&gt;
===Inhalte als CSV/XLSX===&lt;br /&gt;
Modul Views Data Export (drush en views_data_export). Du legst eine View auf Inhalte an, fügst eine Anzeige „Data Export&amp;quot; hinzu, wählst CSV/JSON/XML und die gewünschten Felder. Ergebnis ist ein Download-Pfad, den du auch per Cron automatisiert schreiben lassen kannst.&lt;br /&gt;
===Inhalte auf eine andere Drupal-Site übertragen===&lt;br /&gt;
====Default Content====&lt;br /&gt;
Modul: &amp;lt;pre&amp;gt;drush en default_content&amp;lt;/pre&amp;gt;&lt;br /&gt;
Exportiert Nodes samt referenzierter Entitäten (Taxonomiebegriffe, Medien, …) als YAML/JSON-API-Dateien, ideal um Inhalte mit einem Modul/Install-Profil auszuliefern.&lt;br /&gt;
* Export: &amp;lt;pre&amp;gt;drush default-content-export node &amp;lt;nid&amp;gt;&amp;lt;/pre&amp;gt; bzw. &amp;lt;pre&amp;gt;drush default-content-export-module &amp;lt;modulname&amp;gt;&amp;lt;/pre&amp;gt; schreibt die Dateien nach &amp;lt;code&amp;gt;MODULENAME/content/node/&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Import: Modul auf der Zielsite aktivieren – die Inhalte werden bei der Installation automatisch importiert (Hook &amp;lt;code&amp;gt;hook_install&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;default_content_deploy&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Einsatzzweck: Demo-Inhalte, die zusammen mit einem Feature/Modul ausgeliefert werden sollen.&lt;br /&gt;
&lt;br /&gt;
====Content Sync====&lt;br /&gt;
Modul: &amp;lt;code&amp;gt;content_sync&amp;lt;/code&amp;gt;. Funktioniert wie &amp;lt;code&amp;gt;drush config:export/import&amp;lt;/code&amp;gt;, aber für Content-Entitäten.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush content-sync:export&lt;br /&gt;
drush content-sync:import&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Export schreibt Inhalte als YAML in einen Content-Sync-Ordner, Import liest sie auf der Zielsite wieder ein. Eignet sich für Staging→Live-Workflows mit identischer Site-Struktur, bei denen Content wie Konfiguration versioniert/deployed werden soll.&lt;br /&gt;
&lt;br /&gt;
====Migrate API====&lt;br /&gt;
Module: &amp;lt;code&amp;gt;migrate_plus&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;migrate_tools&amp;lt;/code&amp;gt;. Der robusteste, aber aufwändigste Weg – funktioniert auch bei unterschiedlichen Strukturen/Content-Types zwischen Quelle und Ziel.&lt;br /&gt;
* Migration-Definition als YAML (&amp;lt;code&amp;gt;migrate_plus.migration.*.yml&amp;lt;/code&amp;gt;) mit drei Teilen:&lt;br /&gt;
** &#039;&#039;&#039;source&#039;&#039;&#039; – z. B. &amp;lt;code&amp;gt;url&amp;lt;/code&amp;gt; (JSON:API der Quellsite), &amp;lt;code&amp;gt;csv&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sql&amp;lt;/code&amp;gt; (direkter DB-Zugriff)&lt;br /&gt;
** &#039;&#039;&#039;process&#039;&#039;&#039; – Feld-Mapping/Transformation (Quellfeld → Zielfeld, inkl. Transformationen wie Datumsformate)&lt;br /&gt;
** &#039;&#039;&#039;destination&#039;&#039;&#039; – z. B. &amp;lt;code&amp;gt;entity:node&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ausführen: &amp;lt;pre&amp;gt;&lt;br /&gt;
drush migrate:import migration_id&lt;br /&gt;
drush migrate:status&lt;br /&gt;
drush migrate:rollback migration_id&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vorteil: wiederholbar und idempotent, daher gut geeignet für große oder strukturell abweichende Sites.&lt;br /&gt;
&lt;br /&gt;
====Core JSON:API====&lt;br /&gt;
Kein Zusatzmodul nötig, nur Core-Modul &amp;lt;code&amp;gt;jsonapi&amp;lt;/code&amp;gt; aktivieren.&lt;br /&gt;
* Alle Artikel: &amp;lt;pre&amp;gt;GET /jsonapi/node/article&amp;lt;/pre&amp;gt; (Pagination über &amp;lt;code&amp;gt;page[offset]&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;page[limit]&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Einzelner Node: &amp;lt;pre&amp;gt;GET /jsonapi/node/article/{uuid}&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Referenzen mitladen: &amp;lt;pre&amp;gt;GET /jsonapi/node/article?include=field_tags,uid&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Anlegen auf Zielsite: &amp;lt;pre&amp;gt;POST /jsonapi/node/article&amp;lt;/pre&amp;gt; mit Bearer-Token oder Basic-Auth-Berechtigung.&lt;br /&gt;
* Eignet sich als Quelle für eine Migration (siehe Migrate API, &amp;lt;code&amp;gt;source: plugin: url&amp;lt;/code&amp;gt;) oder für eigene Skripte, die Daten abholen und auf der Zielsite wieder anlegen.&lt;br /&gt;
&lt;br /&gt;
====Entscheidungshilfe====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Methode !! Für !! Aufwand&lt;br /&gt;
|-&lt;br /&gt;
| [[Default Content]] || Demo-Inhalte mit Modul ausliefern || gering&lt;br /&gt;
|-&lt;br /&gt;
| Content Sync || Staging→Live, identische Site-Struktur || gering–mittel&lt;br /&gt;
|-&lt;br /&gt;
| Migrate API || große/strukturell abweichende Sites, wiederholbare Importe || hoch&lt;br /&gt;
|-&lt;br /&gt;
| JSON:API || Ad-hoc-Abfragen, eigene Skripte, Migrate-Quelle || gering (aber manuell)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Benutzerdaten ausschließen====&lt;br /&gt;
Bei allen vier Wegen hängt am Node standardmäßig ein Autor-Feld (&amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;), das sonst die komplette User-Entität (Name, E-Mail, Passwort-Hash, Rollen) mit hochziehen kann.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Views Data Export&#039;&#039;&#039;: unkritisch – nur Felder, die explizit zur View hinzugefügt werden, landen im Export. Das Feld „Authored by“/„uid“ einfach nicht hinzufügen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Default Content&#039;&#039;&#039;: Der Exporter zieht referenzierte Entitäten (also auch den Autor) standardmäßig mit.&lt;br /&gt;
* Vor dem Export den Node-Autor auf einen neutralen, auf beiden Sites vorhandenen Account setzen (z. B. &amp;lt;code&amp;gt;uid: 1&amp;lt;/code&amp;gt;), oder&lt;br /&gt;
* Nach dem Export das &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;-Feld in der generierten YAML-Datei manuell entfernen/überschreiben, oder&lt;br /&gt;
* Per &amp;lt;code&amp;gt;hook_default_content_export_alter()&amp;lt;/code&amp;gt; das &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;-Feld aus dem zu exportierenden Entity-Array streichen, bevor die YAML geschrieben wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Content Sync&#039;&#039;&#039;: Im Konfigurationsformular wählst du gezielt aus, welche Entity-Types synchronisiert werden. Lässt du „User“ dort weg, werden keine Benutzer-Entitäten exportiert/importiert – das &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;-Feld am Node bleibt dann nur eine ID-Referenz, die auf der Zielsite auf einen dort bereits existierenden User zeigen muss (sonst leer/ungültig).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Migrate API&#039;&#039;&#039;: am saubersten steuerbar – im &amp;lt;code&amp;gt;process&amp;lt;/code&amp;gt;-Mapping das Quellfeld &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt; einfach nicht mappen oder fix auf einen Default-Wert setzen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
process:&lt;br /&gt;
  uid:&lt;br /&gt;
    plugin: default_value&lt;br /&gt;
    default_value: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Damit wird die User-Quelle für diese Migration gar nicht erst abgefragt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;JSON:API&#039;&#039;&#039;:&lt;br /&gt;
* Beim Abruf per Sparse Fieldset das &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;-Feld weglassen und nicht in &amp;lt;code&amp;gt;include&amp;lt;/code&amp;gt; aufführen: &amp;lt;pre&amp;gt;GET /jsonapi/node/article?fields[node--article]=title,body,field_tags&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Der anonymen/API-Rolle nicht die Berechtigung „View user information“ geben – dann liefert &amp;lt;code&amp;gt;/jsonapi/user/user&amp;lt;/code&amp;gt; ohnehin nichts.&lt;br /&gt;
* Beim Anlegen (&amp;lt;code&amp;gt;POST /jsonapi/node/article&amp;lt;/code&amp;gt;) die &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;-Relationship einfach weglassen – Drupal setzt automatisch den authentifizierten API-User als Autor.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Empfehlung&#039;&#039;&#039;: Statt echte Benutzerkonten zu übertragen, auf beiden Sites einen festen technischen Autor anlegen (z. B. „content-import“, gleiche &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;/Name) und alle migrierten Inhalte auf diesen Account mappen. Das vermeidet auch DSGVO-Probleme, da Passwort-Hashes/E-Mails nie den Server verlassen.&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Drupal&amp;diff=610</id>
		<title>Drupal</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Drupal&amp;diff=610"/>
		<updated>2026-08-18T14:58:34Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: Die Seite wurde neu angelegt: „==Konfiguration exportieren (YAML)== Die gesamte Website-Struktur (Content-Typen, Felder, Views, Taxonomie-Vokabulare, Rollen-Berechtigungen) wird als standardisierte YAML-Dateien exportiert: &amp;lt;pre&amp;gt; drush config:export --destination=/pfad/zum/backup/config &amp;lt;/pre&amp;gt;  ==Inhalts Backup== ===Inhalte als CSV/XLSX=== Modul Views Data Export (drush en views_data_export). Du legst eine View auf Inhalte an, fügst eine Anzeige „Data Export&amp;quot; hinzu, wählst CSV/JSON/…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Konfiguration exportieren (YAML)==&lt;br /&gt;
Die gesamte Website-Struktur (Content-Typen, Felder, Views, Taxonomie-Vokabulare, Rollen-Berechtigungen) wird als standardisierte YAML-Dateien exportiert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush config:export --destination=/pfad/zum/backup/config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Inhalts Backup==&lt;br /&gt;
===Inhalte als CSV/XLSX===&lt;br /&gt;
Modul Views Data Export (drush en views_data_export). Du legst eine View auf Inhalte an, fügst eine Anzeige „Data Export&amp;quot; hinzu, wählst CSV/JSON/XML und die gewünschten Felder. Ergebnis ist ein Download-Pfad, den du auch per Cron automatisiert schreiben lassen kannst.&lt;br /&gt;
===Inhalte auf eine andere Drupal-Site übertragen===&lt;br /&gt;
====Default Content====&lt;br /&gt;
Modul: &amp;lt;pre&amp;gt;drush en default_content&amp;lt;/pre&amp;gt;&lt;br /&gt;
Exportiert Nodes samt referenzierter Entitäten (Taxonomiebegriffe, Medien, …) als YAML/JSON-API-Dateien, ideal um Inhalte mit einem Modul/Install-Profil auszuliefern.&lt;br /&gt;
* Export: &amp;lt;pre&amp;gt;drush default-content-export node &amp;lt;nid&amp;gt;&amp;lt;/pre&amp;gt; bzw. &amp;lt;pre&amp;gt;drush default-content-export-module &amp;lt;modulname&amp;gt;&amp;lt;/pre&amp;gt; schreibt die Dateien nach &amp;lt;code&amp;gt;MODULENAME/content/node/&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Import: Modul auf der Zielsite aktivieren – die Inhalte werden bei der Installation automatisch importiert (Hook &amp;lt;code&amp;gt;hook_install&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;default_content_deploy&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Einsatzzweck: Demo-Inhalte, die zusammen mit einem Feature/Modul ausgeliefert werden sollen.&lt;br /&gt;
&lt;br /&gt;
====Content Sync====&lt;br /&gt;
Modul: &amp;lt;code&amp;gt;content_sync&amp;lt;/code&amp;gt;. Funktioniert wie &amp;lt;code&amp;gt;drush config:export/import&amp;lt;/code&amp;gt;, aber für Content-Entitäten.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drush content-sync:export&lt;br /&gt;
drush content-sync:import&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Export schreibt Inhalte als YAML in einen Content-Sync-Ordner, Import liest sie auf der Zielsite wieder ein. Eignet sich für Staging→Live-Workflows mit identischer Site-Struktur, bei denen Content wie Konfiguration versioniert/deployed werden soll.&lt;br /&gt;
&lt;br /&gt;
====Migrate API====&lt;br /&gt;
Module: &amp;lt;code&amp;gt;migrate_plus&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;migrate_tools&amp;lt;/code&amp;gt;. Der robusteste, aber aufwändigste Weg – funktioniert auch bei unterschiedlichen Strukturen/Content-Types zwischen Quelle und Ziel.&lt;br /&gt;
* Migration-Definition als YAML (&amp;lt;code&amp;gt;migrate_plus.migration.*.yml&amp;lt;/code&amp;gt;) mit drei Teilen:&lt;br /&gt;
** &#039;&#039;&#039;source&#039;&#039;&#039; – z. B. &amp;lt;code&amp;gt;url&amp;lt;/code&amp;gt; (JSON:API der Quellsite), &amp;lt;code&amp;gt;csv&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sql&amp;lt;/code&amp;gt; (direkter DB-Zugriff)&lt;br /&gt;
** &#039;&#039;&#039;process&#039;&#039;&#039; – Feld-Mapping/Transformation (Quellfeld → Zielfeld, inkl. Transformationen wie Datumsformate)&lt;br /&gt;
** &#039;&#039;&#039;destination&#039;&#039;&#039; – z. B. &amp;lt;code&amp;gt;entity:node&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ausführen: &amp;lt;pre&amp;gt;&lt;br /&gt;
drush migrate:import migration_id&lt;br /&gt;
drush migrate:status&lt;br /&gt;
drush migrate:rollback migration_id&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vorteil: wiederholbar und idempotent, daher gut geeignet für große oder strukturell abweichende Sites.&lt;br /&gt;
&lt;br /&gt;
====Core JSON:API====&lt;br /&gt;
Kein Zusatzmodul nötig, nur Core-Modul &amp;lt;code&amp;gt;jsonapi&amp;lt;/code&amp;gt; aktivieren.&lt;br /&gt;
* Alle Artikel: &amp;lt;pre&amp;gt;GET /jsonapi/node/article&amp;lt;/pre&amp;gt; (Pagination über &amp;lt;code&amp;gt;page[offset]&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;page[limit]&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Einzelner Node: &amp;lt;pre&amp;gt;GET /jsonapi/node/article/{uuid}&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Referenzen mitladen: &amp;lt;pre&amp;gt;GET /jsonapi/node/article?include=field_tags,uid&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Anlegen auf Zielsite: &amp;lt;pre&amp;gt;POST /jsonapi/node/article&amp;lt;/pre&amp;gt; mit Bearer-Token oder Basic-Auth-Berechtigung.&lt;br /&gt;
* Eignet sich als Quelle für eine Migration (siehe Migrate API, &amp;lt;code&amp;gt;source: plugin: url&amp;lt;/code&amp;gt;) oder für eigene Skripte, die Daten abholen und auf der Zielsite wieder anlegen.&lt;br /&gt;
&lt;br /&gt;
====Entscheidungshilfe====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Methode !! Für !! Aufwand&lt;br /&gt;
|-&lt;br /&gt;
| Default Content || Demo-Inhalte mit Modul ausliefern || gering&lt;br /&gt;
|-&lt;br /&gt;
| Content Sync || Staging→Live, identische Site-Struktur || gering–mittel&lt;br /&gt;
|-&lt;br /&gt;
| Migrate API || große/strukturell abweichende Sites, wiederholbare Importe || hoch&lt;br /&gt;
|-&lt;br /&gt;
| JSON:API || Ad-hoc-Abfragen, eigene Skripte, Migrate-Quelle || gering (aber manuell)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Benutzerdaten ausschließen====&lt;br /&gt;
Bei allen vier Wegen hängt am Node standardmäßig ein Autor-Feld (&amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;), das sonst die komplette User-Entität (Name, E-Mail, Passwort-Hash, Rollen) mit hochziehen kann.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Views Data Export&#039;&#039;&#039;: unkritisch – nur Felder, die explizit zur View hinzugefügt werden, landen im Export. Das Feld „Authored by“/„uid“ einfach nicht hinzufügen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Default Content&#039;&#039;&#039;: Der Exporter zieht referenzierte Entitäten (also auch den Autor) standardmäßig mit.&lt;br /&gt;
* Vor dem Export den Node-Autor auf einen neutralen, auf beiden Sites vorhandenen Account setzen (z. B. &amp;lt;code&amp;gt;uid: 1&amp;lt;/code&amp;gt;), oder&lt;br /&gt;
* Nach dem Export das &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;-Feld in der generierten YAML-Datei manuell entfernen/überschreiben, oder&lt;br /&gt;
* Per &amp;lt;code&amp;gt;hook_default_content_export_alter()&amp;lt;/code&amp;gt; das &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;-Feld aus dem zu exportierenden Entity-Array streichen, bevor die YAML geschrieben wird.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Content Sync&#039;&#039;&#039;: Im Konfigurationsformular wählst du gezielt aus, welche Entity-Types synchronisiert werden. Lässt du „User“ dort weg, werden keine Benutzer-Entitäten exportiert/importiert – das &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;-Feld am Node bleibt dann nur eine ID-Referenz, die auf der Zielsite auf einen dort bereits existierenden User zeigen muss (sonst leer/ungültig).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Migrate API&#039;&#039;&#039;: am saubersten steuerbar – im &amp;lt;code&amp;gt;process&amp;lt;/code&amp;gt;-Mapping das Quellfeld &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt; einfach nicht mappen oder fix auf einen Default-Wert setzen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
process:&lt;br /&gt;
  uid:&lt;br /&gt;
    plugin: default_value&lt;br /&gt;
    default_value: 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Damit wird die User-Quelle für diese Migration gar nicht erst abgefragt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;JSON:API&#039;&#039;&#039;:&lt;br /&gt;
* Beim Abruf per Sparse Fieldset das &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;-Feld weglassen und nicht in &amp;lt;code&amp;gt;include&amp;lt;/code&amp;gt; aufführen: &amp;lt;pre&amp;gt;GET /jsonapi/node/article?fields[node--article]=title,body,field_tags&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Der anonymen/API-Rolle nicht die Berechtigung „View user information“ geben – dann liefert &amp;lt;code&amp;gt;/jsonapi/user/user&amp;lt;/code&amp;gt; ohnehin nichts.&lt;br /&gt;
* Beim Anlegen (&amp;lt;code&amp;gt;POST /jsonapi/node/article&amp;lt;/code&amp;gt;) die &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;-Relationship einfach weglassen – Drupal setzt automatisch den authentifizierten API-User als Autor.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Empfehlung&#039;&#039;&#039;: Statt echte Benutzerkonten zu übertragen, auf beiden Sites einen festen technischen Autor anlegen (z. B. „content-import“, gleiche &amp;lt;code&amp;gt;uid&amp;lt;/code&amp;gt;/Name) und alle migrierten Inhalte auf diesen Account mappen. Das vermeidet auch DSGVO-Probleme, da Passwort-Hashes/E-Mails nie den Server verlassen.&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Hauptseite&amp;diff=609</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Hauptseite&amp;diff=609"/>
		<updated>2026-08-18T14:57:44Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;br /&gt;
== Grundaufbau eines Wissensmanagement-Systems ==&lt;br /&gt;
Die folgenden Bausteine beschreiben kein klassisches CMS für Blog-Artikel, sondern ein &#039;&#039;&#039;Wissensmanagement-System (Wiki-artig)&#039;&#039;&#039;: Im Mittelpunkt steht nicht die einzelne Seite, sondern das Netz aus Wissensartikeln, ihren Verknüpfungen und ihrer Auffindbarkeit. Entsprechend rücken Taxonomie, Verlinkung und Suche stärker in den Vordergrund als bei einem reinen Content-Ausgabe-System.&lt;br /&gt;
&lt;br /&gt;
== Hauptbausteine im Detail ==&lt;br /&gt;
&lt;br /&gt;
=== [[Data Engine]] ([[Wissensmodell]] &amp;amp;  [[Speicherung]]) ===&lt;br /&gt;
Das Herzstück des Systems. Es definiert, wie Wissensartikel und ihre Beziehungen abgelegt werden:&lt;br /&gt;
* Entwickler-Entscheidung: Monolithisches Datenmodell (feste Tabellen für articles, categories, tags) oder flexibles Schema (JSONB / EAV-Muster für benutzerdefinierte Wissens-Typen wie Glossareinträge, How-Tos, FAQs).&lt;br /&gt;
* Taxonomie als Kernbestandteil: Eigene Tabellen für Kategorien, Tags und Artikel-Artikel-Relationen (Verlinkungen), nicht nur für den Inhalt selbst.&lt;br /&gt;
* Mandantenfähigkeit / Multi-Tenancy (optional): Trennung von Daten per tenant_id-Spalte oder separaten Datenbankschemas.&lt;br /&gt;
* Datenbank: Relationale Datenbanken wie PostgreSQL bieten mit JSON-Unterstützung volle Flexibilität bei hoher Integrität – wichtig, da Wissensartikel oft variable Zusatzfelder benötigen.&lt;br /&gt;
&lt;br /&gt;
=== Content &amp;amp; Routing Layer (Wissensartikel-Verwaltung &amp;amp; URLs) ===&lt;br /&gt;
Verantwortlich für das Laden und Rendern von Wissensartikeln für Nutzer:&lt;br /&gt;
* Slug-Mapping: Zuordnung von lesbaren Pfaden (/wiki/rust-cms-guide) zu Datenbank-Einträgen.&lt;br /&gt;
* Status &amp;amp; Versionierung: Artikel besitzen Zustände (draft, published, archived) sowie eine Revisions-Historie – bei einem Wissenssystem meist zentraler als bei einem Blog, da Artikel fortlaufend gepflegt statt einmalig veröffentlicht werden.&lt;br /&gt;
* Rendering:&lt;br /&gt;
** Server-Side Rendering (SSR): HTML wird direkt über eine Template-Engine (z. B. Askama, Tera) gerendert.&lt;br /&gt;
** Headless (API): Ausgabe von JSON für entkoppelte Frontends.&lt;br /&gt;
&lt;br /&gt;
=== Wissensverknüpfung &amp;amp; Taxonomie (Knowledge Graph) ===&lt;br /&gt;
Das eigentliche Unterscheidungsmerkmal eines Wissenssystems gegenüber einem reinen CMS – Wissen entsteht durch Verknüpfung, nicht nur durch einzelne Artikel:&lt;br /&gt;
* Wiki-Links &amp;amp; Backlinks: Erkennung von Verweisen zwischen Artikeln (z. B. &amp;lt;nowiki&amp;gt;[[Artikelname]]&amp;lt;/nowiki&amp;gt;-Syntax) sowie automatische Rückverfolgung, welche Artikel auf einen bestimmten Artikel verlinken.&lt;br /&gt;
* Kategorien &amp;amp; Tags: Hierarchische und flache Klassifizierung von Wissensartikeln zur Navigation und Filterung.&lt;br /&gt;
* Verwandte Artikel: Automatische oder manuelle Vorschläge thematisch ähnlicher Artikel (z. B. über gemeinsame Tags oder Verlinkungsdichte).&lt;br /&gt;
* Glossar &amp;amp; Begriffsdefinitionen: Zentrale Verwaltung wiederkehrender Fachbegriffe, die aus Artikeltexten heraus verlinkt werden können.&lt;br /&gt;
&lt;br /&gt;
=== Authentication &amp;amp; Authorization (Sicherheit) ===&lt;br /&gt;
Trennt den öffentlichen Bereich vom Verwaltungsbereich:&lt;br /&gt;
* Authentifizierung: Identitätsprüfung von Benutzern (z. B. Session-Cookies oder JWT-Tokens).&lt;br /&gt;
* Rechteverwaltung (RBAC): Rollenbasierte Zugriffskontrolle (z. B. Admin, Editor, Author), um festzulegen, wer welche Endpunkte oder Inhalte bearbeiten darf.&lt;br /&gt;
&lt;br /&gt;
=== Media Manager (Dateiverwaltung) ===&lt;br /&gt;
Verwaltet Bilder, PDFs und sonstige Uploads:&lt;br /&gt;
* Upload-Pipeline: Empfang von Dateien, Prüfung von MIME-Types und Dateigrößen.&lt;br /&gt;
* Verarbeitung: Automatische Skalierung oder Konvertierung von Bildern (z. B. Erzeugung von WebP-Thumbnails).&lt;br /&gt;
* Storage: Speicherung auf dem lokalen Dateisystem oder in einem Object-Storage (S3/MinIO).&lt;br /&gt;
&lt;br /&gt;
=== Admin Backend (Verwaltungsoberfläche) ===&lt;br /&gt;
Die Benutzeroberfläche für Redakteure:&lt;br /&gt;
* Rich-Text / Markdown Editor: Eingabeoberfläche für Inhalte.&lt;br /&gt;
* REST / gRPC / GraphQL API: Kommuniziert mit dem Backend, um Inhalte, Einstellungen, Benutzer und Medien zu verwalten.&lt;br /&gt;
&lt;br /&gt;
=== Caching &amp;amp; Performance Layer ===&lt;br /&gt;
Verhindert unnötige Datenbankabfragen bei hoher Last:&lt;br /&gt;
* HTTP-Caching: Passende Header (Cache-Control, ETag) für Nginx oder CDNs.&lt;br /&gt;
* In-Memory Caching: Zwischenspeichern von zusammengestellten Seiten oder Datenbank-Ergebnissen (z. B. über In-Memory-Stores oder Redis).&lt;br /&gt;
&lt;br /&gt;
=== Search &amp;amp; Discovery (Suche) ===&lt;br /&gt;
In einem Wissenssystem oft der wichtigste Einstiegspunkt überhaupt – Nutzer suchen gezielt nach Antworten statt zu stöbern:&lt;br /&gt;
* DB-native Suche: Volltextsuche über PostgreSQL tsvector/tsquery, ausreichend für kleinere bis mittlere Datenmengen.&lt;br /&gt;
* Externer Suchindex: Bei höheren Anforderungen an Relevanz und Performance Anbindung an Meilisearch, Typesense oder Elasticsearch.&lt;br /&gt;
* Facettierung &amp;amp; Filter: Eingrenzung nach Kategorie, Tag, Datum oder Autor.&lt;br /&gt;
&lt;br /&gt;
=== SEO &amp;amp; Metadata ===&lt;br /&gt;
Sorgt dafür, dass Inhalte von Suchmaschinen korrekt erfasst werden:&lt;br /&gt;
* Meta-Tags &amp;amp; Open Graph: Pro Inhalt konfigurierbare Title-, Description- und Social-Preview-Daten.&lt;br /&gt;
* Sitemap &amp;amp; Robots: Automatisch generierte sitemap.xml und robots.txt.&lt;br /&gt;
* Kanonische URLs &amp;amp; Redirects: Vermeidung von Duplicate Content, Verwaltung von 301-Weiterleitungen bei Slug-Änderungen.&lt;br /&gt;
&lt;br /&gt;
=== Plugin- &amp;amp; Extension-System ===&lt;br /&gt;
Erlaubt es, Funktionalität ohne Eingriff in den Core zu erweitern:&lt;br /&gt;
* Hooks &amp;amp; Events: Definierte Erweiterungspunkte (z. B. before_publish, after_upload), an denen Plugins andocken können.&lt;br /&gt;
* Middleware-Ketten: Zusätzliche Verarbeitungsschritte in Request/Response-Pipeline einschiebbar.&lt;br /&gt;
&lt;br /&gt;
=== Background Jobs / Task Queue ===&lt;br /&gt;
Verlagert zeitintensive Arbeiten aus dem Request-Zyklus:&lt;br /&gt;
* Queue-Anbindung: Asynchrone Verarbeitung über Redis-basierte Queues oder tokio-Task-Runner.&lt;br /&gt;
* Typische Jobs: Bildkonvertierung, E-Mail-Versand, Sitemap-Neubau, Webhook-Zustellung.&lt;br /&gt;
* Retry &amp;amp; Fehlerbehandlung: Wiederholungslogik und Dead-Letter-Handling bei fehlgeschlagenen Jobs.&lt;br /&gt;
&lt;br /&gt;
=== Internationalisierung (i18n / l10n) ===&lt;br /&gt;
Unterstützt mehrsprachige Inhalte und Oberflächen:&lt;br /&gt;
* Mehrsprachige Inhalte: Übersetzungsstatus pro Sprache und Content-Objekt.&lt;br /&gt;
* Locale-Routing: Sprachspezifische Pfade (/de/…, /en/…) oder Subdomains.&lt;br /&gt;
* UI-Übersetzung: Lokalisierte Texte im Admin Backend.&lt;br /&gt;
&lt;br /&gt;
=== Notifications &amp;amp; E-Mail ===&lt;br /&gt;
Kommuniziert Systemereignisse an Nutzer und Redakteure:&lt;br /&gt;
* Transaktionale Mails: Passwort-Reset, Einladungen, Kommentar-Benachrichtigungen.&lt;br /&gt;
* Workflow-Benachrichtigungen: Hinweise bei Freigabe-Anfragen oder Statuswechseln von Inhalten.&lt;br /&gt;
&lt;br /&gt;
=== Audit-Log &amp;amp; Monitoring ===&lt;br /&gt;
Schafft Nachvollziehbarkeit und Betriebssicherheit:&lt;br /&gt;
* Audit-Log: Protokollierung, wer wann welche Änderung vorgenommen hat (Compliance, Nachvollziehbarkeit).&lt;br /&gt;
* Monitoring &amp;amp; Tracing: Metriken, Logs und Fehlerreporting für den laufenden Betrieb (z. B. über OpenTelemetry).&lt;br /&gt;
&lt;br /&gt;
=== Konfigurationsmanagement ===&lt;br /&gt;
Zentrale Steuerung systemweiter Einstellungen:&lt;br /&gt;
* Site-Settings: Globale Konfiguration wie Seitenname, Standardsprache, Zeitzone.&lt;br /&gt;
* Feature-Flags: Kontrolliertes Ein-/Ausschalten einzelner Funktionen ohne Redeploy.&lt;br /&gt;
&lt;br /&gt;
=== Deployment &amp;amp; Infrastructure ===&lt;br /&gt;
Betrifft Betrieb und Wartbarkeit des Systems:&lt;br /&gt;
* Migrations-Tooling: Versionierte Datenbank-Migrationen (z. B. via sqlx oder refinery).&lt;br /&gt;
* CI/CD: Automatisierte Tests und Deployments.&lt;br /&gt;
* Backup-Strategie: Regelmäßige Sicherung von Datenbank und Medien-Storage.&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Grundbegriffe Informatik]]&lt;br /&gt;
* [[Weiter]]&lt;br /&gt;
* [[Wissenssysteme &amp;amp; Tools im Überblick]]&lt;br /&gt;
* [[Drupal]]&lt;br /&gt;
&lt;br /&gt;
==Hinweis==&lt;br /&gt;
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Hauptseite&amp;diff=608</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Hauptseite&amp;diff=608"/>
		<updated>2026-08-18T10:59:38Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;br /&gt;
== Grundaufbau eines Wissensmanagement-Systems ==&lt;br /&gt;
Die folgenden Bausteine beschreiben kein klassisches CMS für Blog-Artikel, sondern ein &#039;&#039;&#039;Wissensmanagement-System (Wiki-artig)&#039;&#039;&#039;: Im Mittelpunkt steht nicht die einzelne Seite, sondern das Netz aus Wissensartikeln, ihren Verknüpfungen und ihrer Auffindbarkeit. Entsprechend rücken Taxonomie, Verlinkung und Suche stärker in den Vordergrund als bei einem reinen Content-Ausgabe-System.&lt;br /&gt;
&lt;br /&gt;
== Hauptbausteine im Detail ==&lt;br /&gt;
&lt;br /&gt;
=== [[Data Engine]] ([[Wissensmodell]] &amp;amp;  [[Speicherung]]) ===&lt;br /&gt;
Das Herzstück des Systems. Es definiert, wie Wissensartikel und ihre Beziehungen abgelegt werden:&lt;br /&gt;
* Entwickler-Entscheidung: Monolithisches Datenmodell (feste Tabellen für articles, categories, tags) oder flexibles Schema (JSONB / EAV-Muster für benutzerdefinierte Wissens-Typen wie Glossareinträge, How-Tos, FAQs).&lt;br /&gt;
* Taxonomie als Kernbestandteil: Eigene Tabellen für Kategorien, Tags und Artikel-Artikel-Relationen (Verlinkungen), nicht nur für den Inhalt selbst.&lt;br /&gt;
* Mandantenfähigkeit / Multi-Tenancy (optional): Trennung von Daten per tenant_id-Spalte oder separaten Datenbankschemas.&lt;br /&gt;
* Datenbank: Relationale Datenbanken wie PostgreSQL bieten mit JSON-Unterstützung volle Flexibilität bei hoher Integrität – wichtig, da Wissensartikel oft variable Zusatzfelder benötigen.&lt;br /&gt;
&lt;br /&gt;
=== Content &amp;amp; Routing Layer (Wissensartikel-Verwaltung &amp;amp; URLs) ===&lt;br /&gt;
Verantwortlich für das Laden und Rendern von Wissensartikeln für Nutzer:&lt;br /&gt;
* Slug-Mapping: Zuordnung von lesbaren Pfaden (/wiki/rust-cms-guide) zu Datenbank-Einträgen.&lt;br /&gt;
* Status &amp;amp; Versionierung: Artikel besitzen Zustände (draft, published, archived) sowie eine Revisions-Historie – bei einem Wissenssystem meist zentraler als bei einem Blog, da Artikel fortlaufend gepflegt statt einmalig veröffentlicht werden.&lt;br /&gt;
* Rendering:&lt;br /&gt;
** Server-Side Rendering (SSR): HTML wird direkt über eine Template-Engine (z. B. Askama, Tera) gerendert.&lt;br /&gt;
** Headless (API): Ausgabe von JSON für entkoppelte Frontends.&lt;br /&gt;
&lt;br /&gt;
=== Wissensverknüpfung &amp;amp; Taxonomie (Knowledge Graph) ===&lt;br /&gt;
Das eigentliche Unterscheidungsmerkmal eines Wissenssystems gegenüber einem reinen CMS – Wissen entsteht durch Verknüpfung, nicht nur durch einzelne Artikel:&lt;br /&gt;
* Wiki-Links &amp;amp; Backlinks: Erkennung von Verweisen zwischen Artikeln (z. B. &amp;lt;nowiki&amp;gt;[[Artikelname]]&amp;lt;/nowiki&amp;gt;-Syntax) sowie automatische Rückverfolgung, welche Artikel auf einen bestimmten Artikel verlinken.&lt;br /&gt;
* Kategorien &amp;amp; Tags: Hierarchische und flache Klassifizierung von Wissensartikeln zur Navigation und Filterung.&lt;br /&gt;
* Verwandte Artikel: Automatische oder manuelle Vorschläge thematisch ähnlicher Artikel (z. B. über gemeinsame Tags oder Verlinkungsdichte).&lt;br /&gt;
* Glossar &amp;amp; Begriffsdefinitionen: Zentrale Verwaltung wiederkehrender Fachbegriffe, die aus Artikeltexten heraus verlinkt werden können.&lt;br /&gt;
&lt;br /&gt;
=== Authentication &amp;amp; Authorization (Sicherheit) ===&lt;br /&gt;
Trennt den öffentlichen Bereich vom Verwaltungsbereich:&lt;br /&gt;
* Authentifizierung: Identitätsprüfung von Benutzern (z. B. Session-Cookies oder JWT-Tokens).&lt;br /&gt;
* Rechteverwaltung (RBAC): Rollenbasierte Zugriffskontrolle (z. B. Admin, Editor, Author), um festzulegen, wer welche Endpunkte oder Inhalte bearbeiten darf.&lt;br /&gt;
&lt;br /&gt;
=== Media Manager (Dateiverwaltung) ===&lt;br /&gt;
Verwaltet Bilder, PDFs und sonstige Uploads:&lt;br /&gt;
* Upload-Pipeline: Empfang von Dateien, Prüfung von MIME-Types und Dateigrößen.&lt;br /&gt;
* Verarbeitung: Automatische Skalierung oder Konvertierung von Bildern (z. B. Erzeugung von WebP-Thumbnails).&lt;br /&gt;
* Storage: Speicherung auf dem lokalen Dateisystem oder in einem Object-Storage (S3/MinIO).&lt;br /&gt;
&lt;br /&gt;
=== Admin Backend (Verwaltungsoberfläche) ===&lt;br /&gt;
Die Benutzeroberfläche für Redakteure:&lt;br /&gt;
* Rich-Text / Markdown Editor: Eingabeoberfläche für Inhalte.&lt;br /&gt;
* REST / gRPC / GraphQL API: Kommuniziert mit dem Backend, um Inhalte, Einstellungen, Benutzer und Medien zu verwalten.&lt;br /&gt;
&lt;br /&gt;
=== Caching &amp;amp; Performance Layer ===&lt;br /&gt;
Verhindert unnötige Datenbankabfragen bei hoher Last:&lt;br /&gt;
* HTTP-Caching: Passende Header (Cache-Control, ETag) für Nginx oder CDNs.&lt;br /&gt;
* In-Memory Caching: Zwischenspeichern von zusammengestellten Seiten oder Datenbank-Ergebnissen (z. B. über In-Memory-Stores oder Redis).&lt;br /&gt;
&lt;br /&gt;
=== Search &amp;amp; Discovery (Suche) ===&lt;br /&gt;
In einem Wissenssystem oft der wichtigste Einstiegspunkt überhaupt – Nutzer suchen gezielt nach Antworten statt zu stöbern:&lt;br /&gt;
* DB-native Suche: Volltextsuche über PostgreSQL tsvector/tsquery, ausreichend für kleinere bis mittlere Datenmengen.&lt;br /&gt;
* Externer Suchindex: Bei höheren Anforderungen an Relevanz und Performance Anbindung an Meilisearch, Typesense oder Elasticsearch.&lt;br /&gt;
* Facettierung &amp;amp; Filter: Eingrenzung nach Kategorie, Tag, Datum oder Autor.&lt;br /&gt;
&lt;br /&gt;
=== SEO &amp;amp; Metadata ===&lt;br /&gt;
Sorgt dafür, dass Inhalte von Suchmaschinen korrekt erfasst werden:&lt;br /&gt;
* Meta-Tags &amp;amp; Open Graph: Pro Inhalt konfigurierbare Title-, Description- und Social-Preview-Daten.&lt;br /&gt;
* Sitemap &amp;amp; Robots: Automatisch generierte sitemap.xml und robots.txt.&lt;br /&gt;
* Kanonische URLs &amp;amp; Redirects: Vermeidung von Duplicate Content, Verwaltung von 301-Weiterleitungen bei Slug-Änderungen.&lt;br /&gt;
&lt;br /&gt;
=== Plugin- &amp;amp; Extension-System ===&lt;br /&gt;
Erlaubt es, Funktionalität ohne Eingriff in den Core zu erweitern:&lt;br /&gt;
* Hooks &amp;amp; Events: Definierte Erweiterungspunkte (z. B. before_publish, after_upload), an denen Plugins andocken können.&lt;br /&gt;
* Middleware-Ketten: Zusätzliche Verarbeitungsschritte in Request/Response-Pipeline einschiebbar.&lt;br /&gt;
&lt;br /&gt;
=== Background Jobs / Task Queue ===&lt;br /&gt;
Verlagert zeitintensive Arbeiten aus dem Request-Zyklus:&lt;br /&gt;
* Queue-Anbindung: Asynchrone Verarbeitung über Redis-basierte Queues oder tokio-Task-Runner.&lt;br /&gt;
* Typische Jobs: Bildkonvertierung, E-Mail-Versand, Sitemap-Neubau, Webhook-Zustellung.&lt;br /&gt;
* Retry &amp;amp; Fehlerbehandlung: Wiederholungslogik und Dead-Letter-Handling bei fehlgeschlagenen Jobs.&lt;br /&gt;
&lt;br /&gt;
=== Internationalisierung (i18n / l10n) ===&lt;br /&gt;
Unterstützt mehrsprachige Inhalte und Oberflächen:&lt;br /&gt;
* Mehrsprachige Inhalte: Übersetzungsstatus pro Sprache und Content-Objekt.&lt;br /&gt;
* Locale-Routing: Sprachspezifische Pfade (/de/…, /en/…) oder Subdomains.&lt;br /&gt;
* UI-Übersetzung: Lokalisierte Texte im Admin Backend.&lt;br /&gt;
&lt;br /&gt;
=== Notifications &amp;amp; E-Mail ===&lt;br /&gt;
Kommuniziert Systemereignisse an Nutzer und Redakteure:&lt;br /&gt;
* Transaktionale Mails: Passwort-Reset, Einladungen, Kommentar-Benachrichtigungen.&lt;br /&gt;
* Workflow-Benachrichtigungen: Hinweise bei Freigabe-Anfragen oder Statuswechseln von Inhalten.&lt;br /&gt;
&lt;br /&gt;
=== Audit-Log &amp;amp; Monitoring ===&lt;br /&gt;
Schafft Nachvollziehbarkeit und Betriebssicherheit:&lt;br /&gt;
* Audit-Log: Protokollierung, wer wann welche Änderung vorgenommen hat (Compliance, Nachvollziehbarkeit).&lt;br /&gt;
* Monitoring &amp;amp; Tracing: Metriken, Logs und Fehlerreporting für den laufenden Betrieb (z. B. über OpenTelemetry).&lt;br /&gt;
&lt;br /&gt;
=== Konfigurationsmanagement ===&lt;br /&gt;
Zentrale Steuerung systemweiter Einstellungen:&lt;br /&gt;
* Site-Settings: Globale Konfiguration wie Seitenname, Standardsprache, Zeitzone.&lt;br /&gt;
* Feature-Flags: Kontrolliertes Ein-/Ausschalten einzelner Funktionen ohne Redeploy.&lt;br /&gt;
&lt;br /&gt;
=== Deployment &amp;amp; Infrastructure ===&lt;br /&gt;
Betrifft Betrieb und Wartbarkeit des Systems:&lt;br /&gt;
* Migrations-Tooling: Versionierte Datenbank-Migrationen (z. B. via sqlx oder refinery).&lt;br /&gt;
* CI/CD: Automatisierte Tests und Deployments.&lt;br /&gt;
* Backup-Strategie: Regelmäßige Sicherung von Datenbank und Medien-Storage.&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Grundbegriffe Informatik]]&lt;br /&gt;
* [[Weiter]]&lt;br /&gt;
* [[Wissenssysteme &amp;amp; Tools im Überblick]]&lt;br /&gt;
&lt;br /&gt;
==Hinweis==&lt;br /&gt;
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Hauptseite&amp;diff=598</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Hauptseite&amp;diff=598"/>
		<updated>2026-08-18T05:42:20Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;br /&gt;
== Grundaufbau eines Wissensmanagement-Systems ==&lt;br /&gt;
Die folgenden Bausteine beschreiben kein klassisches CMS für Blog-Artikel, sondern ein &#039;&#039;&#039;Wissensmanagement-System (Wiki-artig)&#039;&#039;&#039;: Im Mittelpunkt steht nicht die einzelne Seite, sondern das Netz aus Wissensartikeln, ihren Verknüpfungen und ihrer Auffindbarkeit. Entsprechend rücken Taxonomie, Verlinkung und Suche stärker in den Vordergrund als bei einem reinen Content-Ausgabe-System.&lt;br /&gt;
&lt;br /&gt;
== Hauptbausteine im Detail ==&lt;br /&gt;
&lt;br /&gt;
=== [[Data Engine]] ([[Wissensmodell]] &amp;amp;  [[Speicherung]]) ===&lt;br /&gt;
Das Herzstück des Systems. Es definiert, wie Wissensartikel und ihre Beziehungen abgelegt werden:&lt;br /&gt;
* Entwickler-Entscheidung: Monolithisches Datenmodell (feste Tabellen für articles, categories, tags) oder flexibles Schema (JSONB / EAV-Muster für benutzerdefinierte Wissens-Typen wie Glossareinträge, How-Tos, FAQs).&lt;br /&gt;
* Taxonomie als Kernbestandteil: Eigene Tabellen für Kategorien, Tags und Artikel-Artikel-Relationen (Verlinkungen), nicht nur für den Inhalt selbst.&lt;br /&gt;
* Mandantenfähigkeit / Multi-Tenancy (optional): Trennung von Daten per tenant_id-Spalte oder separaten Datenbankschemas.&lt;br /&gt;
* Datenbank: Relationale Datenbanken wie PostgreSQL bieten mit JSON-Unterstützung volle Flexibilität bei hoher Integrität – wichtig, da Wissensartikel oft variable Zusatzfelder benötigen.&lt;br /&gt;
&lt;br /&gt;
=== Content &amp;amp; Routing Layer (Wissensartikel-Verwaltung &amp;amp; URLs) ===&lt;br /&gt;
Verantwortlich für das Laden und Rendern von Wissensartikeln für Nutzer:&lt;br /&gt;
* Slug-Mapping: Zuordnung von lesbaren Pfaden (/wiki/rust-cms-guide) zu Datenbank-Einträgen.&lt;br /&gt;
* Status &amp;amp; Versionierung: Artikel besitzen Zustände (draft, published, archived) sowie eine Revisions-Historie – bei einem Wissenssystem meist zentraler als bei einem Blog, da Artikel fortlaufend gepflegt statt einmalig veröffentlicht werden.&lt;br /&gt;
* Rendering:&lt;br /&gt;
** Server-Side Rendering (SSR): HTML wird direkt über eine Template-Engine (z. B. Askama, Tera) gerendert.&lt;br /&gt;
** Headless (API): Ausgabe von JSON für entkoppelte Frontends.&lt;br /&gt;
&lt;br /&gt;
=== Wissensverknüpfung &amp;amp; Taxonomie (Knowledge Graph) ===&lt;br /&gt;
Das eigentliche Unterscheidungsmerkmal eines Wissenssystems gegenüber einem reinen CMS – Wissen entsteht durch Verknüpfung, nicht nur durch einzelne Artikel:&lt;br /&gt;
* Wiki-Links &amp;amp; Backlinks: Erkennung von Verweisen zwischen Artikeln (z. B. &amp;lt;nowiki&amp;gt;[[Artikelname]]&amp;lt;/nowiki&amp;gt;-Syntax) sowie automatische Rückverfolgung, welche Artikel auf einen bestimmten Artikel verlinken.&lt;br /&gt;
* Kategorien &amp;amp; Tags: Hierarchische und flache Klassifizierung von Wissensartikeln zur Navigation und Filterung.&lt;br /&gt;
* Verwandte Artikel: Automatische oder manuelle Vorschläge thematisch ähnlicher Artikel (z. B. über gemeinsame Tags oder Verlinkungsdichte).&lt;br /&gt;
* Glossar &amp;amp; Begriffsdefinitionen: Zentrale Verwaltung wiederkehrender Fachbegriffe, die aus Artikeltexten heraus verlinkt werden können.&lt;br /&gt;
&lt;br /&gt;
=== Authentication &amp;amp; Authorization (Sicherheit) ===&lt;br /&gt;
Trennt den öffentlichen Bereich vom Verwaltungsbereich:&lt;br /&gt;
* Authentifizierung: Identitätsprüfung von Benutzern (z. B. Session-Cookies oder JWT-Tokens).&lt;br /&gt;
* Rechteverwaltung (RBAC): Rollenbasierte Zugriffskontrolle (z. B. Admin, Editor, Author), um festzulegen, wer welche Endpunkte oder Inhalte bearbeiten darf.&lt;br /&gt;
&lt;br /&gt;
=== Media Manager (Dateiverwaltung) ===&lt;br /&gt;
Verwaltet Bilder, PDFs und sonstige Uploads:&lt;br /&gt;
* Upload-Pipeline: Empfang von Dateien, Prüfung von MIME-Types und Dateigrößen.&lt;br /&gt;
* Verarbeitung: Automatische Skalierung oder Konvertierung von Bildern (z. B. Erzeugung von WebP-Thumbnails).&lt;br /&gt;
* Storage: Speicherung auf dem lokalen Dateisystem oder in einem Object-Storage (S3/MinIO).&lt;br /&gt;
&lt;br /&gt;
=== Admin Backend (Verwaltungsoberfläche) ===&lt;br /&gt;
Die Benutzeroberfläche für Redakteure:&lt;br /&gt;
* Rich-Text / Markdown Editor: Eingabeoberfläche für Inhalte.&lt;br /&gt;
* REST / gRPC / GraphQL API: Kommuniziert mit dem Backend, um Inhalte, Einstellungen, Benutzer und Medien zu verwalten.&lt;br /&gt;
&lt;br /&gt;
=== Caching &amp;amp; Performance Layer ===&lt;br /&gt;
Verhindert unnötige Datenbankabfragen bei hoher Last:&lt;br /&gt;
* HTTP-Caching: Passende Header (Cache-Control, ETag) für Nginx oder CDNs.&lt;br /&gt;
* In-Memory Caching: Zwischenspeichern von zusammengestellten Seiten oder Datenbank-Ergebnissen (z. B. über In-Memory-Stores oder Redis).&lt;br /&gt;
&lt;br /&gt;
=== Search &amp;amp; Discovery (Suche) ===&lt;br /&gt;
In einem Wissenssystem oft der wichtigste Einstiegspunkt überhaupt – Nutzer suchen gezielt nach Antworten statt zu stöbern:&lt;br /&gt;
* DB-native Suche: Volltextsuche über PostgreSQL tsvector/tsquery, ausreichend für kleinere bis mittlere Datenmengen.&lt;br /&gt;
* Externer Suchindex: Bei höheren Anforderungen an Relevanz und Performance Anbindung an Meilisearch, Typesense oder Elasticsearch.&lt;br /&gt;
* Facettierung &amp;amp; Filter: Eingrenzung nach Kategorie, Tag, Datum oder Autor.&lt;br /&gt;
&lt;br /&gt;
=== SEO &amp;amp; Metadata ===&lt;br /&gt;
Sorgt dafür, dass Inhalte von Suchmaschinen korrekt erfasst werden:&lt;br /&gt;
* Meta-Tags &amp;amp; Open Graph: Pro Inhalt konfigurierbare Title-, Description- und Social-Preview-Daten.&lt;br /&gt;
* Sitemap &amp;amp; Robots: Automatisch generierte sitemap.xml und robots.txt.&lt;br /&gt;
* Kanonische URLs &amp;amp; Redirects: Vermeidung von Duplicate Content, Verwaltung von 301-Weiterleitungen bei Slug-Änderungen.&lt;br /&gt;
&lt;br /&gt;
=== Plugin- &amp;amp; Extension-System ===&lt;br /&gt;
Erlaubt es, Funktionalität ohne Eingriff in den Core zu erweitern:&lt;br /&gt;
* Hooks &amp;amp; Events: Definierte Erweiterungspunkte (z. B. before_publish, after_upload), an denen Plugins andocken können.&lt;br /&gt;
* Middleware-Ketten: Zusätzliche Verarbeitungsschritte in Request/Response-Pipeline einschiebbar.&lt;br /&gt;
&lt;br /&gt;
=== Background Jobs / Task Queue ===&lt;br /&gt;
Verlagert zeitintensive Arbeiten aus dem Request-Zyklus:&lt;br /&gt;
* Queue-Anbindung: Asynchrone Verarbeitung über Redis-basierte Queues oder tokio-Task-Runner.&lt;br /&gt;
* Typische Jobs: Bildkonvertierung, E-Mail-Versand, Sitemap-Neubau, Webhook-Zustellung.&lt;br /&gt;
* Retry &amp;amp; Fehlerbehandlung: Wiederholungslogik und Dead-Letter-Handling bei fehlgeschlagenen Jobs.&lt;br /&gt;
&lt;br /&gt;
=== Internationalisierung (i18n / l10n) ===&lt;br /&gt;
Unterstützt mehrsprachige Inhalte und Oberflächen:&lt;br /&gt;
* Mehrsprachige Inhalte: Übersetzungsstatus pro Sprache und Content-Objekt.&lt;br /&gt;
* Locale-Routing: Sprachspezifische Pfade (/de/…, /en/…) oder Subdomains.&lt;br /&gt;
* UI-Übersetzung: Lokalisierte Texte im Admin Backend.&lt;br /&gt;
&lt;br /&gt;
=== Notifications &amp;amp; E-Mail ===&lt;br /&gt;
Kommuniziert Systemereignisse an Nutzer und Redakteure:&lt;br /&gt;
* Transaktionale Mails: Passwort-Reset, Einladungen, Kommentar-Benachrichtigungen.&lt;br /&gt;
* Workflow-Benachrichtigungen: Hinweise bei Freigabe-Anfragen oder Statuswechseln von Inhalten.&lt;br /&gt;
&lt;br /&gt;
=== Audit-Log &amp;amp; Monitoring ===&lt;br /&gt;
Schafft Nachvollziehbarkeit und Betriebssicherheit:&lt;br /&gt;
* Audit-Log: Protokollierung, wer wann welche Änderung vorgenommen hat (Compliance, Nachvollziehbarkeit).&lt;br /&gt;
* Monitoring &amp;amp; Tracing: Metriken, Logs und Fehlerreporting für den laufenden Betrieb (z. B. über OpenTelemetry).&lt;br /&gt;
&lt;br /&gt;
=== Konfigurationsmanagement ===&lt;br /&gt;
Zentrale Steuerung systemweiter Einstellungen:&lt;br /&gt;
* Site-Settings: Globale Konfiguration wie Seitenname, Standardsprache, Zeitzone.&lt;br /&gt;
* Feature-Flags: Kontrolliertes Ein-/Ausschalten einzelner Funktionen ohne Redeploy.&lt;br /&gt;
&lt;br /&gt;
=== Deployment &amp;amp; Infrastructure ===&lt;br /&gt;
Betrifft Betrieb und Wartbarkeit des Systems:&lt;br /&gt;
* Migrations-Tooling: Versionierte Datenbank-Migrationen (z. B. via sqlx oder refinery).&lt;br /&gt;
* CI/CD: Automatisierte Tests und Deployments.&lt;br /&gt;
* Backup-Strategie: Regelmäßige Sicherung von Datenbank und Medien-Storage.&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Grundbegriffe Informatik]]&lt;br /&gt;
* [[Weiter]]&lt;br /&gt;
* [[Wissenssysteme &amp;amp; Tools im Überblick]]&lt;br /&gt;
* [[Drupal]]&lt;br /&gt;
&lt;br /&gt;
==Hinweis==&lt;br /&gt;
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Weiter&amp;diff=52</id>
		<title>Weiter</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Weiter&amp;diff=52"/>
		<updated>2026-08-15T12:40:03Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im Open-Source-Bereich gibt es eine breite Palette an ausgereiften Wissensmanagement- und Wiki-Systemen für das Self-Hosting. Je nach Struktur, gewünschter Benutzeroberfläche und Speicherbackend lassen sie sich in verschiedene Kategorien einteilen&lt;br /&gt;
&lt;br /&gt;
==Moderne Wissensdatenbanken (Notion- &amp;amp; Confluence-Alternativen)==&lt;br /&gt;
All-in-one-Arbeitsbereiche mit Seiten, Datenbanken und Blöcken – ersetzen Notion/Confluence im Self-Hosting.&lt;br /&gt;
&lt;br /&gt;
==Entwicklerfreundliche &amp;amp; Markdown-fokussierte Wikis==&lt;br /&gt;
Wikis, die primär mit Markdown arbeiten und sich vor allem an Entwickler-Teams richten.&lt;br /&gt;
* &#039;&#039;&#039;Wiki.js&#039;&#039;&#039; – Modernes Wiki mit Markdown-Editor, Git-Sync, feingranularer Rechteverwaltung und Node.js-Backend.&lt;br /&gt;
&lt;br /&gt;
===Docs-as-Code-Generatoren===&lt;br /&gt;
Statische Seitengeneratoren, die Dokumentation aus Markdown-Dateien im Git-Repo erzeugen – Inhalte werden wie Code versioniert und reviewed.&lt;br /&gt;
* &#039;&#039;&#039;MkDocs mit Material-Theme&#039;&#039;&#039; – Python-basierter statischer Doku-Generator mit populärem, stark anpassbarem Material-Design-Theme.&lt;br /&gt;
* &#039;&#039;&#039;Docusaurus&#039;&#039;&#039; – React-basierter Doku-Generator von Meta, stark bei Versionierung und Mehrsprachigkeit.&lt;br /&gt;
* &#039;&#039;&#039;Astro Starlight&#039;&#039;&#039; – Doku-Theme auf Basis von Astro, sehr performant durch minimales JavaScript im Browser.&lt;br /&gt;
* &#039;&#039;&#039;VitePress&#039;&#039;&#039; – Vite-basierter, schneller statischer Seitengenerator, häufig für Vue-/JS-Projektdokumentationen genutzt.&lt;br /&gt;
* &#039;&#039;&#039;mdBook&#039;&#039;&#039; – Rust-Tool zum Erstellen von Büchern/Dokus aus Markdown, bekannt aus der offiziellen Rust-Dokumentation.&lt;br /&gt;
&lt;br /&gt;
===Klassische Wiki-Engines===&lt;br /&gt;
Traditionelle, datenbankgestützte Wiki-Software mit eigener Syntax und Weboberfläche.&lt;br /&gt;
* &#039;&#039;&#039;MediaWiki&#039;&#039;&#039; – Software hinter Wikipedia, sehr mächtig und erweiterbar, aber vergleichsweise aufwändig im Betrieb.&lt;br /&gt;
* &#039;&#039;&#039;DokuWiki&#039;&#039;&#039; – Dateibasiertes Wiki ganz ohne Datenbank, dadurch einfach zu hosten und zu sichern.&lt;br /&gt;
* &#039;&#039;&#039;XWiki&#039;&#039;&#039; – Enterprise-Wiki mit Anwendungs-Baukasten für strukturierte Daten, Formulare und Skripting.&lt;br /&gt;
&lt;br /&gt;
==Vernetztes Wissen &amp;amp; Personal Knowledge Management (PKM)==&lt;br /&gt;
Tools für vernetzte Notizen mit bidirektionalen Links, Backlinks und Graph-Ansicht – Fokus auf persönliches statt Team-Wissen.&lt;br /&gt;
* &#039;&#039;&#039;SilverBullet&#039;&#039;&#039; – Web-basiertes Markdown-Notizsystem mit eingebauter Automatisierung/Scripting.&lt;br /&gt;
* &#039;&#039;&#039;Joplin&#039;&#039;&#039; – Open-Source-Notiz-App mit Ende-zu-Ende-Verschlüsselung und Sync, Alternative zu Evernote.&lt;br /&gt;
* &#039;&#039;&#039;Logseq&#039;&#039;&#039; – Outliner-basiertes PKM-Tool mit Backlinks und Graph-Ansicht, ähnlich Roam Research.&lt;br /&gt;
&lt;br /&gt;
==Git-basierte Wikis==&lt;br /&gt;
Wikis, die Inhalte direkt in einem Git-Repository speichern statt in einer Datenbank.&lt;br /&gt;
* &#039;&#039;&#039;Gollum&#039;&#039;&#039; – Einfaches Wiki, das direkt auf einem Git-Repo aufsetzt; jede Seite ist eine Datei im Repo.&lt;br /&gt;
&lt;br /&gt;
==KI- &amp;amp; RAG-basierte Expertensysteme (Fokus: Eigene Dokumente abfragen)==&lt;br /&gt;
Anwendungen, die eigene Dokumente per Retrieval-Augmented Generation (RAG) durchsuchbar und per Chat befragbar machen.&lt;br /&gt;
* &#039;&#039;&#039;AnythingLLM&#039;&#039;&#039; – All-in-one-RAG-App mit UI, Nutzerverwaltung und Anbindung an lokale oder Cloud-LLMs.&lt;br /&gt;
* &#039;&#039;&#039;Open WebUI&#039;&#039;&#039; – Chat-Oberfläche für lokale LLMs (z. B. über Ollama), inkl. Dokumenten-RAG und Multi-User-Betrieb.&lt;br /&gt;
* &#039;&#039;&#039;Dify&#039;&#039;&#039; – Low-Code-Plattform zum Bauen von LLM-Apps und RAG-Workflows mit visuellem Editor.&lt;br /&gt;
&lt;br /&gt;
==Vektordatenbanken (Semantische Suche)==&lt;br /&gt;
Speichern Text als Vektor-Embeddings, damit inhaltlich ähnliche statt nur wortgleiche Treffer gefunden werden – Grundlage jedes RAG-Systems.&lt;br /&gt;
* &#039;&#039;&#039;Qdrant&#039;&#039;&#039; – Performante Vektordatenbank in Rust, beliebt für RAG-Projekte, guter Hybrid-Search-Support.&lt;br /&gt;
* &#039;&#039;&#039;ChromaDB&#039;&#039;&#039; – Leichtgewichtige, einfach einzurichtende Vektordatenbank, oft für Prototypen genutzt.&lt;br /&gt;
* &#039;&#039;&#039;Milvus&#039;&#039;&#039; – Skalierbare Vektordatenbank für sehr große Datenmengen, produktionsreif für Enterprise-Einsatz.&lt;br /&gt;
* &#039;&#039;&#039;pgvector&#039;&#039;&#039; – PostgreSQL-Erweiterung für Vektorsuche – praktisch, wenn ohnehin schon Postgres im Einsatz ist.&lt;br /&gt;
&lt;br /&gt;
==Content-Management-Systeme (CMS)==&lt;br /&gt;
Systeme zur Verwaltung und Veröffentlichung von Webinhalten (Seiten, Artikel, Medien) mit Redaktionsworkflows.&lt;br /&gt;
&lt;br /&gt;
===Klassische CMS===&lt;br /&gt;
* &#039;&#039;&#039;Drupal&#039;&#039;&#039; – Sehr flexibles, aber komplexeres CMS mit feingranularer Rechteverwaltung, stark bei großen strukturierten Websites.&lt;br /&gt;
&lt;br /&gt;
==LLM-Inferenz==&lt;br /&gt;
Software zum lokalen Ausführen von Sprachmodellen (Inference) – die Grundlage für alle self-hosted KI-Anwendungen.&lt;br /&gt;
* &#039;&#039;&#039;Ollama&#039;&#039;&#039; – Einfachste Möglichkeit, offene LLMs lokal laufen zu lassen; CLI + API, riesige Modellbibliothek.&lt;br /&gt;
* &#039;&#039;&#039;llama.cpp&#039;&#039;&#039; – Effiziente C/C++-Inferenz-Engine für LLMs, läuft auch auf schwacher Hardware/CPU.&lt;br /&gt;
* &#039;&#039;&#039;vLLM&#039;&#039;&#039; – Hochperformante Inferenz-Engine für Produktionseinsatz mit hohem Durchsatz (Batching, PagedAttention).&lt;br /&gt;
* &#039;&#039;&#039;LM Studio&#039;&#039;&#039; – Desktop-App mit GUI zum Herunterladen und Ausführen lokaler Modelle, einsteigerfreundlich.&lt;br /&gt;
* &#039;&#039;&#039;LocalAI&#039;&#039;&#039; – OpenAI-API-kompatible, self-hosted Inferenz-Lösung für Text-, Bild- und Audio-Modelle.&lt;br /&gt;
* &#039;&#039;&#039;text-generation-webui&#039;&#039;&#039; – Web-Oberfläche für lokale LLMs mit vielen Erweiterungen (Gradio-basiert).&lt;br /&gt;
&lt;br /&gt;
===Agenten-optimierte Open-Source-Modelle===&lt;br /&gt;
Offene Sprachmodelle, die gezielt auf Tool-Calling/Function-Calling und Agenten-Verhalten trainiert wurden.&lt;br /&gt;
* &#039;&#039;&#039;Nous Hermes 3 / Hermes 2 Pro&#039;&#039;&#039; – Fine-Tunes von Llama/Mistral, stark bei strukturierten Funktionsaufrufen.&lt;br /&gt;
* &#039;&#039;&#039;Qwen2.5-Coder / Qwen-Agent&#039;&#039;&#039; – Alibabas Modellreihe, sehr gut bei Code und Agenten-Workflows.&lt;br /&gt;
* &#039;&#039;&#039;Mistral Small / NeMo&#039;&#039;&#039; – Kompakte, function-calling-fähige Modelle mit guter Geschwindigkeit-Qualitäts-Balance.&lt;br /&gt;
&lt;br /&gt;
==Autonome KI-Agenten-Systeme==&lt;br /&gt;
Systeme, die selbstständig Teilziele planen und iterativ verfolgen, statt nur auf einzelne Prompts zu antworten.&lt;br /&gt;
* &#039;&#039;&#039;AutoGPT&#039;&#039;&#039; – Einer der ersten autonomen Agenten, zerlegt ein Ziel eigenständig in Teilaufgaben.&lt;br /&gt;
* &#039;&#039;&#039;BabyAGI&#039;&#039;&#039; – Minimalistischer autonomer Task-Agent mit Prioritätswarteschlange für Teilaufgaben.&lt;br /&gt;
* &#039;&#039;&#039;SuperAGI&#039;&#039;&#039; – Framework/Plattform zum Bauen und Verwalten mehrerer autonomer Agenten mit UI.&lt;br /&gt;
* &#039;&#039;&#039;Letta (MemGPT)&#039;&#039;&#039; – Agenten-Framework mit Fokus auf persistentem Langzeitgedächtnis über Sitzungen hinweg.&lt;br /&gt;
* &#039;&#039;&#039;CAMEL-AI&#039;&#039;&#039; – Framework für Multi-Agenten-Kommunikation (&amp;quot;Agenten reden miteinander&amp;quot;), gut für Simulationen.&lt;br /&gt;
&lt;br /&gt;
==Autonome Coding-/Content-Agenten (Claude-Code-Alternativen)==&lt;br /&gt;
Agenten, die eigenständig Code schreiben, Dateien bearbeiten und Aufgaben im Terminal/Editor ausführen – vergleichbar mit Claude Code.&lt;br /&gt;
* &#039;&#039;&#039;Aider&#039;&#039;&#039; – CLI-Pair-Programming-Agent mit Git-Integration, funktioniert mit lokalen oder API-LLMs.&lt;br /&gt;
* &#039;&#039;&#039;Cline&#039;&#039;&#039; – Autonomer Coding-Agent als VS-Code-Extension, open source, unterstützt lokale Modelle.&lt;br /&gt;
* &#039;&#039;&#039;Continue.dev&#039;&#039;&#039; – Open-Source-Coding-Assistent/Agent, self-hostbar mit eigenem LLM-Backend.&lt;br /&gt;
* &#039;&#039;&#039;SWE-agent&#039;&#039;&#039; – Agent für vollständige Software-Engineering-Aufgaben, von Issue bis fertigem Pull Request.&lt;br /&gt;
* &#039;&#039;&#039;Devika&#039;&#039;&#039; – Open-Source-Alternative zu &amp;quot;Devin&amp;quot;, autonomer Multi-Step-Coding-Agent.&lt;br /&gt;
* &#039;&#039;&#039;GPT Engineer&#039;&#039;&#039; – Generiert aus einer Prompt-Beschreibung eine komplette Codebasis.&lt;br /&gt;
* &#039;&#039;&#039;OpenHands&#039;&#039;&#039; – Autonomer Agent für Coding- und allgemeine Computeraufgaben (früher OpenDevin).&lt;br /&gt;
&lt;br /&gt;
==Agenten-Frameworks==&lt;br /&gt;
Bibliotheken/Plattformen zum Orchestrieren mehrerer Agenten, Tools und Workflow-Schritten.&lt;br /&gt;
* &#039;&#039;&#039;LangGraph&#039;&#039;&#039; – Graph-basiertes Framework (von LangChain) für zustandsbehaftete, komplexe Agenten-Workflows.&lt;br /&gt;
* &#039;&#039;&#039;CrewAI&#039;&#039;&#039; – Framework für rollenbasierte Multi-Agenten-Teams (&amp;quot;Crew&amp;quot; aus spezialisierten Agenten).&lt;br /&gt;
* &#039;&#039;&#039;AutoGen / AG2&#039;&#039;&#039; – Microsofts Framework für Multi-Agenten-Konversationen und Tool-Nutzung.&lt;br /&gt;
* &#039;&#039;&#039;n8n&#039;&#039;&#039; – No-Code-Workflow-Automatisierung mit KI-Knoten, verbindet Agenten mit hunderten Diensten.&lt;br /&gt;
* &#039;&#039;&#039;Flowise&#039;&#039;&#039; – Visueller Low-Code-Builder für LLM-/RAG-/Agenten-Flows per Drag &amp;amp; Drop.&lt;br /&gt;
&lt;br /&gt;
==Embedding- &amp;amp; Reranking-Modelle==&lt;br /&gt;
Modelle, die Text in Vektoren umwandeln (Embedding) bzw. Suchtreffer nach Relevanz neu sortieren (Reranking) – notwendig, damit RAG gute Treffer liefert.&lt;br /&gt;
* &#039;&#039;&#039;nomic-embed-text&#039;&#039;&#039; – Offenes, leistungsstarkes Embedding-Modell, gängiger Standard mit Ollama.&lt;br /&gt;
* &#039;&#039;&#039;bge-m3&#039;&#039;&#039; – Multilingual fähiges Embedding-Modell mit Unterstützung für sehr lange Texte.&lt;br /&gt;
* &#039;&#039;&#039;e5-mistral&#039;&#039;&#039; – Auf Mistral basierendes Embedding-Modell mit starker Retrieval-Qualität.&lt;br /&gt;
* &#039;&#039;&#039;bge-reranker&#039;&#039;&#039; – Sortiert erste Suchtreffer per Cross-Encoder nach tatsächlicher Relevanz neu.&lt;br /&gt;
* &#039;&#039;&#039;Jina Reranker&#039;&#039;&#039; – Alternative Reranking-Modellreihe von Jina AI, ebenfalls Cross-Encoder-basiert.&lt;br /&gt;
&lt;br /&gt;
==Evaluation &amp;amp; Monitoring==&lt;br /&gt;
Tools zum Messen, ob RAG-/Agenten-Antworten korrekt, relevant und halluzinationsfrei sind, sowie zum Nachverfolgen von LLM-Aufrufen im Betrieb.&lt;br /&gt;
* &#039;&#039;&#039;Langfuse&#039;&#039;&#039; – Open-Source-Observability-Plattform für LLM-Anwendungen (Traces, Kosten, Prompt-Versionen).&lt;br /&gt;
* &#039;&#039;&#039;Ragas&#039;&#039;&#039; – Framework speziell zur automatisierten Bewertung von RAG-Pipelines (Relevanz, Treue, Vollständigkeit).&lt;br /&gt;
* &#039;&#039;&#039;Phoenix (Arize)&#039;&#039;&#039; – Open-Source-Tool zur Analyse und Visualisierung von LLM-Traces und Embedding-Räumen.&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Weiter&amp;diff=51</id>
		<title>Weiter</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Weiter&amp;diff=51"/>
		<updated>2026-08-15T12:39:43Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;br /&gt;
Im Open-Source-Bereich gibt es eine breite Palette an ausgereiften Wissensmanagement- und Wiki-Systemen für das Self-Hosting. Je nach Struktur, gewünschter Benutzeroberfläche und Speicherbackend lassen sie sich in verschiedene Kategorien einteilen&lt;br /&gt;
&lt;br /&gt;
==Moderne Wissensdatenbanken (Notion- &amp;amp; Confluence-Alternativen)==&lt;br /&gt;
All-in-one-Arbeitsbereiche mit Seiten, Datenbanken und Blöcken – ersetzen Notion/Confluence im Self-Hosting.&lt;br /&gt;
&lt;br /&gt;
==Entwicklerfreundliche &amp;amp; Markdown-fokussierte Wikis==&lt;br /&gt;
Wikis, die primär mit Markdown arbeiten und sich vor allem an Entwickler-Teams richten.&lt;br /&gt;
* &#039;&#039;&#039;Wiki.js&#039;&#039;&#039; – Modernes Wiki mit Markdown-Editor, Git-Sync, feingranularer Rechteverwaltung und Node.js-Backend.&lt;br /&gt;
&lt;br /&gt;
===Docs-as-Code-Generatoren===&lt;br /&gt;
Statische Seitengeneratoren, die Dokumentation aus Markdown-Dateien im Git-Repo erzeugen – Inhalte werden wie Code versioniert und reviewed.&lt;br /&gt;
* &#039;&#039;&#039;MkDocs mit Material-Theme&#039;&#039;&#039; – Python-basierter statischer Doku-Generator mit populärem, stark anpassbarem Material-Design-Theme.&lt;br /&gt;
* &#039;&#039;&#039;Docusaurus&#039;&#039;&#039; – React-basierter Doku-Generator von Meta, stark bei Versionierung und Mehrsprachigkeit.&lt;br /&gt;
* &#039;&#039;&#039;Astro Starlight&#039;&#039;&#039; – Doku-Theme auf Basis von Astro, sehr performant durch minimales JavaScript im Browser.&lt;br /&gt;
* &#039;&#039;&#039;VitePress&#039;&#039;&#039; – Vite-basierter, schneller statischer Seitengenerator, häufig für Vue-/JS-Projektdokumentationen genutzt.&lt;br /&gt;
* &#039;&#039;&#039;mdBook&#039;&#039;&#039; – Rust-Tool zum Erstellen von Büchern/Dokus aus Markdown, bekannt aus der offiziellen Rust-Dokumentation.&lt;br /&gt;
&lt;br /&gt;
===Klassische Wiki-Engines===&lt;br /&gt;
Traditionelle, datenbankgestützte Wiki-Software mit eigener Syntax und Weboberfläche.&lt;br /&gt;
* &#039;&#039;&#039;MediaWiki&#039;&#039;&#039; – Software hinter Wikipedia, sehr mächtig und erweiterbar, aber vergleichsweise aufwändig im Betrieb.&lt;br /&gt;
* &#039;&#039;&#039;DokuWiki&#039;&#039;&#039; – Dateibasiertes Wiki ganz ohne Datenbank, dadurch einfach zu hosten und zu sichern.&lt;br /&gt;
* &#039;&#039;&#039;XWiki&#039;&#039;&#039; – Enterprise-Wiki mit Anwendungs-Baukasten für strukturierte Daten, Formulare und Skripting.&lt;br /&gt;
&lt;br /&gt;
==Vernetztes Wissen &amp;amp; Personal Knowledge Management (PKM)==&lt;br /&gt;
Tools für vernetzte Notizen mit bidirektionalen Links, Backlinks und Graph-Ansicht – Fokus auf persönliches statt Team-Wissen.&lt;br /&gt;
* &#039;&#039;&#039;SilverBullet&#039;&#039;&#039; – Web-basiertes Markdown-Notizsystem mit eingebauter Automatisierung/Scripting.&lt;br /&gt;
* &#039;&#039;&#039;Joplin&#039;&#039;&#039; – Open-Source-Notiz-App mit Ende-zu-Ende-Verschlüsselung und Sync, Alternative zu Evernote.&lt;br /&gt;
* &#039;&#039;&#039;Logseq&#039;&#039;&#039; – Outliner-basiertes PKM-Tool mit Backlinks und Graph-Ansicht, ähnlich Roam Research.&lt;br /&gt;
&lt;br /&gt;
==Git-basierte Wikis==&lt;br /&gt;
Wikis, die Inhalte direkt in einem Git-Repository speichern statt in einer Datenbank.&lt;br /&gt;
* &#039;&#039;&#039;Gollum&#039;&#039;&#039; – Einfaches Wiki, das direkt auf einem Git-Repo aufsetzt; jede Seite ist eine Datei im Repo.&lt;br /&gt;
&lt;br /&gt;
==KI- &amp;amp; RAG-basierte Expertensysteme (Fokus: Eigene Dokumente abfragen)==&lt;br /&gt;
Anwendungen, die eigene Dokumente per Retrieval-Augmented Generation (RAG) durchsuchbar und per Chat befragbar machen.&lt;br /&gt;
* &#039;&#039;&#039;AnythingLLM&#039;&#039;&#039; – All-in-one-RAG-App mit UI, Nutzerverwaltung und Anbindung an lokale oder Cloud-LLMs.&lt;br /&gt;
* &#039;&#039;&#039;Open WebUI&#039;&#039;&#039; – Chat-Oberfläche für lokale LLMs (z. B. über Ollama), inkl. Dokumenten-RAG und Multi-User-Betrieb.&lt;br /&gt;
* &#039;&#039;&#039;Dify&#039;&#039;&#039; – Low-Code-Plattform zum Bauen von LLM-Apps und RAG-Workflows mit visuellem Editor.&lt;br /&gt;
&lt;br /&gt;
==Vektordatenbanken (Semantische Suche)==&lt;br /&gt;
Speichern Text als Vektor-Embeddings, damit inhaltlich ähnliche statt nur wortgleiche Treffer gefunden werden – Grundlage jedes RAG-Systems.&lt;br /&gt;
* &#039;&#039;&#039;Qdrant&#039;&#039;&#039; – Performante Vektordatenbank in Rust, beliebt für RAG-Projekte, guter Hybrid-Search-Support.&lt;br /&gt;
* &#039;&#039;&#039;ChromaDB&#039;&#039;&#039; – Leichtgewichtige, einfach einzurichtende Vektordatenbank, oft für Prototypen genutzt.&lt;br /&gt;
* &#039;&#039;&#039;Milvus&#039;&#039;&#039; – Skalierbare Vektordatenbank für sehr große Datenmengen, produktionsreif für Enterprise-Einsatz.&lt;br /&gt;
* &#039;&#039;&#039;pgvector&#039;&#039;&#039; – PostgreSQL-Erweiterung für Vektorsuche – praktisch, wenn ohnehin schon Postgres im Einsatz ist.&lt;br /&gt;
&lt;br /&gt;
==Content-Management-Systeme (CMS)==&lt;br /&gt;
Systeme zur Verwaltung und Veröffentlichung von Webinhalten (Seiten, Artikel, Medien) mit Redaktionsworkflows.&lt;br /&gt;
&lt;br /&gt;
===Klassische CMS===&lt;br /&gt;
* &#039;&#039;&#039;Drupal&#039;&#039;&#039; – Sehr flexibles, aber komplexeres CMS mit feingranularer Rechteverwaltung, stark bei großen strukturierten Websites.&lt;br /&gt;
&lt;br /&gt;
==LLM-Inferenz==&lt;br /&gt;
Software zum lokalen Ausführen von Sprachmodellen (Inference) – die Grundlage für alle self-hosted KI-Anwendungen.&lt;br /&gt;
* &#039;&#039;&#039;Ollama&#039;&#039;&#039; – Einfachste Möglichkeit, offene LLMs lokal laufen zu lassen; CLI + API, riesige Modellbibliothek.&lt;br /&gt;
* &#039;&#039;&#039;llama.cpp&#039;&#039;&#039; – Effiziente C/C++-Inferenz-Engine für LLMs, läuft auch auf schwacher Hardware/CPU.&lt;br /&gt;
* &#039;&#039;&#039;vLLM&#039;&#039;&#039; – Hochperformante Inferenz-Engine für Produktionseinsatz mit hohem Durchsatz (Batching, PagedAttention).&lt;br /&gt;
* &#039;&#039;&#039;LM Studio&#039;&#039;&#039; – Desktop-App mit GUI zum Herunterladen und Ausführen lokaler Modelle, einsteigerfreundlich.&lt;br /&gt;
* &#039;&#039;&#039;LocalAI&#039;&#039;&#039; – OpenAI-API-kompatible, self-hosted Inferenz-Lösung für Text-, Bild- und Audio-Modelle.&lt;br /&gt;
* &#039;&#039;&#039;text-generation-webui&#039;&#039;&#039; – Web-Oberfläche für lokale LLMs mit vielen Erweiterungen (Gradio-basiert).&lt;br /&gt;
&lt;br /&gt;
===Agenten-optimierte Open-Source-Modelle===&lt;br /&gt;
Offene Sprachmodelle, die gezielt auf Tool-Calling/Function-Calling und Agenten-Verhalten trainiert wurden.&lt;br /&gt;
* &#039;&#039;&#039;Nous Hermes 3 / Hermes 2 Pro&#039;&#039;&#039; – Fine-Tunes von Llama/Mistral, stark bei strukturierten Funktionsaufrufen.&lt;br /&gt;
* &#039;&#039;&#039;Qwen2.5-Coder / Qwen-Agent&#039;&#039;&#039; – Alibabas Modellreihe, sehr gut bei Code und Agenten-Workflows.&lt;br /&gt;
* &#039;&#039;&#039;Mistral Small / NeMo&#039;&#039;&#039; – Kompakte, function-calling-fähige Modelle mit guter Geschwindigkeit-Qualitäts-Balance.&lt;br /&gt;
&lt;br /&gt;
==Autonome KI-Agenten-Systeme==&lt;br /&gt;
Systeme, die selbstständig Teilziele planen und iterativ verfolgen, statt nur auf einzelne Prompts zu antworten.&lt;br /&gt;
* &#039;&#039;&#039;AutoGPT&#039;&#039;&#039; – Einer der ersten autonomen Agenten, zerlegt ein Ziel eigenständig in Teilaufgaben.&lt;br /&gt;
* &#039;&#039;&#039;BabyAGI&#039;&#039;&#039; – Minimalistischer autonomer Task-Agent mit Prioritätswarteschlange für Teilaufgaben.&lt;br /&gt;
* &#039;&#039;&#039;SuperAGI&#039;&#039;&#039; – Framework/Plattform zum Bauen und Verwalten mehrerer autonomer Agenten mit UI.&lt;br /&gt;
* &#039;&#039;&#039;Letta (MemGPT)&#039;&#039;&#039; – Agenten-Framework mit Fokus auf persistentem Langzeitgedächtnis über Sitzungen hinweg.&lt;br /&gt;
* &#039;&#039;&#039;CAMEL-AI&#039;&#039;&#039; – Framework für Multi-Agenten-Kommunikation (&amp;quot;Agenten reden miteinander&amp;quot;), gut für Simulationen.&lt;br /&gt;
&lt;br /&gt;
==Autonome Coding-/Content-Agenten (Claude-Code-Alternativen)==&lt;br /&gt;
Agenten, die eigenständig Code schreiben, Dateien bearbeiten und Aufgaben im Terminal/Editor ausführen – vergleichbar mit Claude Code.&lt;br /&gt;
* &#039;&#039;&#039;Aider&#039;&#039;&#039; – CLI-Pair-Programming-Agent mit Git-Integration, funktioniert mit lokalen oder API-LLMs.&lt;br /&gt;
* &#039;&#039;&#039;Cline&#039;&#039;&#039; – Autonomer Coding-Agent als VS-Code-Extension, open source, unterstützt lokale Modelle.&lt;br /&gt;
* &#039;&#039;&#039;Continue.dev&#039;&#039;&#039; – Open-Source-Coding-Assistent/Agent, self-hostbar mit eigenem LLM-Backend.&lt;br /&gt;
* &#039;&#039;&#039;SWE-agent&#039;&#039;&#039; – Agent für vollständige Software-Engineering-Aufgaben, von Issue bis fertigem Pull Request.&lt;br /&gt;
* &#039;&#039;&#039;Devika&#039;&#039;&#039; – Open-Source-Alternative zu &amp;quot;Devin&amp;quot;, autonomer Multi-Step-Coding-Agent.&lt;br /&gt;
* &#039;&#039;&#039;GPT Engineer&#039;&#039;&#039; – Generiert aus einer Prompt-Beschreibung eine komplette Codebasis.&lt;br /&gt;
* &#039;&#039;&#039;OpenHands&#039;&#039;&#039; – Autonomer Agent für Coding- und allgemeine Computeraufgaben (früher OpenDevin).&lt;br /&gt;
&lt;br /&gt;
==Agenten-Frameworks==&lt;br /&gt;
Bibliotheken/Plattformen zum Orchestrieren mehrerer Agenten, Tools und Workflow-Schritten.&lt;br /&gt;
* &#039;&#039;&#039;LangGraph&#039;&#039;&#039; – Graph-basiertes Framework (von LangChain) für zustandsbehaftete, komplexe Agenten-Workflows.&lt;br /&gt;
* &#039;&#039;&#039;CrewAI&#039;&#039;&#039; – Framework für rollenbasierte Multi-Agenten-Teams (&amp;quot;Crew&amp;quot; aus spezialisierten Agenten).&lt;br /&gt;
* &#039;&#039;&#039;AutoGen / AG2&#039;&#039;&#039; – Microsofts Framework für Multi-Agenten-Konversationen und Tool-Nutzung.&lt;br /&gt;
* &#039;&#039;&#039;n8n&#039;&#039;&#039; – No-Code-Workflow-Automatisierung mit KI-Knoten, verbindet Agenten mit hunderten Diensten.&lt;br /&gt;
* &#039;&#039;&#039;Flowise&#039;&#039;&#039; – Visueller Low-Code-Builder für LLM-/RAG-/Agenten-Flows per Drag &amp;amp; Drop.&lt;br /&gt;
&lt;br /&gt;
==Embedding- &amp;amp; Reranking-Modelle==&lt;br /&gt;
Modelle, die Text in Vektoren umwandeln (Embedding) bzw. Suchtreffer nach Relevanz neu sortieren (Reranking) – notwendig, damit RAG gute Treffer liefert.&lt;br /&gt;
* &#039;&#039;&#039;nomic-embed-text&#039;&#039;&#039; – Offenes, leistungsstarkes Embedding-Modell, gängiger Standard mit Ollama.&lt;br /&gt;
* &#039;&#039;&#039;bge-m3&#039;&#039;&#039; – Multilingual fähiges Embedding-Modell mit Unterstützung für sehr lange Texte.&lt;br /&gt;
* &#039;&#039;&#039;e5-mistral&#039;&#039;&#039; – Auf Mistral basierendes Embedding-Modell mit starker Retrieval-Qualität.&lt;br /&gt;
* &#039;&#039;&#039;bge-reranker&#039;&#039;&#039; – Sortiert erste Suchtreffer per Cross-Encoder nach tatsächlicher Relevanz neu.&lt;br /&gt;
* &#039;&#039;&#039;Jina Reranker&#039;&#039;&#039; – Alternative Reranking-Modellreihe von Jina AI, ebenfalls Cross-Encoder-basiert.&lt;br /&gt;
&lt;br /&gt;
==Evaluation &amp;amp; Monitoring==&lt;br /&gt;
Tools zum Messen, ob RAG-/Agenten-Antworten korrekt, relevant und halluzinationsfrei sind, sowie zum Nachverfolgen von LLM-Aufrufen im Betrieb.&lt;br /&gt;
* &#039;&#039;&#039;Langfuse&#039;&#039;&#039; – Open-Source-Observability-Plattform für LLM-Anwendungen (Traces, Kosten, Prompt-Versionen).&lt;br /&gt;
* &#039;&#039;&#039;Ragas&#039;&#039;&#039; – Framework speziell zur automatisierten Bewertung von RAG-Pipelines (Relevanz, Treue, Vollständigkeit).&lt;br /&gt;
* &#039;&#039;&#039;Phoenix (Arize)&#039;&#039;&#039; – Open-Source-Tool zur Analyse und Visualisierung von LLM-Traces und Embedding-Räumen.&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Wissenssysteme_%26_Tools_im_%C3%9Cberblick&amp;diff=50</id>
		<title>Wissenssysteme &amp; Tools im Überblick</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Wissenssysteme_%26_Tools_im_%C3%9Cberblick&amp;diff=50"/>
		<updated>2026-08-15T12:38:34Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;br /&gt;
==Klassische Regelsysteme &amp;amp; Inferenz (Rule Engines)==&lt;br /&gt;
&#039;&#039;Systeme, die Wissen als Wenn-Dann-Regeln abbilden und daraus automatisch Schlussfolgerungen (Inferenz) ableiten.&#039;&#039;&lt;br /&gt;
* CLIPS – In C entwickeltes, produktionsregelbasiertes Expertensystem-Toolkit, seit den 1980ern u. a. von der NASA genutzt.&lt;br /&gt;
* Drools (KIE Community) – Java-basierte Business-Rules-Management-Engine mit Rete-Algorithmus, Teil der KIE-Plattform.&lt;br /&gt;
* Pyke / Experta (Python) – Python-Bibliotheken für regelbasierte Wissensverarbeitung mit Vorwärtsverkettung (Forward Chaining).&lt;br /&gt;
&lt;br /&gt;
==Wissensgraphen &amp;amp; Ontologien (Semantic Web)==&lt;br /&gt;
&#039;&#039;Modellieren Wissen als vernetzte Graphen aus Entitäten und Beziehungen, oft nach Semantic-Web-Standards wie RDF/OWL.&#039;&#039;&lt;br /&gt;
* Apache Jena – Java-Framework zum Erstellen und Abfragen RDF-basierter Wissensgraphen mit SPARQL-Unterstützung.&lt;br /&gt;
* Protégé – Open-Source-Editor der Stanford University zum Erstellen und Bearbeiten von Ontologien (OWL/RDF).&lt;br /&gt;
* Neo4j (Community Edition) – Weit verbreitete native Graphdatenbank mit der Abfragesprache Cypher.&lt;br /&gt;
* Memgraph – In-Memory-Graphdatenbank, kompatibel mit Cypher, optimiert für Echtzeit-Graphanalysen.&lt;br /&gt;
&lt;br /&gt;
==Moderne KI-gestützte Wissenssysteme (RAG &amp;amp; Vektorsuche)==&lt;br /&gt;
&#039;&#039;Kombinieren große Sprachmodelle mit externen Wissensquellen über Retrieval-Augmented Generation (RAG).&#039;&#039;&lt;br /&gt;
* Dify – Low-Code-Plattform zum Erstellen von LLM-Anwendungen inkl. RAG-Pipelines und Agenten.&lt;br /&gt;
* RAGFlow – Open-Source-Engine speziell für RAG-Workflows mit tiefem Dokumentenverständnis.&lt;br /&gt;
* Onyx – Open-Source-Plattform für unternehmensweite KI-Suche und Chat über eigene Datenquellen (vormals Danswer).&lt;br /&gt;
* LlamaIndex – Framework zur Verbindung von LLMs mit strukturierten und unstrukturierten Datenquellen (Indexierung/Retrieval).&lt;br /&gt;
* LangChain – Framework zum Verketten von LLM-Aufrufen, Tools und Datenquellen zu komplexen Anwendungen.&lt;br /&gt;
* Ollama – Tool zum lokalen Ausführen und Verwalten von Open-Source-LLMs.&lt;br /&gt;
* LocalAI – Open-Source-Alternative zur OpenAI-API für lokal gehostete Sprachmodelle.&lt;br /&gt;
&lt;br /&gt;
==Dokumentenbasiertes Wissensmanagement (Wikis &amp;amp; Docs)==&lt;br /&gt;
&#039;&#039;Klassische Werkzeuge zum Erfassen, Strukturieren und gemeinsamen Bearbeiten von Wissen in Textform.&#039;&#039;&lt;br /&gt;
* Wiki.js – Modernes, Node.js-basiertes Wiki-System mit Markdown-Unterstützung und ansprechender Oberfläche.&lt;br /&gt;
* Outline – Team-Wiki/Wissensdatenbank mit Fokus auf schnelle Suche und modernes Design.&lt;br /&gt;
* XWiki – Erweiterbare Open-Source-Wiki-Plattform mit eigenem Applikations-Framework.&lt;br /&gt;
* MediaWiki – Die Software hinter Wikipedia, weit verbreitet für offene und Unternehmens-Wikis.&lt;br /&gt;
&lt;br /&gt;
==Integrierte Gesamtlösungen (Monolithen / Frameworks)==&lt;br /&gt;
&#039;&#039;Große, oft modulare Plattformen, die Wissensmanagement in ein umfassenderes System integrieren.&#039;&#039;&lt;br /&gt;
* Drupal mit Opigno &amp;amp; ECA – Content-Management-System Drupal, erweitert um Lernmanagement (Opigno) und Ereignis-Automatisierung (ECA).&lt;br /&gt;
* ILIAS – Open-Source-Lernmanagementsystem (LMS) mit Wissens- und Kursverwaltung, v. a. im Hochschulbereich.&lt;br /&gt;
&lt;br /&gt;
==Wissenszentrierte &amp;amp; Semantische Systeme==&lt;br /&gt;
&#039;&#039;Verbinden klassisches Wiki-Wissen mit semantischen Technologien.&#039;&#039;&lt;br /&gt;
* Semantic MediaWiki (SMW) – Erweiterung für MediaWiki, die Seiteninhalte mit semantischen Annotationen zu einem Wissensgraphen verknüpft.&lt;br /&gt;
&lt;br /&gt;
==Vektordatenbanken==&lt;br /&gt;
&#039;&#039;Speichern und durchsuchen Daten anhand ihrer Vektor-Embeddings – Grundlage vieler RAG-Systeme.&#039;&#039;&lt;br /&gt;
* Milvus – Skalierbare Open-Source-Vektordatenbank für Ähnlichkeitssuche in großen Datenmengen.&lt;br /&gt;
* Weaviate – Open-Source-Vektordatenbank mit integrierter Hybrid-Suche (Vektor + Keyword).&lt;br /&gt;
* Qdrant – Performante Open-Source-Vektor-Suchmaschine, geschrieben in Rust.&lt;br /&gt;
* Chroma – Leichtgewichtige, entwicklerfreundliche Vektordatenbank, beliebt in LLM-Prototypen.&lt;br /&gt;
* Pinecone – Vollständig verwalteter (Cloud-)Vektordatenbank-Dienst.&lt;br /&gt;
&lt;br /&gt;
==Persönliches Wissensmanagement (PKM)==&lt;br /&gt;
&#039;&#039;Werkzeuge für Einzelpersonen zum Vernetzen und Strukturieren persönlicher Notizen.&#039;&#039;&lt;br /&gt;
* Obsidian – Lokal-first-Notiz-App mit verlinkten Markdown-Dateien und Graphenansicht.&lt;br /&gt;
* Logseq – Open-Source-Outliner mit Fokus auf verknüpftes, blockbasiertes Denken (ähnlich Roam Research).&lt;br /&gt;
* Notion – All-in-One-Arbeitsbereich für Notizen, Datenbanken und Wikis.&lt;br /&gt;
* TiddlyWiki – Nicht-lineares, einzeldateibasiertes persönliches Wiki im Browser.&lt;br /&gt;
&lt;br /&gt;
==Enterprise Search / Volltextsuche==&lt;br /&gt;
&#039;&#039;Ermöglichen das schnelle Durchsuchen großer, oft heterogener Datenbestände.&#039;&#039;&lt;br /&gt;
* Elasticsearch – Verteilte Such- und Analyse-Engine auf Basis von Apache Lucene.&lt;br /&gt;
* OpenSearch – Community-Fork von Elasticsearch/Kibana nach der Lizenzänderung.&lt;br /&gt;
* Solr – Etablierte, ebenfalls auf Apache Lucene basierende Suchplattform.&lt;br /&gt;
* Meilisearch – Schnelle, entwicklerfreundliche Open-Source-Suchmaschine mit Relevanz &amp;quot;out of the box&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Agenten- &amp;amp; Orchestrierungs-Frameworks==&lt;br /&gt;
&#039;&#039;Koordinieren mehrere LLM-Aufrufe, Tools oder Agenten zu komplexeren automatisierten Abläufen.&#039;&#039;&lt;br /&gt;
* AutoGen – Microsoft-Framework für Multi-Agenten-Konversationen zur Aufgabenlösung.&lt;br /&gt;
* CrewAI – Framework zur Orchestrierung rollenbasierter KI-Agenten-Teams.&lt;br /&gt;
* Haystack – Framework von deepset für Such- und RAG-Pipelines mit LLMs.&lt;br /&gt;
* n8n – Open-Source-Workflow-Automatisierungstool mit visueller Oberfläche, inkl. KI-Integrationen.&lt;br /&gt;
&lt;br /&gt;
==Taxonomie- &amp;amp; Thesaurus-Management==&lt;br /&gt;
&#039;&#039;Verwalten kontrollierte Vokabulare und Begriffshierarchien zur einheitlichen Verschlagwortung.&#039;&#039;&lt;br /&gt;
* PoolParty – Kommerzielle Plattform für Taxonomie- und Wissensgraph-Management.&lt;br /&gt;
* TopBraid – Enterprise-Plattform für Ontologie-, Taxonomie- und Datenmanagement.&lt;br /&gt;
* SKOS-Tools – Werkzeuge rund um den W3C-Standard SKOS (Simple Knowledge Organization System) für kontrollierte Vokabulare.&lt;br /&gt;
&lt;br /&gt;
==Konversationelle KI / Chatbot-Frameworks==&lt;br /&gt;
&#039;&#039;Ermöglichen den Aufbau dialogbasierter Assistenzsysteme.&#039;&#039;&lt;br /&gt;
* Rasa – Open-Source-Framework für kontextbewusste Chatbots und Sprachassistenten.&lt;br /&gt;
* Botpress – Open-Source-Plattform zum Erstellen und Betreiben von Konversations-Bots.&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Grundbegriffe_Informatik&amp;diff=49</id>
		<title>Grundbegriffe Informatik</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Grundbegriffe_Informatik&amp;diff=49"/>
		<updated>2026-08-15T12:37:52Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Grundbegriffe Informatik==&lt;br /&gt;
* Daten,Variablen und Datentypen&lt;br /&gt;
* Datenstrukturen&lt;br /&gt;
* Modelle&lt;br /&gt;
* Algorithmen und Programmlogik&lt;br /&gt;
===Daten===&lt;br /&gt;
====Wissensbasiertes System====&lt;br /&gt;
=====Die Ebenen der Datenverarbeitung=====&lt;br /&gt;
* Faktendaten (Rohdaten &amp;amp; Information):&lt;br /&gt;
* Repräsentiertes Wissen: Strukturierte Daten, die logische Zusammenhänge, Regeln oder Beziehungen beschreiben&lt;br /&gt;
* Metadaten: Daten über die Daten&lt;br /&gt;
=====Typen von Daten in Wissenssystemen=====&lt;br /&gt;
Je nach Architektur und Einsatzzweck des Systems werden unterschiedliche Datenformen genutzt:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A. Regelbasiertes Wissen (Explizites Wissen)&#039;&#039;&#039;&lt;br /&gt;
* Form: „Wenn–Dann“-Regeln (If-Then-Rules).&lt;br /&gt;
* Anwendung: Klassische Expertensysteme (z. B. in der Medizin oder bei der Fehlerdiagnose).&lt;br /&gt;
* Beispiel: &#039;&#039;Wenn der Fehlercode E-101 auftritt und der Druck &amp;gt; 5 bar ist, dann öffne Ventil B.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;B. Strukturierte Wissensgraphen &amp;amp; Ontologien&#039;&#039;&#039;&lt;br /&gt;
* Form: Entitäten (Knoten) und deren Beziehungen (Kanten).&lt;br /&gt;
* Anwendung: Semantic Web, moderne Wiki-Systeme, Enterprise Search.&lt;br /&gt;
* Beispiel: &#039;&#039;[Ahrensburg] --(ist eine Stadt in)--&amp;gt; [Schleswig-Holstein]&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C. Dokumentenbasiertes / Unstrukturiertes Wissen&#039;&#039;&#039;&lt;br /&gt;
* Form: Volltexte, Markdown-Dateien, PDFs, Quellcode, Wiki-Seiten.&lt;br /&gt;
* Anwendung: Wissensmanagement-Plattformen, Dokumentations-Engines.&lt;br /&gt;
* Besonderheit: Oft kombiniert mit Volltext-Indizes oder Schlagwort-Katalogen zur schnellen Durchsuchbarkeit.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;D. Vektor-Daten (für KI &amp;amp; RAG)&#039;&#039;&#039;&lt;br /&gt;
* Form: Einbettungen (Embeddings) – hochdimensionale numerische Vektoren, die die semantische Bedeutung von Texten darstellen.&lt;br /&gt;
* Anwendung: Modernes LLM-basiertes Wissensmanagement (Retrieval-Augmented Generation / RAG).&lt;br /&gt;
* Vorteil: Ermöglicht die Suche nach Bedeutung und Kontext, nicht nur nach exakten Begriffen.&lt;br /&gt;
===Variable===&lt;br /&gt;
====Speicherarten in menschlichen kognitiven Systemen====&lt;br /&gt;
In der Kognitionswissenschaft unterscheidet man bezüglich des veränderbaren (variablen) Wissens vor allem zwei Speicherformen im Langzeitgedächtnis:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Explizites / Deklaratives Wissen (&amp;quot;Wissen, dass&amp;quot;)&#039;&#039;&#039;&lt;br /&gt;
* Episodisches Gedächtnis: Speichert konkrete, zeitlich gebundene Erlebnisse und Ereignisse (z. B. „Gestern habe ich Thema X unterrichtet&amp;quot;).&lt;br /&gt;
* Semantisches Gedächtnis: Speichert allgemeines, dekontextualisiertes Fakten- und Konzeptwissen (z. B. „Ein Verb beschreibt eine Handlung&amp;quot;). Dieses Netz aus Konzepten passt sich dynamisch an, wenn neue Regeln oder Fakten gelernt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Implizites / Prozedurales Wissen (&amp;quot;Wissen, wie&amp;quot;)&#039;&#039;&#039;&lt;br /&gt;
* Speichert Handlungsabläufe und Fertigkeiten (z. B. Grammatikregeln im Sprachgebrauch anwenden). Es verändert sich schrittweise durch Automatisierung und Praxis.&lt;br /&gt;
&lt;br /&gt;
====Speicherungsarten in technischen/digitalen Systemen (KI &amp;amp; Software)====&lt;br /&gt;
Bei variablen Wissenssystemen in der Informatik unterscheidet man hauptsächlich zwei Speicherebenen:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A) Parameter-Speicher (Parametrisches Wissen)&#039;&#039;&#039;&lt;br /&gt;
* Wie gespeichert? In den mathematischen Verknüpfungen (Gewichten) neuronaler Netze.&lt;br /&gt;
* Variabilität: Ändert sich kontinuierlich während des Trainings oder Fine-Tunings. Einmal trainiert, ist dieses Wissen im laufenden Betrieb jedoch oft starr.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;B) Externe Vektor- und Graphdatenbanken (Non-parametrisches Wissen)&#039;&#039;&#039;&lt;br /&gt;
* Wie gespeichert? Informationen werden als Einbettungen (Vectors) oder als semantische Netze (Knowledge Graphs) in Datenbanken abgelegt.&lt;br /&gt;
* Variabilität: Sehr hoch. Neue Daten können jederzeit hinzugefügt, aktualisiert oder gelöscht werden, ohne das Grundmodell neu zu trainieren (z. B. bei RAG-Systemen – Retrieval-Augmented Generation).&lt;br /&gt;
===Datentypen===&lt;br /&gt;
====1. Primitive / Elementare Datentypen====&lt;br /&gt;
Diese bilden die kleinsten Bausteine jedes Systems:&lt;br /&gt;
* Ganzzahlen (Integer): Diskrete Werte ohne Nachkommastellen (z. B. -42, 0, 1024).&lt;br /&gt;
* Gleitkommazahlen (Float, Double): Reelle Zahlen mit Nachkommastellen (z. B. 3.14159).&lt;br /&gt;
* Wahrheitswerte (Boolean): Binärwerte (true / false bzw. 1 / 0).&lt;br /&gt;
* Zeichen &amp;amp; Zeichenketten (Char, String): Textdaten (z. B. &amp;quot;Wissensgraph&amp;quot;).&lt;br /&gt;
* Datum &amp;amp; Zeit (Date, Timestamp): Zeitstempel zur zeitlichen Einordnung von Wissen.&lt;br /&gt;
&lt;br /&gt;
====2. Strukturierte &amp;amp; Komplexe Datentypen====&lt;br /&gt;
Dienen dazu, mehrere Datenpunkte logisch miteinander zu verknüpfen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Datentyp !! Beschreibung !! Beispiel / Anwendungsfall&lt;br /&gt;
|-&lt;br /&gt;
| Listen / Arrays || Geordnete Reihenfolge von Elementen || [1, 2, 3, 5, 8]&lt;br /&gt;
|-&lt;br /&gt;
| Schlüssel-Wert-Paare (Maps / Dictionaries) || Zuordnung von eindeutigen Keys zu Werten || {&amp;quot;Titel&amp;quot;: &amp;quot;Artikel&amp;quot;, &amp;quot;Autor&amp;quot;: &amp;quot;Max&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
| Sätze (Sets) || Ungeordnete Mengen ohne Duplikate || {Rot, Grün, Blau}&lt;br /&gt;
|-&lt;br /&gt;
| JSON / BSON || Hierarchisch strukturierte Dokumente || Ideal für semi-strukturierte Wissenseinträge&lt;br /&gt;
|-&lt;br /&gt;
| Blob / Binary || Unstrukturierte Binärdaten || Bilder, Audio-Dateien, Dokumente&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====3. Semantische Datentypen (Wissensrepräsentation)====&lt;br /&gt;
In modernen Wissenssystemen (z. B. RDF, OWL, Knowledge Graphs) gehen Datentypen über rein technische Formate hinaus und beschreiben Bedeutung und Beziehungen:&lt;br /&gt;
* Entitäten / Ressourcen (URIs/IRIs): Eindeutige Identifikatoren für Objekte, Personen oder Konzepte (z. B. http://example.org/person/Thorsten).&lt;br /&gt;
* Literale: Konkrete Werte, die an Entitäten hängen (oft kombiniert mit XML-Schema-Datentypen wie xsd:string oder xsd:dateTime).&lt;br /&gt;
* Relational- / Kanten-Typen (Predicates): Beschreiben die Art der Beziehung zwischen zwei Entitäten (z. B. istAutorVon, gehörtZuKategorie).&lt;br /&gt;
* Vektoren (Embeddings): Dichte numerische Vektoren, die von KI-Modellen und Vektordatenbanken verwendet werden, um semantische Ähnlichkeit zwischen Texten oder Konzepten abzubilden.&lt;br /&gt;
&lt;br /&gt;
===Datenstrukturen===&lt;br /&gt;
Wissenssysteme (Knowledge Management Systems, Wissensdatenbanken) nutzen je nach Einsatzzweck, Flexibilität und Abfragesprache ganz unterschiedliche Datenstrukturen. Hier ist eine Übersicht der wichtigsten Strukturen – von einfach und unstrukturiert bis hin zu hochkomplex und semantisch vernetzt:&lt;br /&gt;
&lt;br /&gt;
====1. Unstrukturierte &amp;amp; Hierarchische Strukturen====&lt;br /&gt;
&#039;&#039;&#039;Flat Files / Plain Text (Markdown, Wikitext)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Daten liegen in einfachen Textdateien vor (oft mit Frontmatter für Metadaten).&lt;br /&gt;
* Vorteile: Extrem schnell, versionierbar (z. B. via Git), zukunftssicher und ohne Datenbank-Overhead.&lt;br /&gt;
* Einsatz: Static Site Generators (Hugo, Jekyll), moderne Notiz-Systeme (Obsidian, Logseq), flache Dokumentationen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Baumstrukturen &amp;amp; Taxonomien&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Hierarchische Anordnung in Ordnern, Kategorien oder Unterkategorien (Eltern-Kind-Beziehungen).&lt;br /&gt;
* Vorteile: Intuitive Navigation für Menschen, klar abgegrenzte Themenbereiche.&lt;br /&gt;
* Einsatz: Klassische Dateisysteme, Firmen-Wikis, Inhaltsverzeichnisse.&lt;br /&gt;
&lt;br /&gt;
====2. Strukturierte &amp;amp; Relationale Datenstrukturen====&lt;br /&gt;
&#039;&#039;&#039;Relationale Datenbanken (SQL)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Tabellen mit festem Schema, Primär- und Fremdschlüsseln (z. B. PostgreSQL, MySQL).&lt;br /&gt;
* Vorteile: Hohe Datenintegrität (ACID-Konformität), ausgereifte Abfragesprachen, hervorragend für strukturierte Metadaten.&lt;br /&gt;
* Einsatz: Klassische Enterprise-CMS (Drupal, TYPO3), Lernplattformen (Moodle), MediaWiki.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dokumentenorientierte Datenbanken (NoSQL)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Speicherung in semi-strukturierten Formaten wie JSON, BSON oder XML.&lt;br /&gt;
* Vorteile: Flexibles Schema, einfache Skalierbarkeit, schnelle Entwicklung bei sich ändernden Datenmodellen.&lt;br /&gt;
* Einsatz: MongoDB, CouchDB, dynamische Wissensplattformen.&lt;br /&gt;
&lt;br /&gt;
====3. Semantische &amp;amp; Vernetzte Strukturen (Graph-basiert)====&lt;br /&gt;
&#039;&#039;&#039;Eigenschaftsgraphen (Property Graphs)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Knoten (Entitäten) und Kanten (Beziehungen) tragen Schlüssel-Wert-Paare (Attributes).&lt;br /&gt;
* Vorteile: Abfrage von komplexen, tief verschachtelten Zusammenhängen ohne teure SQL-JOINs.&lt;br /&gt;
* Einsatz: Neo4j, Memgraph, Wissensnetze, Empfehlungsdienste.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RDF-Tripel / Semantisches Web (Knowledge Graphs)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Wissen wird in Form von Aussagen-Tripeln gespeichert: Subjekt → Prädikat → Objekt (z. B. „Ahrensburg → liegtIn → Schleswig-Holstein&amp;quot;).&lt;br /&gt;
* Vorteile: Standardisiert (W3C, SPARQL, OWL), erlaubt automatische logische Schlussfolgerungen (Inferenz).&lt;br /&gt;
* Einsatz: Wikidata, DBpedia, Semantic MediaWiki, ontologiebasierte Expertensysteme.&lt;br /&gt;
&lt;br /&gt;
====4. Moderne &amp;amp; Vektorbasierte Strukturen====&lt;br /&gt;
&#039;&#039;&#039;Vektordatenbanken (Embeddings)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Texte oder Objekte werden durch Machine-Learning-Modelle in hochdimensionale Vektoren (Zahlenreihen) umgewandelt.&lt;br /&gt;
* Vorteile: Ermöglicht semantische Suche (Suche nach Bedeutung statt nach exakten Stichwörtern) und Retrieval-Augmented Generation (RAG).&lt;br /&gt;
* Einsatz: Pinecone, Qdrant, Chroma, pgvector für KI-Assistenten und LLM-Erweiterungen.&lt;br /&gt;
===Modelle===&lt;br /&gt;
Während die vorigen Abschnitte einzelne Daten, Datentypen und Datenstrukturen behandeln, beschreibt ein &#039;&#039;&#039;Modell&#039;&#039;&#039; das übergeordnete Ordnungsprinzip, nach dem ganze Wissensbestände organisiert werden. Die folgenden sieben Modelle sind die in der Praxis dominierenden Ansätze, von einfach bis hochformal.&lt;br /&gt;
&lt;br /&gt;
====1. Hierarchisches / Baum-Modell (Tree / Folder Model)====&lt;br /&gt;
* Prinzip: Ordnung über verschachtelte Ordner, Kategorien oder Seitenbäume (Eltern-Kind-Beziehung).&lt;br /&gt;
* Typischer Einsatz: Klassische CMS, Dateisysteme, Notiz-Apps (wie Notion, Confluence).&lt;br /&gt;
* Vorteil: Intuitive Bedienung, klare Navigation.&lt;br /&gt;
* Nachteil: Wissen lässt sich oft nicht eindeutig einem Fachbereich zuordnen (Problem der eierlegenden Wollmilchsau).&lt;br /&gt;
&lt;br /&gt;
====2. Flaches Modell mit Metadaten &amp;amp; Tags (Flat / Key-Value Model)====&lt;br /&gt;
* Prinzip: Alle Dokumente liegen auf einer Ebene (&amp;quot;Flat-File&amp;quot;) und werden über Schlagwörter (Tags), Taxonomien oder Key-Value-Eigenschaften charakterisiert.&lt;br /&gt;
* Typischer Einsatz: Flat-File CMS (z. B. Grav, Kirby), statische Wissensdatenbanken (Markdown-basiert mit Frontmatter).&lt;br /&gt;
* Vorteil: Keine starre Ordnerstruktur, hochgradig durchsuchbar, extrem einfach zu sichern/versionieren (z. B. mit Git).&lt;br /&gt;
* Nachteil: Ohne disziplinierte Verschlagwortung geht die Übersicht schnell verloren.&lt;br /&gt;
&lt;br /&gt;
====3. Relationales Datenmodell (Relational Model / SQL)====&lt;br /&gt;
* Prinzip: Wissen wird in zusammenhängenden Tabellen (Entitäten, Attribute, Fremdschlüssel) strukturiert.&lt;br /&gt;
* Typischer Einsatz: Enterprise-Wikis, Moodle/LMS, strukturierte Unternehmensdatenbanken.&lt;br /&gt;
* Vorteil: Hohe Datenintegrität, komplexe Abfragen über Fremdschlüssel und Tabellenverknüpfungen möglich.&lt;br /&gt;
* Nachteil: Starres Schema; Schemaänderungen bei sich veränderndem Wissen sind aufwendig.&lt;br /&gt;
&lt;br /&gt;
====4. Netzwerk- / Graphen-Modell (Graph Model)====&lt;br /&gt;
* Prinzip: Daten bestehen aus Knoten (Entitäten/Dokumenten) und Kanten (Beziehungen).&lt;br /&gt;
* Typischer Einsatz: Personal Knowledge Management (z. B. Obsidian, Roam Research), Graph-Datenbanken (Neo4j).&lt;br /&gt;
* Vorteil: Spiegelt vernetztes Denken wider. Beziehungen wie &#039;&#039;[Projekt X] --hängt ab von--&amp;gt; [Technologie Y]&#039;&#039; sind native Bestandteile der Datenbank.&lt;br /&gt;
* Nachteil: Schwer zu visualisieren/navigieren bei sehr großen Datenmengen ohne gute Filter.&lt;br /&gt;
&lt;br /&gt;
====5. Semantisches / Triples-Modell (RDF / Knowledge Graph)====&lt;br /&gt;
* Prinzip: Wissen wird in formallogischen Aussagen aus Subjekt – Prädikat – Objekt (Triples) gespeichert (z. B. &#039;&#039;[MediaWiki] [verwendet] [PostgreSQL]&#039;&#039;).&lt;br /&gt;
* Typischer Einsatz: Semantic MediaWiki, Wikidata, Ontologie-Systeme (OWL, RDF/SPARQL).&lt;br /&gt;
* Vorteil: Maschinenlesbar, erlaubt automatische logische Rückschlüsse (Inferenz) und komplexe semantische Abfragen.&lt;br /&gt;
* Nachteil: Hohe Einarbeitungszeit und formale Komplexität beim Erstellen der Ontologien.&lt;br /&gt;
&lt;br /&gt;
====6. Dokumentenorientiertes Modell (NoSQL / JSON)====&lt;br /&gt;
* Prinzip: Ein Wissenselement ist ein eigenständiges, strukturiertes Dokument (z. B. JSON/YAML), das eingebettete Attribute und Arrays enthält.&lt;br /&gt;
* Typischer Einsatz: CouchDB, MongoDB, elasticsearch-basierte Wissensspeicher.&lt;br /&gt;
* Vorteil: Flexibles Schema; jedes Dokument kann individuelle Felder haben, ohne das Gesamtsystem zu blockieren.&lt;br /&gt;
* Nachteil: Redundanzen bei Datenbanksicherungen, schwächere Konsistenzprüfungen als bei SQL.&lt;br /&gt;
&lt;br /&gt;
====7. Vektorraum-Modell (Embedding / Latent Space Model)====&lt;br /&gt;
* Prinzip: Wissen wird nicht symbolisch, sondern als Position in einem hochdimensionalen Vektorraum repräsentiert; semantische Nähe entspricht geometrischer Nähe (siehe auch [[#Vektor-Daten (für KI &amp;amp; RAG)|Vektor-Daten]] weiter oben).&lt;br /&gt;
* Typischer Einsatz: Retrieval-Augmented Generation (RAG), semantische Suche, Empfehlungssysteme (Pinecone, Qdrant, pgvector).&lt;br /&gt;
* Vorteil: Findet Zusammenhänge über Bedeutung statt exakter Begriffe, robust gegenüber Synonymen und unscharfen Anfragen.&lt;br /&gt;
* Nachteil: Nicht direkt interpretierbar (&amp;quot;Black Box&amp;quot;), keine expliziten Regeln oder Beziehungen wie im Graphen-Modell.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; In der Praxis werden diese Modelle selten pur eingesetzt, sondern kombiniert – dieses Wiki selbst ist ein Beispiel: Es nutzt eine Baumstruktur (Modell 1, über die `==`/`===`-Überschriften), liegt aber als flache, versionierte Textdatei vor (Modell 2).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Nr. !! Modell !! Kernprinzip !! Größter Vorteil !! Größter Nachteil&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Hierarchisch (Baum) || Eltern-Kind-Verschachtelung || Intuitive Navigation || Eindeutige Einordnung oft unmöglich&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Flach mit Tags || Ebene Dateien + Metadaten || Einfach, git-versionierbar || Erfordert Tagging-Disziplin&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Relational (SQL) || Tabellen + Fremdschlüssel || Hohe Datenintegrität || Starres Schema&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Graph (Property Graph) || Knoten + Kanten || Bildet vernetztes Denken ab || Schwer visualisierbar bei großer Skala&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Semantisch (RDF/Triples) || Subjekt–Prädikat–Objekt || Maschinelle Inferenz möglich || Hoher Formalisierungsaufwand&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Dokumentenorientiert (NoSQL) || Eigenständige JSON-Dokumente || Flexibles Schema || Schwächere Konsistenzprüfung&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Vektorraum (Embeddings) || Position im semantischen Raum || Suche nach Bedeutung statt Begriff || Nicht direkt interpretierbar&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Algorithmen und Programmlogik===&lt;br /&gt;
Wenn es darum geht, Algorithmen und Programmlogik bildhaft, strukturiert oder regelbasiert darzustellen, unterscheidet man zwischen visuellen Repräsentationsformen (zur Dokumentation und Planung) und formalen Wissenssystemen (zur automatischen Verarbeitung).&lt;br /&gt;
&lt;br /&gt;
====1. Visuelle Wissenssysteme &amp;amp; Graphische Modelle====&lt;br /&gt;
Diese Systeme helfen Entwicklern und Lernenden, die Logik eines Programms unabhängig von einer konkreten Programmiersprache zu visualisieren.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! System / Modell !! Einsatzbereich !! Besonderheit / Logikbausteine&lt;br /&gt;
|-&lt;br /&gt;
| Nassi-Shneiderman-Diagramm (Struktogramm) || Strukturierte Programmierung, Lehre &amp;amp; Didaktik || Vermeidet Unordnung (kein Pfeilsalat). Basiert auf Sequenz, Auswahl (If-Else) und Wiederholung (Schleifen).&lt;br /&gt;
|-&lt;br /&gt;
| Programmablaufplan (PAP) / Flowchart || Prozessvisualisierung, technische Abläufe || Klassisches Flussdiagramm (DIN 66001) mit Pfeilen, Rauten für Entscheidungen und Rechtecken für Aktionen.&lt;br /&gt;
|-&lt;br /&gt;
| UML-Aktivitätsdiagramm || Software-Engineering, objektorientiertes Design || Standard in der Industrie. Zeigt komplexe Kontroll- und Datenflüsse inklusive paralleler Verzweigungen.&lt;br /&gt;
|-&lt;br /&gt;
| Entscheidungstabellen || Komplexe Geschäftslogik &amp;amp; Regelwerke || Stellt alle möglichen Bedingungen und daraus resultierende Aktionen in Tabellenform gegenüber.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====2. Formale &amp;amp; Regelbasierte Wissenssysteme====&lt;br /&gt;
Diese Systeme dienen nicht nur der Visualisierung, sondern führen Programmlogik und Regeln direkt aus:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Regelbasierte Systeme &amp;amp; Expertensysteme&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Wissen wird in Form von Fakten und Logikregeln (WENN Bedingung DANN Aktion) gespeichert. Eine Inferenzmaschine (Inference Engine) wertet diese Logik aus.&lt;br /&gt;
* Beispiele:&lt;br /&gt;
** Prolog: Deklarative Programmierung basierend auf Prädikatenlogik.&lt;br /&gt;
** Drools / Business Rules Engines: Für komplexe Geschäftsregeln im Unternehmensumfeld.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pseudocode &amp;amp; Algorithmen-Markup&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Eine strukturierte, halbsprachliche Beschreibung von Logik. Er kombiniert natürliche Sprache mit Elementen höherer Programmiersprachen.&lt;br /&gt;
* Vorteil: Unabhängig von Syntaxfehlern und konzentriert auf das reine Problemlösungsmuster.&lt;br /&gt;
&lt;br /&gt;
====3. MediaWiki als Referenzimplementierung====&lt;br /&gt;
Ein echtes MediaWiki (die Software hinter Wikipedia) setzt praktisch alle in diesem Wiki beschriebenen Modelle gleichzeitig um – nur an unterschiedlichen Stellen der Architektur:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Speicherung (Modell 3 Relational + Modell 6 Dokumentenorientiert)&#039;&#039;&#039;&lt;br /&gt;
* Jede Seite ist ein Dokument (Wikitext-Blob), die Metadaten drumherum sind relational organisiert.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tabelle !! Inhalt&lt;br /&gt;
|-&lt;br /&gt;
| page || Titel, Namespace, Status je Seite&lt;br /&gt;
|-&lt;br /&gt;
| revision || Jede Version einer Seite (Autor, Zeitstempel) – die Versionierung&lt;br /&gt;
|-&lt;br /&gt;
| text / slots || Der eigentliche Wikitext-Blob – unstrukturiert, wie ein Dokument&lt;br /&gt;
|-&lt;br /&gt;
| page_props || Frei erweiterbare Key-Value-Metadaten pro Seite&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Struktur der Überschriften (Modell 1 Baum – nur optisch)&#039;&#039;&#039;&lt;br /&gt;
* `==`, `===`, `====` erzeugen keine echte Baumstruktur in der Datenbank, sondern werden zur Laufzeit nur zu einem Inhaltsverzeichnis (`&amp;lt;h2&amp;gt;`, `&amp;lt;h3&amp;gt;`, …) mit Anchor-Links geparst.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kategorien &amp;amp; Links (Modell 4 Graph + Modell 2 Flach/Tags)&#039;&#039;&#039;&lt;br /&gt;
* Intern ist MediaWiki ein Graph, kein Baum: die Tabelle `pagelinks` speichert, wer auf wen verlinkt (`[[Ziel]]`), `categorylinks`, welche Seite zu welcher Kategorie gehört, `templatelinks`, welche Seite welche Vorlage einbindet.&lt;br /&gt;
* Kategorien funktionieren wie Tags (flach + Metadaten), erlauben durch Verschachtelung aber auch baumartige Navigation – eine Seite kann in mehreren Kategorien gleichzeitig stehen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Semantik (Modell 5 RDF/Triples)&#039;&#039;&#039;&lt;br /&gt;
* Nicht Core-MediaWiki, sondern die Extension Semantic MediaWiki (SMW): Annotationen wie `[[liegt in::Schleswig-Holstein]]` werden zu echten RDF-Tripeln (Subjekt–Prädikat–Objekt), abgelegt in eigenen SQL-Tabellen und exportierbar als RDF/OWL. `ASK`-Abfragen (SPARQL-ähnlich) werden damit direkt im Wikitext möglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Algorithmen/Programmlogik im Wiki selbst&#039;&#039;&#039;&lt;br /&gt;
* ParserFunctions-Extension: `{{#if: Bedingung | Dann | Sonst}}`, `{{#switch: ... }}` – die praktische Umsetzung des „WENN Bedingung DANN Aktion&amp;quot;-Regelsystems, direkt im Wikitext ausführbar.&lt;br /&gt;
* Scribunto (Lua-Module): vollwertige Programmlogik innerhalb von Vorlagen – die Inferenzmaschine für Fälle, die ParserFunctions nicht mehr abbilden.&lt;br /&gt;
* Templates (`{{Vorlage|Parameter}}`): parametrisierter Pseudocode – wiederverwendbare Logikbausteine, die beim Rendern expandiert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Suche (Modell 7 Vektorraum, meist als Erweiterung)&#039;&#039;&#039;&lt;br /&gt;
* Core-MediaWiki bietet nur einfache Volltextsuche. Für semantische/Vektorsuche braucht es Extensions wie CirrusSearch (Elasticsearch) oder KI-gestützte Erweiterungen mit Embeddings – nativ ist das nicht vorgesehen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kurz zusammengefasst als Pipeline:&#039;&#039;&#039;&lt;br /&gt;
* Wikitext (Dokument, Modell 6) → Parser/Präprozessor (Templates/Scribunto = Algorithmen) → HTML-Rendering (Baum-Optik, Modell 1) → gespeichert in relationaler DB (Modell 3) → verknüpft über pagelinks/categorylinks (Graph, Modell 4; Tags, Modell 2) → optional angereichert um SMW-Tripel (Modell 5) und Suchindex/Embeddings (Modell 7).&lt;br /&gt;
&lt;br /&gt;
====4. XWiki als weiteres Beispiel====&lt;br /&gt;
XWiki (Java-basiert) verfolgt einen anderen Architekturansatz als MediaWiki und deckt die Modelle an anderen Stellen ab – vor allem, weil Struktur und Daten dort von Anfang an enger verzahnt sind:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Speicherung (Modell 3 Relational + Modell 6 Dokumentenorientiert, aber enger verzahnt)&#039;&#039;&#039;&lt;br /&gt;
* Über Hibernate ORM auf einer relationalen DB (standardmäßig) abgelegt. Jede Seite (`XWikiDocument`) ist zwar ein Dokument, trägt aber – anders als bei MediaWiki – strukturierte Daten direkt eingebettet statt nur als loser Freitext-Blob.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Echte Hierarchie (Modell 1 Baum, nicht nur optisch)&#039;&#039;&#039;&lt;br /&gt;
* XWiki-Seiten leben in verschachtelten Spaces (`Space.SubSpace.Seite`) – eine tatsächliche Baumstruktur in der Datenbank, kein bloß optisches Inhaltsverzeichnis wie bei MediaWikis `==`-Überschriften. Navigation und Rechteverwaltung (Berechtigungen vererben sich space-weise) folgen dieser echten Hierarchie.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;XClass / XObject – das Kernfeature (Modell 3 Relational, nativ statt per Extension)&#039;&#039;&#039;&lt;br /&gt;
* Jede Seite kann strukturierte, typisierte Datensätze (XObjects) tragen, deren Schema in einer XClass definiert ist – im Grunde eine pro Seite eingebettete Tabellenzeile mit festem Schema (Felder, Typen, Pflichtfelder).&lt;br /&gt;
* Damit sind Wissenseinträge gleichzeitig Dokument (Freitext) und Datensatz (strukturierte Felder) – MediaWiki braucht dafür die Extension Semantic MediaWiki, XWiki hat das nativ im Core.&lt;br /&gt;
* Abfragen darüber laufen über XWQL (XWiki Query Language, HQL/JPQL-artig) – SQL-ähnliche Abfragen direkt über die Wissensbasis, ohne SPARQL-Umweg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Algorithmen/Programmlogik im Wiki selbst&#039;&#039;&#039;&lt;br /&gt;
* Velocity- und Groovy-Skripte direkt in Seiten eingebettet (`#if()`, `#foreach()`, `$doc.getObject(...)`) – vollwertige Programmlogik, näher an einer richtigen Skriptsprache als MediaWikis ParserFunctions.&lt;br /&gt;
* Wiki-Makros (ähnlich Templates) kapseln wiederverwendbare Logik, können aber – weil Java-basiert – auch komplexe Berechnungen und Datenbankzugriffe direkt ausführen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Suche&#039;&#039;&#039;&lt;br /&gt;
* Solr/Lucene-basierte Volltext- und Facettensuche ist im Core enthalten (kein Extension-Zwang wie CirrusSearch bei MediaWiki); neuere Erweiterungen ergänzen KI-gestützte/semantische Suche mit Embeddings.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kurzvergleich MediaWiki vs. XWiki:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Aspekt !! MediaWiki !! XWiki&lt;br /&gt;
|-&lt;br /&gt;
| Hierarchie || Optisch über Überschriften, echte Struktur nur via Kategorien (Graph) || Echte verschachtelte Space-Baumstruktur&lt;br /&gt;
|-&lt;br /&gt;
| Strukturierte Daten (Modell 3/5) || Nur per Extension (Semantic MediaWiki) || Nativ im Core (XClass/XObject)&lt;br /&gt;
|-&lt;br /&gt;
| Abfragesprache || SMW-ASK (SPARQL-ähnlich, Extension) || XWQL (SQL-ähnlich, Core)&lt;br /&gt;
|-&lt;br /&gt;
| Programmlogik || ParserFunctions/Scribunto (Lua) || Velocity/Groovy (Java-Ökosystem)&lt;br /&gt;
|-&lt;br /&gt;
| Typischer Einsatz || Große offene Wissensdatenbanken (Wikipedia) || Unternehmens-Intranets mit strukturierten Formularen/Workflows&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====5. Beispiel: KI &amp;amp; RAG-Wissenssystem====&lt;br /&gt;
Ein modernes RAG-System (Retrieval-Augmented Generation) verfolgt einen grundlegend anderen Ansatz als MediaWiki und XWiki: Statt Wissen über explizite Struktur (Baum, Kategorien, XClass) zu ordnen, wird es über semantische Nähe im Vektorraum (Modell 7) auffindbar gemacht – die Struktur der vorigen Beispiele fehlt hier größtenteils.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Speicherung (Modell 7 Vektorraum + Modell 6 Dokumentenorientiert)&#039;&#039;&#039;&lt;br /&gt;
* Quelldokumente (Wiki-Seiten, PDFs, Markdown) werden in Chunks zerlegt und über ein Embedding-Modell in hochdimensionale Vektoren umgewandelt.&lt;br /&gt;
* Abgelegt in einer Vektordatenbank (Pinecone, Qdrant, Chroma, pgvector) – meist zusammen mit dem Originaltext als Payload/Metadaten, also weiterhin dokumentbasiert im Hintergrund.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Struktur (keine echte Hierarchie – Gegenteil von Modell 1)&#039;&#039;&#039;&lt;br /&gt;
* Es gibt keinen Seitenbaum und keine Kategorien wie bei MediaWiki/XWiki. Auffindbarkeit entsteht rein durch geometrische Nähe im Vektorraum, nicht durch Navigation oder Verlinkung.&lt;br /&gt;
* Optional wird das mit einem Graph (Modell 4, „GraphRAG&amp;quot;) oder mit Metadaten-Filtern (Modell 2, Tags) kombiniert, um reine Vektorsuche zu verbessern.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Algorithmen/Programmlogik – die eigentliche RAG-Pipeline&#039;&#039;&#039;&lt;br /&gt;
* Anfrage (Query) → Embedding der Anfrage → Ähnlichkeitssuche (z. B. Cosinus-Ähnlichkeit) in der Vektordatenbank → Top-k relevante Chunks abrufen → Re-Ranking (optional) → Chunks als Kontext in den Prompt einfügen → LLM generiert Antwort.&lt;br /&gt;
* Das ist funktional das Gegenstück zur „Inferenzmaschine&amp;quot; der regelbasierten Systeme (Abschnitt 2): statt fester WENN-DANN-Regeln wertet hier ein neuronales Netz statistische Ähnlichkeit aus – nicht deterministisch, sondern approximativ.&lt;br /&gt;
* Agenten-Frameworks (LangChain, LlamaIndex) übernehmen die Rolle von Templates/Makros: wiederverwendbare, parametrisierte Ablaufbausteine für Retrieval, Re-Ranking und Prompt-Konstruktion.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Semantik (implizit statt explizit – Gegenteil von Modell 5)&#039;&#039;&#039;&lt;br /&gt;
* Anders als RDF-Tripel (Subjekt–Prädikat–Objekt, explizit und maschinenlesbar) ist die „Semantik&amp;quot; eines Embeddings nicht symbolisch, sondern eine gelernte, nicht direkt interpretierbare Position im Vektorraum („Black Box&amp;quot;, vgl. Modell 7 im Abschnitt „Modelle&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Suche (Modell 7 nativ statt Extension)&#039;&#039;&#039;&lt;br /&gt;
* Semantische Suche ist hier kein Zusatzfeature (wie CirrusSearch bei MediaWiki), sondern der gesamte Zweck des Systems.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Erweiterter Kurzvergleich:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Aspekt !! MediaWiki !! XWiki !! RAG-System&lt;br /&gt;
|-&lt;br /&gt;
| Hierarchie || Optisch + Kategorien (Graph) || Echte Space-Baumstruktur || Keine – nur Vektor-Nähe (optional + Graph/Tags)&lt;br /&gt;
|-&lt;br /&gt;
| Strukturierte Daten || Nur per Extension (SMW) || Nativ (XClass/XObject) || Keine feste Struktur, nur Chunks + Embeddings&lt;br /&gt;
|-&lt;br /&gt;
| Abfrage || SMW-ASK / Volltext || XWQL / Volltext || Vektor-Ähnlichkeitssuche (semantisch)&lt;br /&gt;
|-&lt;br /&gt;
| Programmlogik || ParserFunctions/Scribunto || Velocity/Groovy || Retrieval-Pipeline + LLM (LangChain/LlamaIndex)&lt;br /&gt;
|-&lt;br /&gt;
| Ergebnis-Charakter || Deterministisch, nachvollziehbar || Deterministisch, nachvollziehbar || Approximativ, nicht immer nachvollziehbar&lt;br /&gt;
|-&lt;br /&gt;
| Typischer Einsatz || Große offene Wissensdatenbanken || Unternehmens-Intranets mit Formularen/Workflows || KI-Assistenten, semantische Suche über große Dokumentenmengen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====6. Obsidian als Beispiel für ein natives Graph-Modell====&lt;br /&gt;
Obsidian schließt eine Lücke der bisherigen Beispiele: Es braucht überhaupt keinen Server und keine Datenbank – die Graph-Struktur (Modell 4) entsteht rein client-seitig aus einfachen Textdateien.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Speicherung (Modell 2 Flach + Modell 6 Dokumentenorientiert, ohne jede Datenbank)&#039;&#039;&#039;&lt;br /&gt;
* Jede Notiz ist eine einzelne Markdown-Datei im lokalen Dateisystem (kein MySQL, kein Hibernate, keine Vektordatenbank) – die radikalste Umsetzung von Modell 2 (Flat File) unter allen fünf Beispielen.&lt;br /&gt;
* Metadaten liegen als YAML-Frontmatter direkt in der Datei (ähnlich einer sehr leichtgewichtigen XClass, aber ohne erzwungenes Schema).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Struktur (Modell 4 Graph, nativ und zentral statt Zusatzfeature)&#039;&#039;&#039;&lt;br /&gt;
* Verlinkung erfolgt über `[[Wikilinks]]` direkt im Text. Anders als bei MediaWikis `pagelinks`-Tabelle gibt es keine zentrale Datenbank dafür – der Graph wird beim Öffnen des Vaults aus allen Dateien neu aufgebaut (lokaler Index).&lt;br /&gt;
* Backlinks (eingehende Verweise) werden automatisch berechnet und in der Graph View visualisiert – der Graph ist hier das Kernprodukt, nicht ein Abfallprodukt der Struktur wie bei MediaWiki/XWiki.&lt;br /&gt;
* Es gibt bewusst keine erzwungene Hierarchie (Modell 1): Ordner sind rein organisatorisch, die eigentliche Navigation läuft über Links und Backlinks.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Algorithmen/Programmlogik im Wiki selbst&#039;&#039;&#039;&lt;br /&gt;
* Dataview-Plugin: eine eigene Abfragesprache (DQL, an SQL angelehnt, bzw. JS-basiert), die Frontmatter-Felder über alle Notizen hinweg wie eine Tabelle abfragt – funktional näher an XWQL als an MediaWikis ParserFunctions.&lt;br /&gt;
* Templater-Plugin: JavaScript-Templates für dynamische Notiz-Erstellung (Datumslogik, Platzhalter, bedingte Textbausteine) – das WENN-DANN aus Abschnitt 2, aber clientseitig in JS statt serverseitig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Semantik (Modell 5 nur rudimentär, kein echtes RDF)&#039;&#039;&#039;&lt;br /&gt;
* Frontmatter-Properties (`status: draft`, `tags: [...]`) sind einfache Key-Value-Paare, keine typisierten Tripel wie bei Semantic MediaWiki. Es gibt keine Inferenzmaschine – Schlussfolgerungen (z. B. „alle Notizen mit Tag X, die auf Y verlinken&amp;quot;) müssen über Dataview-Abfragen nachgebaut werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Suche&#039;&#039;&#039;&lt;br /&gt;
* Lokaler Volltextindex, rein clientseitig. Semantische/Vektorsuche (Modell 7) ist nur über Community-Plugins (z. B. Smart Connections) nachrüstbar, nicht im Core.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vollständiger Kurzvergleich:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Aspekt !! MediaWiki !! XWiki !! RAG-System !! Obsidian&lt;br /&gt;
|-&lt;br /&gt;
| Backend || Server + relationale DB || Server + relationale DB (Hibernate) || Server + Vektordatenbank || Kein Server, lokale Dateien&lt;br /&gt;
|-&lt;br /&gt;
| Hierarchie || Optisch + Kategorien (Graph) || Echte Space-Baumstruktur || Keine – nur Vektor-Nähe || Keine – nur Ordner (kosmetisch) + Graph&lt;br /&gt;
|-&lt;br /&gt;
| Strukturierte Daten || Nur per Extension (SMW) || Nativ (XClass/XObject) || Keine feste Struktur (Chunks) || YAML-Frontmatter (informell, kein Schema)&lt;br /&gt;
|-&lt;br /&gt;
| Abfrage || SMW-ASK / Volltext || XWQL / Volltext || Vektor-Ähnlichkeitssuche || Dataview (DQL) / Volltext&lt;br /&gt;
|-&lt;br /&gt;
| Programmlogik || ParserFunctions/Scribunto || Velocity/Groovy || Retrieval-Pipeline + LLM || Templater (JavaScript)&lt;br /&gt;
|-&lt;br /&gt;
| Typischer Einsatz || Große offene Wissensdatenbanken || Unternehmens-Intranets mit Formularen/Workflows || KI-Assistenten, semantische Suche || Persönliches Wissensmanagement (PKM)&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Wissenssysteme_%26_Tools_im_%C3%9Cberblick&amp;diff=48</id>
		<title>Wissenssysteme &amp; Tools im Überblick</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Wissenssysteme_%26_Tools_im_%C3%9Cberblick&amp;diff=48"/>
		<updated>2026-08-15T12:36:06Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: Die Seite wurde neu angelegt: „ ==Klassische Regelsysteme &amp;amp; Inferenz (Rule Engines)== &amp;#039;&amp;#039;Systeme, die Wissen als Wenn-Dann-Regeln abbilden und daraus automatisch Schlussfolgerungen (Inferenz) ableiten.&amp;#039;&amp;#039; * CLIPS – In C entwickeltes, produktionsregelbasiertes Expertensystem-Toolkit, seit den 1980ern u. a. von der NASA genutzt. * Drools (KIE Community) – Java-basierte Business-Rules-Management-Engine mit Rete-Algorithmus, Teil der KIE-Plattform. * Pyke / Experta (Python) – Python-Bi…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Klassische Regelsysteme &amp;amp; Inferenz (Rule Engines)==&lt;br /&gt;
&#039;&#039;Systeme, die Wissen als Wenn-Dann-Regeln abbilden und daraus automatisch Schlussfolgerungen (Inferenz) ableiten.&#039;&#039;&lt;br /&gt;
* CLIPS – In C entwickeltes, produktionsregelbasiertes Expertensystem-Toolkit, seit den 1980ern u. a. von der NASA genutzt.&lt;br /&gt;
* Drools (KIE Community) – Java-basierte Business-Rules-Management-Engine mit Rete-Algorithmus, Teil der KIE-Plattform.&lt;br /&gt;
* Pyke / Experta (Python) – Python-Bibliotheken für regelbasierte Wissensverarbeitung mit Vorwärtsverkettung (Forward Chaining).&lt;br /&gt;
&lt;br /&gt;
==Wissensgraphen &amp;amp; Ontologien (Semantic Web)==&lt;br /&gt;
&#039;&#039;Modellieren Wissen als vernetzte Graphen aus Entitäten und Beziehungen, oft nach Semantic-Web-Standards wie RDF/OWL.&#039;&#039;&lt;br /&gt;
* Apache Jena – Java-Framework zum Erstellen und Abfragen RDF-basierter Wissensgraphen mit SPARQL-Unterstützung.&lt;br /&gt;
* Protégé – Open-Source-Editor der Stanford University zum Erstellen und Bearbeiten von Ontologien (OWL/RDF).&lt;br /&gt;
* Neo4j (Community Edition) – Weit verbreitete native Graphdatenbank mit der Abfragesprache Cypher.&lt;br /&gt;
* Memgraph – In-Memory-Graphdatenbank, kompatibel mit Cypher, optimiert für Echtzeit-Graphanalysen.&lt;br /&gt;
&lt;br /&gt;
==Moderne KI-gestützte Wissenssysteme (RAG &amp;amp; Vektorsuche)==&lt;br /&gt;
&#039;&#039;Kombinieren große Sprachmodelle mit externen Wissensquellen über Retrieval-Augmented Generation (RAG).&#039;&#039;&lt;br /&gt;
* Dify – Low-Code-Plattform zum Erstellen von LLM-Anwendungen inkl. RAG-Pipelines und Agenten.&lt;br /&gt;
* RAGFlow – Open-Source-Engine speziell für RAG-Workflows mit tiefem Dokumentenverständnis.&lt;br /&gt;
* Onyx – Open-Source-Plattform für unternehmensweite KI-Suche und Chat über eigene Datenquellen (vormals Danswer).&lt;br /&gt;
* LlamaIndex – Framework zur Verbindung von LLMs mit strukturierten und unstrukturierten Datenquellen (Indexierung/Retrieval).&lt;br /&gt;
* LangChain – Framework zum Verketten von LLM-Aufrufen, Tools und Datenquellen zu komplexen Anwendungen.&lt;br /&gt;
* Ollama – Tool zum lokalen Ausführen und Verwalten von Open-Source-LLMs.&lt;br /&gt;
* LocalAI – Open-Source-Alternative zur OpenAI-API für lokal gehostete Sprachmodelle.&lt;br /&gt;
&lt;br /&gt;
==Dokumentenbasiertes Wissensmanagement (Wikis &amp;amp; Docs)==&lt;br /&gt;
&#039;&#039;Klassische Werkzeuge zum Erfassen, Strukturieren und gemeinsamen Bearbeiten von Wissen in Textform.&#039;&#039;&lt;br /&gt;
* Wiki.js – Modernes, Node.js-basiertes Wiki-System mit Markdown-Unterstützung und ansprechender Oberfläche.&lt;br /&gt;
* Outline – Team-Wiki/Wissensdatenbank mit Fokus auf schnelle Suche und modernes Design.&lt;br /&gt;
* XWiki – Erweiterbare Open-Source-Wiki-Plattform mit eigenem Applikations-Framework.&lt;br /&gt;
* MediaWiki – Die Software hinter Wikipedia, weit verbreitet für offene und Unternehmens-Wikis.&lt;br /&gt;
&lt;br /&gt;
==Integrierte Gesamtlösungen (Monolithen / Frameworks)==&lt;br /&gt;
&#039;&#039;Große, oft modulare Plattformen, die Wissensmanagement in ein umfassenderes System integrieren.&#039;&#039;&lt;br /&gt;
* Drupal mit Opigno &amp;amp; ECA – Content-Management-System Drupal, erweitert um Lernmanagement (Opigno) und Ereignis-Automatisierung (ECA).&lt;br /&gt;
* ILIAS – Open-Source-Lernmanagementsystem (LMS) mit Wissens- und Kursverwaltung, v. a. im Hochschulbereich.&lt;br /&gt;
&lt;br /&gt;
==Wissenszentrierte &amp;amp; Semantische Systeme==&lt;br /&gt;
&#039;&#039;Verbinden klassisches Wiki-Wissen mit semantischen Technologien.&#039;&#039;&lt;br /&gt;
* Semantic MediaWiki (SMW) – Erweiterung für MediaWiki, die Seiteninhalte mit semantischen Annotationen zu einem Wissensgraphen verknüpft.&lt;br /&gt;
&lt;br /&gt;
==Vektordatenbanken==&lt;br /&gt;
&#039;&#039;Speichern und durchsuchen Daten anhand ihrer Vektor-Embeddings – Grundlage vieler RAG-Systeme.&#039;&#039;&lt;br /&gt;
* Milvus – Skalierbare Open-Source-Vektordatenbank für Ähnlichkeitssuche in großen Datenmengen.&lt;br /&gt;
* Weaviate – Open-Source-Vektordatenbank mit integrierter Hybrid-Suche (Vektor + Keyword).&lt;br /&gt;
* Qdrant – Performante Open-Source-Vektor-Suchmaschine, geschrieben in Rust.&lt;br /&gt;
* Chroma – Leichtgewichtige, entwicklerfreundliche Vektordatenbank, beliebt in LLM-Prototypen.&lt;br /&gt;
* Pinecone – Vollständig verwalteter (Cloud-)Vektordatenbank-Dienst.&lt;br /&gt;
&lt;br /&gt;
==Persönliches Wissensmanagement (PKM)==&lt;br /&gt;
&#039;&#039;Werkzeuge für Einzelpersonen zum Vernetzen und Strukturieren persönlicher Notizen.&#039;&#039;&lt;br /&gt;
* Obsidian – Lokal-first-Notiz-App mit verlinkten Markdown-Dateien und Graphenansicht.&lt;br /&gt;
* Logseq – Open-Source-Outliner mit Fokus auf verknüpftes, blockbasiertes Denken (ähnlich Roam Research).&lt;br /&gt;
* Notion – All-in-One-Arbeitsbereich für Notizen, Datenbanken und Wikis.&lt;br /&gt;
* TiddlyWiki – Nicht-lineares, einzeldateibasiertes persönliches Wiki im Browser.&lt;br /&gt;
&lt;br /&gt;
==Enterprise Search / Volltextsuche==&lt;br /&gt;
&#039;&#039;Ermöglichen das schnelle Durchsuchen großer, oft heterogener Datenbestände.&#039;&#039;&lt;br /&gt;
* Elasticsearch – Verteilte Such- und Analyse-Engine auf Basis von Apache Lucene.&lt;br /&gt;
* OpenSearch – Community-Fork von Elasticsearch/Kibana nach der Lizenzänderung.&lt;br /&gt;
* Solr – Etablierte, ebenfalls auf Apache Lucene basierende Suchplattform.&lt;br /&gt;
* Meilisearch – Schnelle, entwicklerfreundliche Open-Source-Suchmaschine mit Relevanz &amp;quot;out of the box&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Agenten- &amp;amp; Orchestrierungs-Frameworks==&lt;br /&gt;
&#039;&#039;Koordinieren mehrere LLM-Aufrufe, Tools oder Agenten zu komplexeren automatisierten Abläufen.&#039;&#039;&lt;br /&gt;
* AutoGen – Microsoft-Framework für Multi-Agenten-Konversationen zur Aufgabenlösung.&lt;br /&gt;
* CrewAI – Framework zur Orchestrierung rollenbasierter KI-Agenten-Teams.&lt;br /&gt;
* Haystack – Framework von deepset für Such- und RAG-Pipelines mit LLMs.&lt;br /&gt;
* n8n – Open-Source-Workflow-Automatisierungstool mit visueller Oberfläche, inkl. KI-Integrationen.&lt;br /&gt;
&lt;br /&gt;
==Taxonomie- &amp;amp; Thesaurus-Management==&lt;br /&gt;
&#039;&#039;Verwalten kontrollierte Vokabulare und Begriffshierarchien zur einheitlichen Verschlagwortung.&#039;&#039;&lt;br /&gt;
* PoolParty – Kommerzielle Plattform für Taxonomie- und Wissensgraph-Management.&lt;br /&gt;
* TopBraid – Enterprise-Plattform für Ontologie-, Taxonomie- und Datenmanagement.&lt;br /&gt;
* SKOS-Tools – Werkzeuge rund um den W3C-Standard SKOS (Simple Knowledge Organization System) für kontrollierte Vokabulare.&lt;br /&gt;
&lt;br /&gt;
==Konversationelle KI / Chatbot-Frameworks==&lt;br /&gt;
&#039;&#039;Ermöglichen den Aufbau dialogbasierter Assistenzsysteme.&#039;&#039;&lt;br /&gt;
* Rasa – Open-Source-Framework für kontextbewusste Chatbots und Sprachassistenten.&lt;br /&gt;
* Botpress – Open-Source-Plattform zum Erstellen und Betreiben von Konversations-Bots.&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Hauptseite&amp;diff=47</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Hauptseite&amp;diff=47"/>
		<updated>2026-08-15T12:34:22Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;br /&gt;
== Grundaufbau eines Wissensmanagement-Systems ==&lt;br /&gt;
Die folgenden Bausteine beschreiben kein klassisches CMS für Blog-Artikel, sondern ein &#039;&#039;&#039;Wissensmanagement-System (Wiki-artig)&#039;&#039;&#039;: Im Mittelpunkt steht nicht die einzelne Seite, sondern das Netz aus Wissensartikeln, ihren Verknüpfungen und ihrer Auffindbarkeit. Entsprechend rücken Taxonomie, Verlinkung und Suche stärker in den Vordergrund als bei einem reinen Content-Ausgabe-System.&lt;br /&gt;
&lt;br /&gt;
== Hauptbausteine im Detail ==&lt;br /&gt;
&lt;br /&gt;
=== [[Data Engine]] ([[Wissensmodell]] &amp;amp;  [[Speicherung]]) ===&lt;br /&gt;
Das Herzstück des Systems. Es definiert, wie Wissensartikel und ihre Beziehungen abgelegt werden:&lt;br /&gt;
* Entwickler-Entscheidung: Monolithisches Datenmodell (feste Tabellen für articles, categories, tags) oder flexibles Schema (JSONB / EAV-Muster für benutzerdefinierte Wissens-Typen wie Glossareinträge, How-Tos, FAQs).&lt;br /&gt;
* Taxonomie als Kernbestandteil: Eigene Tabellen für Kategorien, Tags und Artikel-Artikel-Relationen (Verlinkungen), nicht nur für den Inhalt selbst.&lt;br /&gt;
* Mandantenfähigkeit / Multi-Tenancy (optional): Trennung von Daten per tenant_id-Spalte oder separaten Datenbankschemas.&lt;br /&gt;
* Datenbank: Relationale Datenbanken wie PostgreSQL bieten mit JSON-Unterstützung volle Flexibilität bei hoher Integrität – wichtig, da Wissensartikel oft variable Zusatzfelder benötigen.&lt;br /&gt;
&lt;br /&gt;
=== Content &amp;amp; Routing Layer (Wissensartikel-Verwaltung &amp;amp; URLs) ===&lt;br /&gt;
Verantwortlich für das Laden und Rendern von Wissensartikeln für Nutzer:&lt;br /&gt;
* Slug-Mapping: Zuordnung von lesbaren Pfaden (/wiki/rust-cms-guide) zu Datenbank-Einträgen.&lt;br /&gt;
* Status &amp;amp; Versionierung: Artikel besitzen Zustände (draft, published, archived) sowie eine Revisions-Historie – bei einem Wissenssystem meist zentraler als bei einem Blog, da Artikel fortlaufend gepflegt statt einmalig veröffentlicht werden.&lt;br /&gt;
* Rendering:&lt;br /&gt;
** Server-Side Rendering (SSR): HTML wird direkt über eine Template-Engine (z. B. Askama, Tera) gerendert.&lt;br /&gt;
** Headless (API): Ausgabe von JSON für entkoppelte Frontends.&lt;br /&gt;
&lt;br /&gt;
=== Wissensverknüpfung &amp;amp; Taxonomie (Knowledge Graph) ===&lt;br /&gt;
Das eigentliche Unterscheidungsmerkmal eines Wissenssystems gegenüber einem reinen CMS – Wissen entsteht durch Verknüpfung, nicht nur durch einzelne Artikel:&lt;br /&gt;
* Wiki-Links &amp;amp; Backlinks: Erkennung von Verweisen zwischen Artikeln (z. B. &amp;lt;nowiki&amp;gt;[[Artikelname]]&amp;lt;/nowiki&amp;gt;-Syntax) sowie automatische Rückverfolgung, welche Artikel auf einen bestimmten Artikel verlinken.&lt;br /&gt;
* Kategorien &amp;amp; Tags: Hierarchische und flache Klassifizierung von Wissensartikeln zur Navigation und Filterung.&lt;br /&gt;
* Verwandte Artikel: Automatische oder manuelle Vorschläge thematisch ähnlicher Artikel (z. B. über gemeinsame Tags oder Verlinkungsdichte).&lt;br /&gt;
* Glossar &amp;amp; Begriffsdefinitionen: Zentrale Verwaltung wiederkehrender Fachbegriffe, die aus Artikeltexten heraus verlinkt werden können.&lt;br /&gt;
&lt;br /&gt;
=== Authentication &amp;amp; Authorization (Sicherheit) ===&lt;br /&gt;
Trennt den öffentlichen Bereich vom Verwaltungsbereich:&lt;br /&gt;
* Authentifizierung: Identitätsprüfung von Benutzern (z. B. Session-Cookies oder JWT-Tokens).&lt;br /&gt;
* Rechteverwaltung (RBAC): Rollenbasierte Zugriffskontrolle (z. B. Admin, Editor, Author), um festzulegen, wer welche Endpunkte oder Inhalte bearbeiten darf.&lt;br /&gt;
&lt;br /&gt;
=== Media Manager (Dateiverwaltung) ===&lt;br /&gt;
Verwaltet Bilder, PDFs und sonstige Uploads:&lt;br /&gt;
* Upload-Pipeline: Empfang von Dateien, Prüfung von MIME-Types und Dateigrößen.&lt;br /&gt;
* Verarbeitung: Automatische Skalierung oder Konvertierung von Bildern (z. B. Erzeugung von WebP-Thumbnails).&lt;br /&gt;
* Storage: Speicherung auf dem lokalen Dateisystem oder in einem Object-Storage (S3/MinIO).&lt;br /&gt;
&lt;br /&gt;
=== Admin Backend (Verwaltungsoberfläche) ===&lt;br /&gt;
Die Benutzeroberfläche für Redakteure:&lt;br /&gt;
* Rich-Text / Markdown Editor: Eingabeoberfläche für Inhalte.&lt;br /&gt;
* REST / gRPC / GraphQL API: Kommuniziert mit dem Backend, um Inhalte, Einstellungen, Benutzer und Medien zu verwalten.&lt;br /&gt;
&lt;br /&gt;
=== Caching &amp;amp; Performance Layer ===&lt;br /&gt;
Verhindert unnötige Datenbankabfragen bei hoher Last:&lt;br /&gt;
* HTTP-Caching: Passende Header (Cache-Control, ETag) für Nginx oder CDNs.&lt;br /&gt;
* In-Memory Caching: Zwischenspeichern von zusammengestellten Seiten oder Datenbank-Ergebnissen (z. B. über In-Memory-Stores oder Redis).&lt;br /&gt;
&lt;br /&gt;
=== Search &amp;amp; Discovery (Suche) ===&lt;br /&gt;
In einem Wissenssystem oft der wichtigste Einstiegspunkt überhaupt – Nutzer suchen gezielt nach Antworten statt zu stöbern:&lt;br /&gt;
* DB-native Suche: Volltextsuche über PostgreSQL tsvector/tsquery, ausreichend für kleinere bis mittlere Datenmengen.&lt;br /&gt;
* Externer Suchindex: Bei höheren Anforderungen an Relevanz und Performance Anbindung an Meilisearch, Typesense oder Elasticsearch.&lt;br /&gt;
* Facettierung &amp;amp; Filter: Eingrenzung nach Kategorie, Tag, Datum oder Autor.&lt;br /&gt;
&lt;br /&gt;
=== SEO &amp;amp; Metadata ===&lt;br /&gt;
Sorgt dafür, dass Inhalte von Suchmaschinen korrekt erfasst werden:&lt;br /&gt;
* Meta-Tags &amp;amp; Open Graph: Pro Inhalt konfigurierbare Title-, Description- und Social-Preview-Daten.&lt;br /&gt;
* Sitemap &amp;amp; Robots: Automatisch generierte sitemap.xml und robots.txt.&lt;br /&gt;
* Kanonische URLs &amp;amp; Redirects: Vermeidung von Duplicate Content, Verwaltung von 301-Weiterleitungen bei Slug-Änderungen.&lt;br /&gt;
&lt;br /&gt;
=== Plugin- &amp;amp; Extension-System ===&lt;br /&gt;
Erlaubt es, Funktionalität ohne Eingriff in den Core zu erweitern:&lt;br /&gt;
* Hooks &amp;amp; Events: Definierte Erweiterungspunkte (z. B. before_publish, after_upload), an denen Plugins andocken können.&lt;br /&gt;
* Middleware-Ketten: Zusätzliche Verarbeitungsschritte in Request/Response-Pipeline einschiebbar.&lt;br /&gt;
&lt;br /&gt;
=== Background Jobs / Task Queue ===&lt;br /&gt;
Verlagert zeitintensive Arbeiten aus dem Request-Zyklus:&lt;br /&gt;
* Queue-Anbindung: Asynchrone Verarbeitung über Redis-basierte Queues oder tokio-Task-Runner.&lt;br /&gt;
* Typische Jobs: Bildkonvertierung, E-Mail-Versand, Sitemap-Neubau, Webhook-Zustellung.&lt;br /&gt;
* Retry &amp;amp; Fehlerbehandlung: Wiederholungslogik und Dead-Letter-Handling bei fehlgeschlagenen Jobs.&lt;br /&gt;
&lt;br /&gt;
=== Internationalisierung (i18n / l10n) ===&lt;br /&gt;
Unterstützt mehrsprachige Inhalte und Oberflächen:&lt;br /&gt;
* Mehrsprachige Inhalte: Übersetzungsstatus pro Sprache und Content-Objekt.&lt;br /&gt;
* Locale-Routing: Sprachspezifische Pfade (/de/…, /en/…) oder Subdomains.&lt;br /&gt;
* UI-Übersetzung: Lokalisierte Texte im Admin Backend.&lt;br /&gt;
&lt;br /&gt;
=== Notifications &amp;amp; E-Mail ===&lt;br /&gt;
Kommuniziert Systemereignisse an Nutzer und Redakteure:&lt;br /&gt;
* Transaktionale Mails: Passwort-Reset, Einladungen, Kommentar-Benachrichtigungen.&lt;br /&gt;
* Workflow-Benachrichtigungen: Hinweise bei Freigabe-Anfragen oder Statuswechseln von Inhalten.&lt;br /&gt;
&lt;br /&gt;
=== Audit-Log &amp;amp; Monitoring ===&lt;br /&gt;
Schafft Nachvollziehbarkeit und Betriebssicherheit:&lt;br /&gt;
* Audit-Log: Protokollierung, wer wann welche Änderung vorgenommen hat (Compliance, Nachvollziehbarkeit).&lt;br /&gt;
* Monitoring &amp;amp; Tracing: Metriken, Logs und Fehlerreporting für den laufenden Betrieb (z. B. über OpenTelemetry).&lt;br /&gt;
&lt;br /&gt;
=== Konfigurationsmanagement ===&lt;br /&gt;
Zentrale Steuerung systemweiter Einstellungen:&lt;br /&gt;
* Site-Settings: Globale Konfiguration wie Seitenname, Standardsprache, Zeitzone.&lt;br /&gt;
* Feature-Flags: Kontrolliertes Ein-/Ausschalten einzelner Funktionen ohne Redeploy.&lt;br /&gt;
&lt;br /&gt;
=== Deployment &amp;amp; Infrastructure ===&lt;br /&gt;
Betrifft Betrieb und Wartbarkeit des Systems:&lt;br /&gt;
* Migrations-Tooling: Versionierte Datenbank-Migrationen (z. B. via sqlx oder refinery).&lt;br /&gt;
* CI/CD: Automatisierte Tests und Deployments.&lt;br /&gt;
* Backup-Strategie: Regelmäßige Sicherung von Datenbank und Medien-Storage.&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Grundbegriffe Informatik]]&lt;br /&gt;
* [[Weiter]]&lt;br /&gt;
* [[Wissenssysteme &amp;amp; Tools im Überblick]]&lt;br /&gt;
&lt;br /&gt;
==Hinweis==&lt;br /&gt;
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Weiter&amp;diff=46</id>
		<title>Weiter</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Weiter&amp;diff=46"/>
		<updated>2026-08-15T09:36:37Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: Die Seite wurde neu angelegt: „Im Open-Source-Bereich gibt es eine breite Palette an ausgereiften Wissensmanagement- und Wiki-Systemen für das Self-Hosting. Je nach Struktur, gewünschter Benutzeroberfläche und Speicherbackend lassen sie sich in verschiedene Kategorien einteilen  ==Moderne Wissensdatenbanken (Notion- &amp;amp; Confluence-Alternativen)== All-in-one-Arbeitsbereiche mit Seiten, Datenbanken und Blöcken – ersetzen Notion/Confluence im Self-Hosting.  ==Entwicklerfreundliche &amp;amp; M…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Im Open-Source-Bereich gibt es eine breite Palette an ausgereiften Wissensmanagement- und Wiki-Systemen für das Self-Hosting. Je nach Struktur, gewünschter Benutzeroberfläche und Speicherbackend lassen sie sich in verschiedene Kategorien einteilen&lt;br /&gt;
&lt;br /&gt;
==Moderne Wissensdatenbanken (Notion- &amp;amp; Confluence-Alternativen)==&lt;br /&gt;
All-in-one-Arbeitsbereiche mit Seiten, Datenbanken und Blöcken – ersetzen Notion/Confluence im Self-Hosting.&lt;br /&gt;
&lt;br /&gt;
==Entwicklerfreundliche &amp;amp; Markdown-fokussierte Wikis==&lt;br /&gt;
Wikis, die primär mit Markdown arbeiten und sich vor allem an Entwickler-Teams richten.&lt;br /&gt;
* &#039;&#039;&#039;Wiki.js&#039;&#039;&#039; – Modernes Wiki mit Markdown-Editor, Git-Sync, feingranularer Rechteverwaltung und Node.js-Backend.&lt;br /&gt;
&lt;br /&gt;
===Docs-as-Code-Generatoren===&lt;br /&gt;
Statische Seitengeneratoren, die Dokumentation aus Markdown-Dateien im Git-Repo erzeugen – Inhalte werden wie Code versioniert und reviewed.&lt;br /&gt;
* &#039;&#039;&#039;MkDocs mit Material-Theme&#039;&#039;&#039; – Python-basierter statischer Doku-Generator mit populärem, stark anpassbarem Material-Design-Theme.&lt;br /&gt;
* &#039;&#039;&#039;Docusaurus&#039;&#039;&#039; – React-basierter Doku-Generator von Meta, stark bei Versionierung und Mehrsprachigkeit.&lt;br /&gt;
* &#039;&#039;&#039;Astro Starlight&#039;&#039;&#039; – Doku-Theme auf Basis von Astro, sehr performant durch minimales JavaScript im Browser.&lt;br /&gt;
* &#039;&#039;&#039;VitePress&#039;&#039;&#039; – Vite-basierter, schneller statischer Seitengenerator, häufig für Vue-/JS-Projektdokumentationen genutzt.&lt;br /&gt;
* &#039;&#039;&#039;mdBook&#039;&#039;&#039; – Rust-Tool zum Erstellen von Büchern/Dokus aus Markdown, bekannt aus der offiziellen Rust-Dokumentation.&lt;br /&gt;
&lt;br /&gt;
===Klassische Wiki-Engines===&lt;br /&gt;
Traditionelle, datenbankgestützte Wiki-Software mit eigener Syntax und Weboberfläche.&lt;br /&gt;
* &#039;&#039;&#039;MediaWiki&#039;&#039;&#039; – Software hinter Wikipedia, sehr mächtig und erweiterbar, aber vergleichsweise aufwändig im Betrieb.&lt;br /&gt;
* &#039;&#039;&#039;DokuWiki&#039;&#039;&#039; – Dateibasiertes Wiki ganz ohne Datenbank, dadurch einfach zu hosten und zu sichern.&lt;br /&gt;
* &#039;&#039;&#039;XWiki&#039;&#039;&#039; – Enterprise-Wiki mit Anwendungs-Baukasten für strukturierte Daten, Formulare und Skripting.&lt;br /&gt;
&lt;br /&gt;
==Vernetztes Wissen &amp;amp; Personal Knowledge Management (PKM)==&lt;br /&gt;
Tools für vernetzte Notizen mit bidirektionalen Links, Backlinks und Graph-Ansicht – Fokus auf persönliches statt Team-Wissen.&lt;br /&gt;
* &#039;&#039;&#039;SilverBullet&#039;&#039;&#039; – Web-basiertes Markdown-Notizsystem mit eingebauter Automatisierung/Scripting.&lt;br /&gt;
* &#039;&#039;&#039;Joplin&#039;&#039;&#039; – Open-Source-Notiz-App mit Ende-zu-Ende-Verschlüsselung und Sync, Alternative zu Evernote.&lt;br /&gt;
* &#039;&#039;&#039;Logseq&#039;&#039;&#039; – Outliner-basiertes PKM-Tool mit Backlinks und Graph-Ansicht, ähnlich Roam Research.&lt;br /&gt;
&lt;br /&gt;
==Git-basierte Wikis==&lt;br /&gt;
Wikis, die Inhalte direkt in einem Git-Repository speichern statt in einer Datenbank.&lt;br /&gt;
* &#039;&#039;&#039;Gollum&#039;&#039;&#039; – Einfaches Wiki, das direkt auf einem Git-Repo aufsetzt; jede Seite ist eine Datei im Repo.&lt;br /&gt;
&lt;br /&gt;
==KI- &amp;amp; RAG-basierte Expertensysteme (Fokus: Eigene Dokumente abfragen)==&lt;br /&gt;
Anwendungen, die eigene Dokumente per Retrieval-Augmented Generation (RAG) durchsuchbar und per Chat befragbar machen.&lt;br /&gt;
* &#039;&#039;&#039;AnythingLLM&#039;&#039;&#039; – All-in-one-RAG-App mit UI, Nutzerverwaltung und Anbindung an lokale oder Cloud-LLMs.&lt;br /&gt;
* &#039;&#039;&#039;Open WebUI&#039;&#039;&#039; – Chat-Oberfläche für lokale LLMs (z. B. über Ollama), inkl. Dokumenten-RAG und Multi-User-Betrieb.&lt;br /&gt;
* &#039;&#039;&#039;Dify&#039;&#039;&#039; – Low-Code-Plattform zum Bauen von LLM-Apps und RAG-Workflows mit visuellem Editor.&lt;br /&gt;
&lt;br /&gt;
==Vektordatenbanken (Semantische Suche)==&lt;br /&gt;
Speichern Text als Vektor-Embeddings, damit inhaltlich ähnliche statt nur wortgleiche Treffer gefunden werden – Grundlage jedes RAG-Systems.&lt;br /&gt;
* &#039;&#039;&#039;Qdrant&#039;&#039;&#039; – Performante Vektordatenbank in Rust, beliebt für RAG-Projekte, guter Hybrid-Search-Support.&lt;br /&gt;
* &#039;&#039;&#039;ChromaDB&#039;&#039;&#039; – Leichtgewichtige, einfach einzurichtende Vektordatenbank, oft für Prototypen genutzt.&lt;br /&gt;
* &#039;&#039;&#039;Milvus&#039;&#039;&#039; – Skalierbare Vektordatenbank für sehr große Datenmengen, produktionsreif für Enterprise-Einsatz.&lt;br /&gt;
* &#039;&#039;&#039;pgvector&#039;&#039;&#039; – PostgreSQL-Erweiterung für Vektorsuche – praktisch, wenn ohnehin schon Postgres im Einsatz ist.&lt;br /&gt;
&lt;br /&gt;
==Content-Management-Systeme (CMS)==&lt;br /&gt;
Systeme zur Verwaltung und Veröffentlichung von Webinhalten (Seiten, Artikel, Medien) mit Redaktionsworkflows.&lt;br /&gt;
&lt;br /&gt;
===Klassische CMS===&lt;br /&gt;
* &#039;&#039;&#039;Drupal&#039;&#039;&#039; – Sehr flexibles, aber komplexeres CMS mit feingranularer Rechteverwaltung, stark bei großen strukturierten Websites.&lt;br /&gt;
&lt;br /&gt;
==LLM-Inferenz==&lt;br /&gt;
Software zum lokalen Ausführen von Sprachmodellen (Inference) – die Grundlage für alle self-hosted KI-Anwendungen.&lt;br /&gt;
* &#039;&#039;&#039;Ollama&#039;&#039;&#039; – Einfachste Möglichkeit, offene LLMs lokal laufen zu lassen; CLI + API, riesige Modellbibliothek.&lt;br /&gt;
* &#039;&#039;&#039;llama.cpp&#039;&#039;&#039; – Effiziente C/C++-Inferenz-Engine für LLMs, läuft auch auf schwacher Hardware/CPU.&lt;br /&gt;
* &#039;&#039;&#039;vLLM&#039;&#039;&#039; – Hochperformante Inferenz-Engine für Produktionseinsatz mit hohem Durchsatz (Batching, PagedAttention).&lt;br /&gt;
* &#039;&#039;&#039;LM Studio&#039;&#039;&#039; – Desktop-App mit GUI zum Herunterladen und Ausführen lokaler Modelle, einsteigerfreundlich.&lt;br /&gt;
* &#039;&#039;&#039;LocalAI&#039;&#039;&#039; – OpenAI-API-kompatible, self-hosted Inferenz-Lösung für Text-, Bild- und Audio-Modelle.&lt;br /&gt;
* &#039;&#039;&#039;text-generation-webui&#039;&#039;&#039; – Web-Oberfläche für lokale LLMs mit vielen Erweiterungen (Gradio-basiert).&lt;br /&gt;
&lt;br /&gt;
===Agenten-optimierte Open-Source-Modelle===&lt;br /&gt;
Offene Sprachmodelle, die gezielt auf Tool-Calling/Function-Calling und Agenten-Verhalten trainiert wurden.&lt;br /&gt;
* &#039;&#039;&#039;Nous Hermes 3 / Hermes 2 Pro&#039;&#039;&#039; – Fine-Tunes von Llama/Mistral, stark bei strukturierten Funktionsaufrufen.&lt;br /&gt;
* &#039;&#039;&#039;Qwen2.5-Coder / Qwen-Agent&#039;&#039;&#039; – Alibabas Modellreihe, sehr gut bei Code und Agenten-Workflows.&lt;br /&gt;
* &#039;&#039;&#039;Mistral Small / NeMo&#039;&#039;&#039; – Kompakte, function-calling-fähige Modelle mit guter Geschwindigkeit-Qualitäts-Balance.&lt;br /&gt;
&lt;br /&gt;
==Autonome KI-Agenten-Systeme==&lt;br /&gt;
Systeme, die selbstständig Teilziele planen und iterativ verfolgen, statt nur auf einzelne Prompts zu antworten.&lt;br /&gt;
* &#039;&#039;&#039;AutoGPT&#039;&#039;&#039; – Einer der ersten autonomen Agenten, zerlegt ein Ziel eigenständig in Teilaufgaben.&lt;br /&gt;
* &#039;&#039;&#039;BabyAGI&#039;&#039;&#039; – Minimalistischer autonomer Task-Agent mit Prioritätswarteschlange für Teilaufgaben.&lt;br /&gt;
* &#039;&#039;&#039;SuperAGI&#039;&#039;&#039; – Framework/Plattform zum Bauen und Verwalten mehrerer autonomer Agenten mit UI.&lt;br /&gt;
* &#039;&#039;&#039;Letta (MemGPT)&#039;&#039;&#039; – Agenten-Framework mit Fokus auf persistentem Langzeitgedächtnis über Sitzungen hinweg.&lt;br /&gt;
* &#039;&#039;&#039;CAMEL-AI&#039;&#039;&#039; – Framework für Multi-Agenten-Kommunikation (&amp;quot;Agenten reden miteinander&amp;quot;), gut für Simulationen.&lt;br /&gt;
&lt;br /&gt;
==Autonome Coding-/Content-Agenten (Claude-Code-Alternativen)==&lt;br /&gt;
Agenten, die eigenständig Code schreiben, Dateien bearbeiten und Aufgaben im Terminal/Editor ausführen – vergleichbar mit Claude Code.&lt;br /&gt;
* &#039;&#039;&#039;Aider&#039;&#039;&#039; – CLI-Pair-Programming-Agent mit Git-Integration, funktioniert mit lokalen oder API-LLMs.&lt;br /&gt;
* &#039;&#039;&#039;Cline&#039;&#039;&#039; – Autonomer Coding-Agent als VS-Code-Extension, open source, unterstützt lokale Modelle.&lt;br /&gt;
* &#039;&#039;&#039;Continue.dev&#039;&#039;&#039; – Open-Source-Coding-Assistent/Agent, self-hostbar mit eigenem LLM-Backend.&lt;br /&gt;
* &#039;&#039;&#039;SWE-agent&#039;&#039;&#039; – Agent für vollständige Software-Engineering-Aufgaben, von Issue bis fertigem Pull Request.&lt;br /&gt;
* &#039;&#039;&#039;Devika&#039;&#039;&#039; – Open-Source-Alternative zu &amp;quot;Devin&amp;quot;, autonomer Multi-Step-Coding-Agent.&lt;br /&gt;
* &#039;&#039;&#039;GPT Engineer&#039;&#039;&#039; – Generiert aus einer Prompt-Beschreibung eine komplette Codebasis.&lt;br /&gt;
* &#039;&#039;&#039;OpenHands&#039;&#039;&#039; – Autonomer Agent für Coding- und allgemeine Computeraufgaben (früher OpenDevin).&lt;br /&gt;
&lt;br /&gt;
==Agenten-Frameworks==&lt;br /&gt;
Bibliotheken/Plattformen zum Orchestrieren mehrerer Agenten, Tools und Workflow-Schritten.&lt;br /&gt;
* &#039;&#039;&#039;LangGraph&#039;&#039;&#039; – Graph-basiertes Framework (von LangChain) für zustandsbehaftete, komplexe Agenten-Workflows.&lt;br /&gt;
* &#039;&#039;&#039;CrewAI&#039;&#039;&#039; – Framework für rollenbasierte Multi-Agenten-Teams (&amp;quot;Crew&amp;quot; aus spezialisierten Agenten).&lt;br /&gt;
* &#039;&#039;&#039;AutoGen / AG2&#039;&#039;&#039; – Microsofts Framework für Multi-Agenten-Konversationen und Tool-Nutzung.&lt;br /&gt;
* &#039;&#039;&#039;n8n&#039;&#039;&#039; – No-Code-Workflow-Automatisierung mit KI-Knoten, verbindet Agenten mit hunderten Diensten.&lt;br /&gt;
* &#039;&#039;&#039;Flowise&#039;&#039;&#039; – Visueller Low-Code-Builder für LLM-/RAG-/Agenten-Flows per Drag &amp;amp; Drop.&lt;br /&gt;
&lt;br /&gt;
==Embedding- &amp;amp; Reranking-Modelle==&lt;br /&gt;
Modelle, die Text in Vektoren umwandeln (Embedding) bzw. Suchtreffer nach Relevanz neu sortieren (Reranking) – notwendig, damit RAG gute Treffer liefert.&lt;br /&gt;
* &#039;&#039;&#039;nomic-embed-text&#039;&#039;&#039; – Offenes, leistungsstarkes Embedding-Modell, gängiger Standard mit Ollama.&lt;br /&gt;
* &#039;&#039;&#039;bge-m3&#039;&#039;&#039; – Multilingual fähiges Embedding-Modell mit Unterstützung für sehr lange Texte.&lt;br /&gt;
* &#039;&#039;&#039;e5-mistral&#039;&#039;&#039; – Auf Mistral basierendes Embedding-Modell mit starker Retrieval-Qualität.&lt;br /&gt;
* &#039;&#039;&#039;bge-reranker&#039;&#039;&#039; – Sortiert erste Suchtreffer per Cross-Encoder nach tatsächlicher Relevanz neu.&lt;br /&gt;
* &#039;&#039;&#039;Jina Reranker&#039;&#039;&#039; – Alternative Reranking-Modellreihe von Jina AI, ebenfalls Cross-Encoder-basiert.&lt;br /&gt;
&lt;br /&gt;
==Evaluation &amp;amp; Monitoring==&lt;br /&gt;
Tools zum Messen, ob RAG-/Agenten-Antworten korrekt, relevant und halluzinationsfrei sind, sowie zum Nachverfolgen von LLM-Aufrufen im Betrieb.&lt;br /&gt;
* &#039;&#039;&#039;Langfuse&#039;&#039;&#039; – Open-Source-Observability-Plattform für LLM-Anwendungen (Traces, Kosten, Prompt-Versionen).&lt;br /&gt;
* &#039;&#039;&#039;Ragas&#039;&#039;&#039; – Framework speziell zur automatisierten Bewertung von RAG-Pipelines (Relevanz, Treue, Vollständigkeit).&lt;br /&gt;
* &#039;&#039;&#039;Phoenix (Arize)&#039;&#039;&#039; – Open-Source-Tool zur Analyse und Visualisierung von LLM-Traces und Embedding-Räumen.&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Hauptseite&amp;diff=45</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Hauptseite&amp;diff=45"/>
		<updated>2026-08-15T09:36:28Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;br /&gt;
== Grundaufbau eines Wissensmanagement-Systems ==&lt;br /&gt;
Die folgenden Bausteine beschreiben kein klassisches CMS für Blog-Artikel, sondern ein &#039;&#039;&#039;Wissensmanagement-System (Wiki-artig)&#039;&#039;&#039;: Im Mittelpunkt steht nicht die einzelne Seite, sondern das Netz aus Wissensartikeln, ihren Verknüpfungen und ihrer Auffindbarkeit. Entsprechend rücken Taxonomie, Verlinkung und Suche stärker in den Vordergrund als bei einem reinen Content-Ausgabe-System.&lt;br /&gt;
&lt;br /&gt;
== Hauptbausteine im Detail ==&lt;br /&gt;
&lt;br /&gt;
=== [[Data Engine]] ([[Wissensmodell]] &amp;amp;  [[Speicherung]]) ===&lt;br /&gt;
Das Herzstück des Systems. Es definiert, wie Wissensartikel und ihre Beziehungen abgelegt werden:&lt;br /&gt;
* Entwickler-Entscheidung: Monolithisches Datenmodell (feste Tabellen für articles, categories, tags) oder flexibles Schema (JSONB / EAV-Muster für benutzerdefinierte Wissens-Typen wie Glossareinträge, How-Tos, FAQs).&lt;br /&gt;
* Taxonomie als Kernbestandteil: Eigene Tabellen für Kategorien, Tags und Artikel-Artikel-Relationen (Verlinkungen), nicht nur für den Inhalt selbst.&lt;br /&gt;
* Mandantenfähigkeit / Multi-Tenancy (optional): Trennung von Daten per tenant_id-Spalte oder separaten Datenbankschemas.&lt;br /&gt;
* Datenbank: Relationale Datenbanken wie PostgreSQL bieten mit JSON-Unterstützung volle Flexibilität bei hoher Integrität – wichtig, da Wissensartikel oft variable Zusatzfelder benötigen.&lt;br /&gt;
&lt;br /&gt;
=== Content &amp;amp; Routing Layer (Wissensartikel-Verwaltung &amp;amp; URLs) ===&lt;br /&gt;
Verantwortlich für das Laden und Rendern von Wissensartikeln für Nutzer:&lt;br /&gt;
* Slug-Mapping: Zuordnung von lesbaren Pfaden (/wiki/rust-cms-guide) zu Datenbank-Einträgen.&lt;br /&gt;
* Status &amp;amp; Versionierung: Artikel besitzen Zustände (draft, published, archived) sowie eine Revisions-Historie – bei einem Wissenssystem meist zentraler als bei einem Blog, da Artikel fortlaufend gepflegt statt einmalig veröffentlicht werden.&lt;br /&gt;
* Rendering:&lt;br /&gt;
** Server-Side Rendering (SSR): HTML wird direkt über eine Template-Engine (z. B. Askama, Tera) gerendert.&lt;br /&gt;
** Headless (API): Ausgabe von JSON für entkoppelte Frontends.&lt;br /&gt;
&lt;br /&gt;
=== Wissensverknüpfung &amp;amp; Taxonomie (Knowledge Graph) ===&lt;br /&gt;
Das eigentliche Unterscheidungsmerkmal eines Wissenssystems gegenüber einem reinen CMS – Wissen entsteht durch Verknüpfung, nicht nur durch einzelne Artikel:&lt;br /&gt;
* Wiki-Links &amp;amp; Backlinks: Erkennung von Verweisen zwischen Artikeln (z. B. &amp;lt;nowiki&amp;gt;[[Artikelname]]&amp;lt;/nowiki&amp;gt;-Syntax) sowie automatische Rückverfolgung, welche Artikel auf einen bestimmten Artikel verlinken.&lt;br /&gt;
* Kategorien &amp;amp; Tags: Hierarchische und flache Klassifizierung von Wissensartikeln zur Navigation und Filterung.&lt;br /&gt;
* Verwandte Artikel: Automatische oder manuelle Vorschläge thematisch ähnlicher Artikel (z. B. über gemeinsame Tags oder Verlinkungsdichte).&lt;br /&gt;
* Glossar &amp;amp; Begriffsdefinitionen: Zentrale Verwaltung wiederkehrender Fachbegriffe, die aus Artikeltexten heraus verlinkt werden können.&lt;br /&gt;
&lt;br /&gt;
=== Authentication &amp;amp; Authorization (Sicherheit) ===&lt;br /&gt;
Trennt den öffentlichen Bereich vom Verwaltungsbereich:&lt;br /&gt;
* Authentifizierung: Identitätsprüfung von Benutzern (z. B. Session-Cookies oder JWT-Tokens).&lt;br /&gt;
* Rechteverwaltung (RBAC): Rollenbasierte Zugriffskontrolle (z. B. Admin, Editor, Author), um festzulegen, wer welche Endpunkte oder Inhalte bearbeiten darf.&lt;br /&gt;
&lt;br /&gt;
=== Media Manager (Dateiverwaltung) ===&lt;br /&gt;
Verwaltet Bilder, PDFs und sonstige Uploads:&lt;br /&gt;
* Upload-Pipeline: Empfang von Dateien, Prüfung von MIME-Types und Dateigrößen.&lt;br /&gt;
* Verarbeitung: Automatische Skalierung oder Konvertierung von Bildern (z. B. Erzeugung von WebP-Thumbnails).&lt;br /&gt;
* Storage: Speicherung auf dem lokalen Dateisystem oder in einem Object-Storage (S3/MinIO).&lt;br /&gt;
&lt;br /&gt;
=== Admin Backend (Verwaltungsoberfläche) ===&lt;br /&gt;
Die Benutzeroberfläche für Redakteure:&lt;br /&gt;
* Rich-Text / Markdown Editor: Eingabeoberfläche für Inhalte.&lt;br /&gt;
* REST / gRPC / GraphQL API: Kommuniziert mit dem Backend, um Inhalte, Einstellungen, Benutzer und Medien zu verwalten.&lt;br /&gt;
&lt;br /&gt;
=== Caching &amp;amp; Performance Layer ===&lt;br /&gt;
Verhindert unnötige Datenbankabfragen bei hoher Last:&lt;br /&gt;
* HTTP-Caching: Passende Header (Cache-Control, ETag) für Nginx oder CDNs.&lt;br /&gt;
* In-Memory Caching: Zwischenspeichern von zusammengestellten Seiten oder Datenbank-Ergebnissen (z. B. über In-Memory-Stores oder Redis).&lt;br /&gt;
&lt;br /&gt;
=== Search &amp;amp; Discovery (Suche) ===&lt;br /&gt;
In einem Wissenssystem oft der wichtigste Einstiegspunkt überhaupt – Nutzer suchen gezielt nach Antworten statt zu stöbern:&lt;br /&gt;
* DB-native Suche: Volltextsuche über PostgreSQL tsvector/tsquery, ausreichend für kleinere bis mittlere Datenmengen.&lt;br /&gt;
* Externer Suchindex: Bei höheren Anforderungen an Relevanz und Performance Anbindung an Meilisearch, Typesense oder Elasticsearch.&lt;br /&gt;
* Facettierung &amp;amp; Filter: Eingrenzung nach Kategorie, Tag, Datum oder Autor.&lt;br /&gt;
&lt;br /&gt;
=== SEO &amp;amp; Metadata ===&lt;br /&gt;
Sorgt dafür, dass Inhalte von Suchmaschinen korrekt erfasst werden:&lt;br /&gt;
* Meta-Tags &amp;amp; Open Graph: Pro Inhalt konfigurierbare Title-, Description- und Social-Preview-Daten.&lt;br /&gt;
* Sitemap &amp;amp; Robots: Automatisch generierte sitemap.xml und robots.txt.&lt;br /&gt;
* Kanonische URLs &amp;amp; Redirects: Vermeidung von Duplicate Content, Verwaltung von 301-Weiterleitungen bei Slug-Änderungen.&lt;br /&gt;
&lt;br /&gt;
=== Plugin- &amp;amp; Extension-System ===&lt;br /&gt;
Erlaubt es, Funktionalität ohne Eingriff in den Core zu erweitern:&lt;br /&gt;
* Hooks &amp;amp; Events: Definierte Erweiterungspunkte (z. B. before_publish, after_upload), an denen Plugins andocken können.&lt;br /&gt;
* Middleware-Ketten: Zusätzliche Verarbeitungsschritte in Request/Response-Pipeline einschiebbar.&lt;br /&gt;
&lt;br /&gt;
=== Background Jobs / Task Queue ===&lt;br /&gt;
Verlagert zeitintensive Arbeiten aus dem Request-Zyklus:&lt;br /&gt;
* Queue-Anbindung: Asynchrone Verarbeitung über Redis-basierte Queues oder tokio-Task-Runner.&lt;br /&gt;
* Typische Jobs: Bildkonvertierung, E-Mail-Versand, Sitemap-Neubau, Webhook-Zustellung.&lt;br /&gt;
* Retry &amp;amp; Fehlerbehandlung: Wiederholungslogik und Dead-Letter-Handling bei fehlgeschlagenen Jobs.&lt;br /&gt;
&lt;br /&gt;
=== Internationalisierung (i18n / l10n) ===&lt;br /&gt;
Unterstützt mehrsprachige Inhalte und Oberflächen:&lt;br /&gt;
* Mehrsprachige Inhalte: Übersetzungsstatus pro Sprache und Content-Objekt.&lt;br /&gt;
* Locale-Routing: Sprachspezifische Pfade (/de/…, /en/…) oder Subdomains.&lt;br /&gt;
* UI-Übersetzung: Lokalisierte Texte im Admin Backend.&lt;br /&gt;
&lt;br /&gt;
=== Notifications &amp;amp; E-Mail ===&lt;br /&gt;
Kommuniziert Systemereignisse an Nutzer und Redakteure:&lt;br /&gt;
* Transaktionale Mails: Passwort-Reset, Einladungen, Kommentar-Benachrichtigungen.&lt;br /&gt;
* Workflow-Benachrichtigungen: Hinweise bei Freigabe-Anfragen oder Statuswechseln von Inhalten.&lt;br /&gt;
&lt;br /&gt;
=== Audit-Log &amp;amp; Monitoring ===&lt;br /&gt;
Schafft Nachvollziehbarkeit und Betriebssicherheit:&lt;br /&gt;
* Audit-Log: Protokollierung, wer wann welche Änderung vorgenommen hat (Compliance, Nachvollziehbarkeit).&lt;br /&gt;
* Monitoring &amp;amp; Tracing: Metriken, Logs und Fehlerreporting für den laufenden Betrieb (z. B. über OpenTelemetry).&lt;br /&gt;
&lt;br /&gt;
=== Konfigurationsmanagement ===&lt;br /&gt;
Zentrale Steuerung systemweiter Einstellungen:&lt;br /&gt;
* Site-Settings: Globale Konfiguration wie Seitenname, Standardsprache, Zeitzone.&lt;br /&gt;
* Feature-Flags: Kontrolliertes Ein-/Ausschalten einzelner Funktionen ohne Redeploy.&lt;br /&gt;
&lt;br /&gt;
=== Deployment &amp;amp; Infrastructure ===&lt;br /&gt;
Betrifft Betrieb und Wartbarkeit des Systems:&lt;br /&gt;
* Migrations-Tooling: Versionierte Datenbank-Migrationen (z. B. via sqlx oder refinery).&lt;br /&gt;
* CI/CD: Automatisierte Tests und Deployments.&lt;br /&gt;
* Backup-Strategie: Regelmäßige Sicherung von Datenbank und Medien-Storage.&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Grundbegriffe Informatik]]&lt;br /&gt;
* [[Weiter]]&lt;br /&gt;
&lt;br /&gt;
==Hinweis==&lt;br /&gt;
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Grundbegriffe_Informatik&amp;diff=44</id>
		<title>Grundbegriffe Informatik</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Grundbegriffe_Informatik&amp;diff=44"/>
		<updated>2026-08-13T11:59:19Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
==Grundbegriffe Informatik==&lt;br /&gt;
* Daten,Variablen und Datentypen&lt;br /&gt;
* Datenstrukturen&lt;br /&gt;
* Modelle&lt;br /&gt;
* Algorithmen und Programmlogik&lt;br /&gt;
===Daten===&lt;br /&gt;
====Wissensbasiertes System====&lt;br /&gt;
=====Die Ebenen der Datenverarbeitung=====&lt;br /&gt;
* Faktendaten (Rohdaten &amp;amp; Information):&lt;br /&gt;
* Repräsentiertes Wissen: Strukturierte Daten, die logische Zusammenhänge, Regeln oder Beziehungen beschreiben&lt;br /&gt;
* Metadaten: Daten über die Daten&lt;br /&gt;
=====Typen von Daten in Wissenssystemen=====&lt;br /&gt;
Je nach Architektur und Einsatzzweck des Systems werden unterschiedliche Datenformen genutzt:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A. Regelbasiertes Wissen (Explizites Wissen)&#039;&#039;&#039;&lt;br /&gt;
* Form: „Wenn–Dann“-Regeln (If-Then-Rules).&lt;br /&gt;
* Anwendung: Klassische Expertensysteme (z. B. in der Medizin oder bei der Fehlerdiagnose).&lt;br /&gt;
* Beispiel: &#039;&#039;Wenn der Fehlercode E-101 auftritt und der Druck &amp;gt; 5 bar ist, dann öffne Ventil B.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;B. Strukturierte Wissensgraphen &amp;amp; Ontologien&#039;&#039;&#039;&lt;br /&gt;
* Form: Entitäten (Knoten) und deren Beziehungen (Kanten).&lt;br /&gt;
* Anwendung: Semantic Web, moderne Wiki-Systeme, Enterprise Search.&lt;br /&gt;
* Beispiel: &#039;&#039;[Ahrensburg] --(ist eine Stadt in)--&amp;gt; [Schleswig-Holstein]&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C. Dokumentenbasiertes / Unstrukturiertes Wissen&#039;&#039;&#039;&lt;br /&gt;
* Form: Volltexte, Markdown-Dateien, PDFs, Quellcode, Wiki-Seiten.&lt;br /&gt;
* Anwendung: Wissensmanagement-Plattformen, Dokumentations-Engines.&lt;br /&gt;
* Besonderheit: Oft kombiniert mit Volltext-Indizes oder Schlagwort-Katalogen zur schnellen Durchsuchbarkeit.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;D. Vektor-Daten (für KI &amp;amp; RAG)&#039;&#039;&#039;&lt;br /&gt;
* Form: Einbettungen (Embeddings) – hochdimensionale numerische Vektoren, die die semantische Bedeutung von Texten darstellen.&lt;br /&gt;
* Anwendung: Modernes LLM-basiertes Wissensmanagement (Retrieval-Augmented Generation / RAG).&lt;br /&gt;
* Vorteil: Ermöglicht die Suche nach Bedeutung und Kontext, nicht nur nach exakten Begriffen.&lt;br /&gt;
===Variable===&lt;br /&gt;
====Speicherarten in menschlichen kognitiven Systemen====&lt;br /&gt;
In der Kognitionswissenschaft unterscheidet man bezüglich des veränderbaren (variablen) Wissens vor allem zwei Speicherformen im Langzeitgedächtnis:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Explizites / Deklaratives Wissen (&amp;quot;Wissen, dass&amp;quot;)&#039;&#039;&#039;&lt;br /&gt;
* Episodisches Gedächtnis: Speichert konkrete, zeitlich gebundene Erlebnisse und Ereignisse (z. B. „Gestern habe ich Thema X unterrichtet&amp;quot;).&lt;br /&gt;
* Semantisches Gedächtnis: Speichert allgemeines, dekontextualisiertes Fakten- und Konzeptwissen (z. B. „Ein Verb beschreibt eine Handlung&amp;quot;). Dieses Netz aus Konzepten passt sich dynamisch an, wenn neue Regeln oder Fakten gelernt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Implizites / Prozedurales Wissen (&amp;quot;Wissen, wie&amp;quot;)&#039;&#039;&#039;&lt;br /&gt;
* Speichert Handlungsabläufe und Fertigkeiten (z. B. Grammatikregeln im Sprachgebrauch anwenden). Es verändert sich schrittweise durch Automatisierung und Praxis.&lt;br /&gt;
&lt;br /&gt;
====Speicherungsarten in technischen/digitalen Systemen (KI &amp;amp; Software)====&lt;br /&gt;
Bei variablen Wissenssystemen in der Informatik unterscheidet man hauptsächlich zwei Speicherebenen:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A) Parameter-Speicher (Parametrisches Wissen)&#039;&#039;&#039;&lt;br /&gt;
* Wie gespeichert? In den mathematischen Verknüpfungen (Gewichten) neuronaler Netze.&lt;br /&gt;
* Variabilität: Ändert sich kontinuierlich während des Trainings oder Fine-Tunings. Einmal trainiert, ist dieses Wissen im laufenden Betrieb jedoch oft starr.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;B) Externe Vektor- und Graphdatenbanken (Non-parametrisches Wissen)&#039;&#039;&#039;&lt;br /&gt;
* Wie gespeichert? Informationen werden als Einbettungen (Vectors) oder als semantische Netze (Knowledge Graphs) in Datenbanken abgelegt.&lt;br /&gt;
* Variabilität: Sehr hoch. Neue Daten können jederzeit hinzugefügt, aktualisiert oder gelöscht werden, ohne das Grundmodell neu zu trainieren (z. B. bei RAG-Systemen – Retrieval-Augmented Generation).&lt;br /&gt;
===Datentypen===&lt;br /&gt;
====1. Primitive / Elementare Datentypen====&lt;br /&gt;
Diese bilden die kleinsten Bausteine jedes Systems:&lt;br /&gt;
* Ganzzahlen (Integer): Diskrete Werte ohne Nachkommastellen (z. B. -42, 0, 1024).&lt;br /&gt;
* Gleitkommazahlen (Float, Double): Reelle Zahlen mit Nachkommastellen (z. B. 3.14159).&lt;br /&gt;
* Wahrheitswerte (Boolean): Binärwerte (true / false bzw. 1 / 0).&lt;br /&gt;
* Zeichen &amp;amp; Zeichenketten (Char, String): Textdaten (z. B. &amp;quot;Wissensgraph&amp;quot;).&lt;br /&gt;
* Datum &amp;amp; Zeit (Date, Timestamp): Zeitstempel zur zeitlichen Einordnung von Wissen.&lt;br /&gt;
&lt;br /&gt;
====2. Strukturierte &amp;amp; Komplexe Datentypen====&lt;br /&gt;
Dienen dazu, mehrere Datenpunkte logisch miteinander zu verknüpfen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Datentyp !! Beschreibung !! Beispiel / Anwendungsfall&lt;br /&gt;
|-&lt;br /&gt;
| Listen / Arrays || Geordnete Reihenfolge von Elementen || [1, 2, 3, 5, 8]&lt;br /&gt;
|-&lt;br /&gt;
| Schlüssel-Wert-Paare (Maps / Dictionaries) || Zuordnung von eindeutigen Keys zu Werten || {&amp;quot;Titel&amp;quot;: &amp;quot;Artikel&amp;quot;, &amp;quot;Autor&amp;quot;: &amp;quot;Max&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
| Sätze (Sets) || Ungeordnete Mengen ohne Duplikate || {Rot, Grün, Blau}&lt;br /&gt;
|-&lt;br /&gt;
| JSON / BSON || Hierarchisch strukturierte Dokumente || Ideal für semi-strukturierte Wissenseinträge&lt;br /&gt;
|-&lt;br /&gt;
| Blob / Binary || Unstrukturierte Binärdaten || Bilder, Audio-Dateien, Dokumente&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====3. Semantische Datentypen (Wissensrepräsentation)====&lt;br /&gt;
In modernen Wissenssystemen (z. B. RDF, OWL, Knowledge Graphs) gehen Datentypen über rein technische Formate hinaus und beschreiben Bedeutung und Beziehungen:&lt;br /&gt;
* Entitäten / Ressourcen (URIs/IRIs): Eindeutige Identifikatoren für Objekte, Personen oder Konzepte (z. B. http://example.org/person/Thorsten).&lt;br /&gt;
* Literale: Konkrete Werte, die an Entitäten hängen (oft kombiniert mit XML-Schema-Datentypen wie xsd:string oder xsd:dateTime).&lt;br /&gt;
* Relational- / Kanten-Typen (Predicates): Beschreiben die Art der Beziehung zwischen zwei Entitäten (z. B. istAutorVon, gehörtZuKategorie).&lt;br /&gt;
* Vektoren (Embeddings): Dichte numerische Vektoren, die von KI-Modellen und Vektordatenbanken verwendet werden, um semantische Ähnlichkeit zwischen Texten oder Konzepten abzubilden.&lt;br /&gt;
&lt;br /&gt;
===Datenstrukturen===&lt;br /&gt;
Wissenssysteme (Knowledge Management Systems, Wissensdatenbanken) nutzen je nach Einsatzzweck, Flexibilität und Abfragesprache ganz unterschiedliche Datenstrukturen. Hier ist eine Übersicht der wichtigsten Strukturen – von einfach und unstrukturiert bis hin zu hochkomplex und semantisch vernetzt:&lt;br /&gt;
&lt;br /&gt;
====1. Unstrukturierte &amp;amp; Hierarchische Strukturen====&lt;br /&gt;
&#039;&#039;&#039;Flat Files / Plain Text (Markdown, Wikitext)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Daten liegen in einfachen Textdateien vor (oft mit Frontmatter für Metadaten).&lt;br /&gt;
* Vorteile: Extrem schnell, versionierbar (z. B. via Git), zukunftssicher und ohne Datenbank-Overhead.&lt;br /&gt;
* Einsatz: Static Site Generators (Hugo, Jekyll), moderne Notiz-Systeme (Obsidian, Logseq), flache Dokumentationen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Baumstrukturen &amp;amp; Taxonomien&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Hierarchische Anordnung in Ordnern, Kategorien oder Unterkategorien (Eltern-Kind-Beziehungen).&lt;br /&gt;
* Vorteile: Intuitive Navigation für Menschen, klar abgegrenzte Themenbereiche.&lt;br /&gt;
* Einsatz: Klassische Dateisysteme, Firmen-Wikis, Inhaltsverzeichnisse.&lt;br /&gt;
&lt;br /&gt;
====2. Strukturierte &amp;amp; Relationale Datenstrukturen====&lt;br /&gt;
&#039;&#039;&#039;Relationale Datenbanken (SQL)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Tabellen mit festem Schema, Primär- und Fremdschlüsseln (z. B. PostgreSQL, MySQL).&lt;br /&gt;
* Vorteile: Hohe Datenintegrität (ACID-Konformität), ausgereifte Abfragesprachen, hervorragend für strukturierte Metadaten.&lt;br /&gt;
* Einsatz: Klassische Enterprise-CMS (Drupal, TYPO3), Lernplattformen (Moodle), MediaWiki.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dokumentenorientierte Datenbanken (NoSQL)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Speicherung in semi-strukturierten Formaten wie JSON, BSON oder XML.&lt;br /&gt;
* Vorteile: Flexibles Schema, einfache Skalierbarkeit, schnelle Entwicklung bei sich ändernden Datenmodellen.&lt;br /&gt;
* Einsatz: MongoDB, CouchDB, dynamische Wissensplattformen.&lt;br /&gt;
&lt;br /&gt;
====3. Semantische &amp;amp; Vernetzte Strukturen (Graph-basiert)====&lt;br /&gt;
&#039;&#039;&#039;Eigenschaftsgraphen (Property Graphs)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Knoten (Entitäten) und Kanten (Beziehungen) tragen Schlüssel-Wert-Paare (Attributes).&lt;br /&gt;
* Vorteile: Abfrage von komplexen, tief verschachtelten Zusammenhängen ohne teure SQL-JOINs.&lt;br /&gt;
* Einsatz: Neo4j, Memgraph, Wissensnetze, Empfehlungsdienste.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RDF-Tripel / Semantisches Web (Knowledge Graphs)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Wissen wird in Form von Aussagen-Tripeln gespeichert: Subjekt → Prädikat → Objekt (z. B. „Ahrensburg → liegtIn → Schleswig-Holstein&amp;quot;).&lt;br /&gt;
* Vorteile: Standardisiert (W3C, SPARQL, OWL), erlaubt automatische logische Schlussfolgerungen (Inferenz).&lt;br /&gt;
* Einsatz: Wikidata, DBpedia, Semantic MediaWiki, ontologiebasierte Expertensysteme.&lt;br /&gt;
&lt;br /&gt;
====4. Moderne &amp;amp; Vektorbasierte Strukturen====&lt;br /&gt;
&#039;&#039;&#039;Vektordatenbanken (Embeddings)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Texte oder Objekte werden durch Machine-Learning-Modelle in hochdimensionale Vektoren (Zahlenreihen) umgewandelt.&lt;br /&gt;
* Vorteile: Ermöglicht semantische Suche (Suche nach Bedeutung statt nach exakten Stichwörtern) und Retrieval-Augmented Generation (RAG).&lt;br /&gt;
* Einsatz: Pinecone, Qdrant, Chroma, pgvector für KI-Assistenten und LLM-Erweiterungen.&lt;br /&gt;
===Modelle===&lt;br /&gt;
Während die vorigen Abschnitte einzelne Daten, Datentypen und Datenstrukturen behandeln, beschreibt ein &#039;&#039;&#039;Modell&#039;&#039;&#039; das übergeordnete Ordnungsprinzip, nach dem ganze Wissensbestände organisiert werden. Die folgenden sieben Modelle sind die in der Praxis dominierenden Ansätze, von einfach bis hochformal.&lt;br /&gt;
&lt;br /&gt;
====1. Hierarchisches / Baum-Modell (Tree / Folder Model)====&lt;br /&gt;
* Prinzip: Ordnung über verschachtelte Ordner, Kategorien oder Seitenbäume (Eltern-Kind-Beziehung).&lt;br /&gt;
* Typischer Einsatz: Klassische CMS, Dateisysteme, Notiz-Apps (wie Notion, Confluence).&lt;br /&gt;
* Vorteil: Intuitive Bedienung, klare Navigation.&lt;br /&gt;
* Nachteil: Wissen lässt sich oft nicht eindeutig einem Fachbereich zuordnen (Problem der eierlegenden Wollmilchsau).&lt;br /&gt;
&lt;br /&gt;
====2. Flaches Modell mit Metadaten &amp;amp; Tags (Flat / Key-Value Model)====&lt;br /&gt;
* Prinzip: Alle Dokumente liegen auf einer Ebene (&amp;quot;Flat-File&amp;quot;) und werden über Schlagwörter (Tags), Taxonomien oder Key-Value-Eigenschaften charakterisiert.&lt;br /&gt;
* Typischer Einsatz: Flat-File CMS (z. B. Grav, Kirby), statische Wissensdatenbanken (Markdown-basiert mit Frontmatter).&lt;br /&gt;
* Vorteil: Keine starre Ordnerstruktur, hochgradig durchsuchbar, extrem einfach zu sichern/versionieren (z. B. mit Git).&lt;br /&gt;
* Nachteil: Ohne disziplinierte Verschlagwortung geht die Übersicht schnell verloren.&lt;br /&gt;
&lt;br /&gt;
====3. Relationales Datenmodell (Relational Model / SQL)====&lt;br /&gt;
* Prinzip: Wissen wird in zusammenhängenden Tabellen (Entitäten, Attribute, Fremdschlüssel) strukturiert.&lt;br /&gt;
* Typischer Einsatz: Enterprise-Wikis, Moodle/LMS, strukturierte Unternehmensdatenbanken.&lt;br /&gt;
* Vorteil: Hohe Datenintegrität, komplexe Abfragen über Fremdschlüssel und Tabellenverknüpfungen möglich.&lt;br /&gt;
* Nachteil: Starres Schema; Schemaänderungen bei sich veränderndem Wissen sind aufwendig.&lt;br /&gt;
&lt;br /&gt;
====4. Netzwerk- / Graphen-Modell (Graph Model)====&lt;br /&gt;
* Prinzip: Daten bestehen aus Knoten (Entitäten/Dokumenten) und Kanten (Beziehungen).&lt;br /&gt;
* Typischer Einsatz: Personal Knowledge Management (z. B. Obsidian, Roam Research), Graph-Datenbanken (Neo4j).&lt;br /&gt;
* Vorteil: Spiegelt vernetztes Denken wider. Beziehungen wie &#039;&#039;[Projekt X] --hängt ab von--&amp;gt; [Technologie Y]&#039;&#039; sind native Bestandteile der Datenbank.&lt;br /&gt;
* Nachteil: Schwer zu visualisieren/navigieren bei sehr großen Datenmengen ohne gute Filter.&lt;br /&gt;
&lt;br /&gt;
====5. Semantisches / Triples-Modell (RDF / Knowledge Graph)====&lt;br /&gt;
* Prinzip: Wissen wird in formallogischen Aussagen aus Subjekt – Prädikat – Objekt (Triples) gespeichert (z. B. &#039;&#039;[MediaWiki] [verwendet] [PostgreSQL]&#039;&#039;).&lt;br /&gt;
* Typischer Einsatz: Semantic MediaWiki, Wikidata, Ontologie-Systeme (OWL, RDF/SPARQL).&lt;br /&gt;
* Vorteil: Maschinenlesbar, erlaubt automatische logische Rückschlüsse (Inferenz) und komplexe semantische Abfragen.&lt;br /&gt;
* Nachteil: Hohe Einarbeitungszeit und formale Komplexität beim Erstellen der Ontologien.&lt;br /&gt;
&lt;br /&gt;
====6. Dokumentenorientiertes Modell (NoSQL / JSON)====&lt;br /&gt;
* Prinzip: Ein Wissenselement ist ein eigenständiges, strukturiertes Dokument (z. B. JSON/YAML), das eingebettete Attribute und Arrays enthält.&lt;br /&gt;
* Typischer Einsatz: CouchDB, MongoDB, elasticsearch-basierte Wissensspeicher.&lt;br /&gt;
* Vorteil: Flexibles Schema; jedes Dokument kann individuelle Felder haben, ohne das Gesamtsystem zu blockieren.&lt;br /&gt;
* Nachteil: Redundanzen bei Datenbanksicherungen, schwächere Konsistenzprüfungen als bei SQL.&lt;br /&gt;
&lt;br /&gt;
====7. Vektorraum-Modell (Embedding / Latent Space Model)====&lt;br /&gt;
* Prinzip: Wissen wird nicht symbolisch, sondern als Position in einem hochdimensionalen Vektorraum repräsentiert; semantische Nähe entspricht geometrischer Nähe (siehe auch [[#Vektor-Daten (für KI &amp;amp; RAG)|Vektor-Daten]] weiter oben).&lt;br /&gt;
* Typischer Einsatz: Retrieval-Augmented Generation (RAG), semantische Suche, Empfehlungssysteme (Pinecone, Qdrant, pgvector).&lt;br /&gt;
* Vorteil: Findet Zusammenhänge über Bedeutung statt exakter Begriffe, robust gegenüber Synonymen und unscharfen Anfragen.&lt;br /&gt;
* Nachteil: Nicht direkt interpretierbar (&amp;quot;Black Box&amp;quot;), keine expliziten Regeln oder Beziehungen wie im Graphen-Modell.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; In der Praxis werden diese Modelle selten pur eingesetzt, sondern kombiniert – dieses Wiki selbst ist ein Beispiel: Es nutzt eine Baumstruktur (Modell 1, über die `==`/`===`-Überschriften), liegt aber als flache, versionierte Textdatei vor (Modell 2).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Nr. !! Modell !! Kernprinzip !! Größter Vorteil !! Größter Nachteil&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Hierarchisch (Baum) || Eltern-Kind-Verschachtelung || Intuitive Navigation || Eindeutige Einordnung oft unmöglich&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Flach mit Tags || Ebene Dateien + Metadaten || Einfach, git-versionierbar || Erfordert Tagging-Disziplin&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Relational (SQL) || Tabellen + Fremdschlüssel || Hohe Datenintegrität || Starres Schema&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Graph (Property Graph) || Knoten + Kanten || Bildet vernetztes Denken ab || Schwer visualisierbar bei großer Skala&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Semantisch (RDF/Triples) || Subjekt–Prädikat–Objekt || Maschinelle Inferenz möglich || Hoher Formalisierungsaufwand&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Dokumentenorientiert (NoSQL) || Eigenständige JSON-Dokumente || Flexibles Schema || Schwächere Konsistenzprüfung&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Vektorraum (Embeddings) || Position im semantischen Raum || Suche nach Bedeutung statt Begriff || Nicht direkt interpretierbar&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Algorithmen und Programmlogik===&lt;br /&gt;
Wenn es darum geht, Algorithmen und Programmlogik bildhaft, strukturiert oder regelbasiert darzustellen, unterscheidet man zwischen visuellen Repräsentationsformen (zur Dokumentation und Planung) und formalen Wissenssystemen (zur automatischen Verarbeitung).&lt;br /&gt;
&lt;br /&gt;
====1. Visuelle Wissenssysteme &amp;amp; Graphische Modelle====&lt;br /&gt;
Diese Systeme helfen Entwicklern und Lernenden, die Logik eines Programms unabhängig von einer konkreten Programmiersprache zu visualisieren.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! System / Modell !! Einsatzbereich !! Besonderheit / Logikbausteine&lt;br /&gt;
|-&lt;br /&gt;
| Nassi-Shneiderman-Diagramm (Struktogramm) || Strukturierte Programmierung, Lehre &amp;amp; Didaktik || Vermeidet Unordnung (kein Pfeilsalat). Basiert auf Sequenz, Auswahl (If-Else) und Wiederholung (Schleifen).&lt;br /&gt;
|-&lt;br /&gt;
| Programmablaufplan (PAP) / Flowchart || Prozessvisualisierung, technische Abläufe || Klassisches Flussdiagramm (DIN 66001) mit Pfeilen, Rauten für Entscheidungen und Rechtecken für Aktionen.&lt;br /&gt;
|-&lt;br /&gt;
| UML-Aktivitätsdiagramm || Software-Engineering, objektorientiertes Design || Standard in der Industrie. Zeigt komplexe Kontroll- und Datenflüsse inklusive paralleler Verzweigungen.&lt;br /&gt;
|-&lt;br /&gt;
| Entscheidungstabellen || Komplexe Geschäftslogik &amp;amp; Regelwerke || Stellt alle möglichen Bedingungen und daraus resultierende Aktionen in Tabellenform gegenüber.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====2. Formale &amp;amp; Regelbasierte Wissenssysteme====&lt;br /&gt;
Diese Systeme dienen nicht nur der Visualisierung, sondern führen Programmlogik und Regeln direkt aus:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Regelbasierte Systeme &amp;amp; Expertensysteme&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Wissen wird in Form von Fakten und Logikregeln (WENN Bedingung DANN Aktion) gespeichert. Eine Inferenzmaschine (Inference Engine) wertet diese Logik aus.&lt;br /&gt;
* Beispiele:&lt;br /&gt;
** Prolog: Deklarative Programmierung basierend auf Prädikatenlogik.&lt;br /&gt;
** Drools / Business Rules Engines: Für komplexe Geschäftsregeln im Unternehmensumfeld.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pseudocode &amp;amp; Algorithmen-Markup&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Eine strukturierte, halbsprachliche Beschreibung von Logik. Er kombiniert natürliche Sprache mit Elementen höherer Programmiersprachen.&lt;br /&gt;
* Vorteil: Unabhängig von Syntaxfehlern und konzentriert auf das reine Problemlösungsmuster.&lt;br /&gt;
&lt;br /&gt;
====3. MediaWiki als Referenzimplementierung====&lt;br /&gt;
Ein echtes MediaWiki (die Software hinter Wikipedia) setzt praktisch alle in diesem Wiki beschriebenen Modelle gleichzeitig um – nur an unterschiedlichen Stellen der Architektur:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Speicherung (Modell 3 Relational + Modell 6 Dokumentenorientiert)&#039;&#039;&#039;&lt;br /&gt;
* Jede Seite ist ein Dokument (Wikitext-Blob), die Metadaten drumherum sind relational organisiert.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tabelle !! Inhalt&lt;br /&gt;
|-&lt;br /&gt;
| page || Titel, Namespace, Status je Seite&lt;br /&gt;
|-&lt;br /&gt;
| revision || Jede Version einer Seite (Autor, Zeitstempel) – die Versionierung&lt;br /&gt;
|-&lt;br /&gt;
| text / slots || Der eigentliche Wikitext-Blob – unstrukturiert, wie ein Dokument&lt;br /&gt;
|-&lt;br /&gt;
| page_props || Frei erweiterbare Key-Value-Metadaten pro Seite&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Struktur der Überschriften (Modell 1 Baum – nur optisch)&#039;&#039;&#039;&lt;br /&gt;
* `==`, `===`, `====` erzeugen keine echte Baumstruktur in der Datenbank, sondern werden zur Laufzeit nur zu einem Inhaltsverzeichnis (`&amp;lt;h2&amp;gt;`, `&amp;lt;h3&amp;gt;`, …) mit Anchor-Links geparst.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kategorien &amp;amp; Links (Modell 4 Graph + Modell 2 Flach/Tags)&#039;&#039;&#039;&lt;br /&gt;
* Intern ist MediaWiki ein Graph, kein Baum: die Tabelle `pagelinks` speichert, wer auf wen verlinkt (`[[Ziel]]`), `categorylinks`, welche Seite zu welcher Kategorie gehört, `templatelinks`, welche Seite welche Vorlage einbindet.&lt;br /&gt;
* Kategorien funktionieren wie Tags (flach + Metadaten), erlauben durch Verschachtelung aber auch baumartige Navigation – eine Seite kann in mehreren Kategorien gleichzeitig stehen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Semantik (Modell 5 RDF/Triples)&#039;&#039;&#039;&lt;br /&gt;
* Nicht Core-MediaWiki, sondern die Extension Semantic MediaWiki (SMW): Annotationen wie `[[liegt in::Schleswig-Holstein]]` werden zu echten RDF-Tripeln (Subjekt–Prädikat–Objekt), abgelegt in eigenen SQL-Tabellen und exportierbar als RDF/OWL. `ASK`-Abfragen (SPARQL-ähnlich) werden damit direkt im Wikitext möglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Algorithmen/Programmlogik im Wiki selbst&#039;&#039;&#039;&lt;br /&gt;
* ParserFunctions-Extension: `{{#if: Bedingung | Dann | Sonst}}`, `{{#switch: ... }}` – die praktische Umsetzung des „WENN Bedingung DANN Aktion&amp;quot;-Regelsystems, direkt im Wikitext ausführbar.&lt;br /&gt;
* Scribunto (Lua-Module): vollwertige Programmlogik innerhalb von Vorlagen – die Inferenzmaschine für Fälle, die ParserFunctions nicht mehr abbilden.&lt;br /&gt;
* Templates (`{{Vorlage|Parameter}}`): parametrisierter Pseudocode – wiederverwendbare Logikbausteine, die beim Rendern expandiert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Suche (Modell 7 Vektorraum, meist als Erweiterung)&#039;&#039;&#039;&lt;br /&gt;
* Core-MediaWiki bietet nur einfache Volltextsuche. Für semantische/Vektorsuche braucht es Extensions wie CirrusSearch (Elasticsearch) oder KI-gestützte Erweiterungen mit Embeddings – nativ ist das nicht vorgesehen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kurz zusammengefasst als Pipeline:&#039;&#039;&#039;&lt;br /&gt;
* Wikitext (Dokument, Modell 6) → Parser/Präprozessor (Templates/Scribunto = Algorithmen) → HTML-Rendering (Baum-Optik, Modell 1) → gespeichert in relationaler DB (Modell 3) → verknüpft über pagelinks/categorylinks (Graph, Modell 4; Tags, Modell 2) → optional angereichert um SMW-Tripel (Modell 5) und Suchindex/Embeddings (Modell 7).&lt;br /&gt;
&lt;br /&gt;
====4. XWiki als weiteres Beispiel====&lt;br /&gt;
XWiki (Java-basiert) verfolgt einen anderen Architekturansatz als MediaWiki und deckt die Modelle an anderen Stellen ab – vor allem, weil Struktur und Daten dort von Anfang an enger verzahnt sind:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Speicherung (Modell 3 Relational + Modell 6 Dokumentenorientiert, aber enger verzahnt)&#039;&#039;&#039;&lt;br /&gt;
* Über Hibernate ORM auf einer relationalen DB (standardmäßig) abgelegt. Jede Seite (`XWikiDocument`) ist zwar ein Dokument, trägt aber – anders als bei MediaWiki – strukturierte Daten direkt eingebettet statt nur als loser Freitext-Blob.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Echte Hierarchie (Modell 1 Baum, nicht nur optisch)&#039;&#039;&#039;&lt;br /&gt;
* XWiki-Seiten leben in verschachtelten Spaces (`Space.SubSpace.Seite`) – eine tatsächliche Baumstruktur in der Datenbank, kein bloß optisches Inhaltsverzeichnis wie bei MediaWikis `==`-Überschriften. Navigation und Rechteverwaltung (Berechtigungen vererben sich space-weise) folgen dieser echten Hierarchie.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;XClass / XObject – das Kernfeature (Modell 3 Relational, nativ statt per Extension)&#039;&#039;&#039;&lt;br /&gt;
* Jede Seite kann strukturierte, typisierte Datensätze (XObjects) tragen, deren Schema in einer XClass definiert ist – im Grunde eine pro Seite eingebettete Tabellenzeile mit festem Schema (Felder, Typen, Pflichtfelder).&lt;br /&gt;
* Damit sind Wissenseinträge gleichzeitig Dokument (Freitext) und Datensatz (strukturierte Felder) – MediaWiki braucht dafür die Extension Semantic MediaWiki, XWiki hat das nativ im Core.&lt;br /&gt;
* Abfragen darüber laufen über XWQL (XWiki Query Language, HQL/JPQL-artig) – SQL-ähnliche Abfragen direkt über die Wissensbasis, ohne SPARQL-Umweg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Algorithmen/Programmlogik im Wiki selbst&#039;&#039;&#039;&lt;br /&gt;
* Velocity- und Groovy-Skripte direkt in Seiten eingebettet (`#if()`, `#foreach()`, `$doc.getObject(...)`) – vollwertige Programmlogik, näher an einer richtigen Skriptsprache als MediaWikis ParserFunctions.&lt;br /&gt;
* Wiki-Makros (ähnlich Templates) kapseln wiederverwendbare Logik, können aber – weil Java-basiert – auch komplexe Berechnungen und Datenbankzugriffe direkt ausführen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Suche&#039;&#039;&#039;&lt;br /&gt;
* Solr/Lucene-basierte Volltext- und Facettensuche ist im Core enthalten (kein Extension-Zwang wie CirrusSearch bei MediaWiki); neuere Erweiterungen ergänzen KI-gestützte/semantische Suche mit Embeddings.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kurzvergleich MediaWiki vs. XWiki:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Aspekt !! MediaWiki !! XWiki&lt;br /&gt;
|-&lt;br /&gt;
| Hierarchie || Optisch über Überschriften, echte Struktur nur via Kategorien (Graph) || Echte verschachtelte Space-Baumstruktur&lt;br /&gt;
|-&lt;br /&gt;
| Strukturierte Daten (Modell 3/5) || Nur per Extension (Semantic MediaWiki) || Nativ im Core (XClass/XObject)&lt;br /&gt;
|-&lt;br /&gt;
| Abfragesprache || SMW-ASK (SPARQL-ähnlich, Extension) || XWQL (SQL-ähnlich, Core)&lt;br /&gt;
|-&lt;br /&gt;
| Programmlogik || ParserFunctions/Scribunto (Lua) || Velocity/Groovy (Java-Ökosystem)&lt;br /&gt;
|-&lt;br /&gt;
| Typischer Einsatz || Große offene Wissensdatenbanken (Wikipedia) || Unternehmens-Intranets mit strukturierten Formularen/Workflows&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====5. Beispiel: KI &amp;amp; RAG-Wissenssystem====&lt;br /&gt;
Ein modernes RAG-System (Retrieval-Augmented Generation) verfolgt einen grundlegend anderen Ansatz als MediaWiki und XWiki: Statt Wissen über explizite Struktur (Baum, Kategorien, XClass) zu ordnen, wird es über semantische Nähe im Vektorraum (Modell 7) auffindbar gemacht – die Struktur der vorigen Beispiele fehlt hier größtenteils.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Speicherung (Modell 7 Vektorraum + Modell 6 Dokumentenorientiert)&#039;&#039;&#039;&lt;br /&gt;
* Quelldokumente (Wiki-Seiten, PDFs, Markdown) werden in Chunks zerlegt und über ein Embedding-Modell in hochdimensionale Vektoren umgewandelt.&lt;br /&gt;
* Abgelegt in einer Vektordatenbank (Pinecone, Qdrant, Chroma, pgvector) – meist zusammen mit dem Originaltext als Payload/Metadaten, also weiterhin dokumentbasiert im Hintergrund.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Struktur (keine echte Hierarchie – Gegenteil von Modell 1)&#039;&#039;&#039;&lt;br /&gt;
* Es gibt keinen Seitenbaum und keine Kategorien wie bei MediaWiki/XWiki. Auffindbarkeit entsteht rein durch geometrische Nähe im Vektorraum, nicht durch Navigation oder Verlinkung.&lt;br /&gt;
* Optional wird das mit einem Graph (Modell 4, „GraphRAG&amp;quot;) oder mit Metadaten-Filtern (Modell 2, Tags) kombiniert, um reine Vektorsuche zu verbessern.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Algorithmen/Programmlogik – die eigentliche RAG-Pipeline&#039;&#039;&#039;&lt;br /&gt;
* Anfrage (Query) → Embedding der Anfrage → Ähnlichkeitssuche (z. B. Cosinus-Ähnlichkeit) in der Vektordatenbank → Top-k relevante Chunks abrufen → Re-Ranking (optional) → Chunks als Kontext in den Prompt einfügen → LLM generiert Antwort.&lt;br /&gt;
* Das ist funktional das Gegenstück zur „Inferenzmaschine&amp;quot; der regelbasierten Systeme (Abschnitt 2): statt fester WENN-DANN-Regeln wertet hier ein neuronales Netz statistische Ähnlichkeit aus – nicht deterministisch, sondern approximativ.&lt;br /&gt;
* Agenten-Frameworks (LangChain, LlamaIndex) übernehmen die Rolle von Templates/Makros: wiederverwendbare, parametrisierte Ablaufbausteine für Retrieval, Re-Ranking und Prompt-Konstruktion.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Semantik (implizit statt explizit – Gegenteil von Modell 5)&#039;&#039;&#039;&lt;br /&gt;
* Anders als RDF-Tripel (Subjekt–Prädikat–Objekt, explizit und maschinenlesbar) ist die „Semantik&amp;quot; eines Embeddings nicht symbolisch, sondern eine gelernte, nicht direkt interpretierbare Position im Vektorraum („Black Box&amp;quot;, vgl. Modell 7 im Abschnitt „Modelle&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Suche (Modell 7 nativ statt Extension)&#039;&#039;&#039;&lt;br /&gt;
* Semantische Suche ist hier kein Zusatzfeature (wie CirrusSearch bei MediaWiki), sondern der gesamte Zweck des Systems.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Erweiterter Kurzvergleich:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Aspekt !! MediaWiki !! XWiki !! RAG-System&lt;br /&gt;
|-&lt;br /&gt;
| Hierarchie || Optisch + Kategorien (Graph) || Echte Space-Baumstruktur || Keine – nur Vektor-Nähe (optional + Graph/Tags)&lt;br /&gt;
|-&lt;br /&gt;
| Strukturierte Daten || Nur per Extension (SMW) || Nativ (XClass/XObject) || Keine feste Struktur, nur Chunks + Embeddings&lt;br /&gt;
|-&lt;br /&gt;
| Abfrage || SMW-ASK / Volltext || XWQL / Volltext || Vektor-Ähnlichkeitssuche (semantisch)&lt;br /&gt;
|-&lt;br /&gt;
| Programmlogik || ParserFunctions/Scribunto || Velocity/Groovy || Retrieval-Pipeline + LLM (LangChain/LlamaIndex)&lt;br /&gt;
|-&lt;br /&gt;
| Ergebnis-Charakter || Deterministisch, nachvollziehbar || Deterministisch, nachvollziehbar || Approximativ, nicht immer nachvollziehbar&lt;br /&gt;
|-&lt;br /&gt;
| Typischer Einsatz || Große offene Wissensdatenbanken || Unternehmens-Intranets mit Formularen/Workflows || KI-Assistenten, semantische Suche über große Dokumentenmengen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====6. Obsidian als Beispiel für ein natives Graph-Modell====&lt;br /&gt;
Obsidian schließt eine Lücke der bisherigen Beispiele: Es braucht überhaupt keinen Server und keine Datenbank – die Graph-Struktur (Modell 4) entsteht rein client-seitig aus einfachen Textdateien.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Speicherung (Modell 2 Flach + Modell 6 Dokumentenorientiert, ohne jede Datenbank)&#039;&#039;&#039;&lt;br /&gt;
* Jede Notiz ist eine einzelne Markdown-Datei im lokalen Dateisystem (kein MySQL, kein Hibernate, keine Vektordatenbank) – die radikalste Umsetzung von Modell 2 (Flat File) unter allen fünf Beispielen.&lt;br /&gt;
* Metadaten liegen als YAML-Frontmatter direkt in der Datei (ähnlich einer sehr leichtgewichtigen XClass, aber ohne erzwungenes Schema).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Struktur (Modell 4 Graph, nativ und zentral statt Zusatzfeature)&#039;&#039;&#039;&lt;br /&gt;
* Verlinkung erfolgt über `[[Wikilinks]]` direkt im Text. Anders als bei MediaWikis `pagelinks`-Tabelle gibt es keine zentrale Datenbank dafür – der Graph wird beim Öffnen des Vaults aus allen Dateien neu aufgebaut (lokaler Index).&lt;br /&gt;
* Backlinks (eingehende Verweise) werden automatisch berechnet und in der Graph View visualisiert – der Graph ist hier das Kernprodukt, nicht ein Abfallprodukt der Struktur wie bei MediaWiki/XWiki.&lt;br /&gt;
* Es gibt bewusst keine erzwungene Hierarchie (Modell 1): Ordner sind rein organisatorisch, die eigentliche Navigation läuft über Links und Backlinks.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Algorithmen/Programmlogik im Wiki selbst&#039;&#039;&#039;&lt;br /&gt;
* Dataview-Plugin: eine eigene Abfragesprache (DQL, an SQL angelehnt, bzw. JS-basiert), die Frontmatter-Felder über alle Notizen hinweg wie eine Tabelle abfragt – funktional näher an XWQL als an MediaWikis ParserFunctions.&lt;br /&gt;
* Templater-Plugin: JavaScript-Templates für dynamische Notiz-Erstellung (Datumslogik, Platzhalter, bedingte Textbausteine) – das WENN-DANN aus Abschnitt 2, aber clientseitig in JS statt serverseitig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Semantik (Modell 5 nur rudimentär, kein echtes RDF)&#039;&#039;&#039;&lt;br /&gt;
* Frontmatter-Properties (`status: draft`, `tags: [...]`) sind einfache Key-Value-Paare, keine typisierten Tripel wie bei Semantic MediaWiki. Es gibt keine Inferenzmaschine – Schlussfolgerungen (z. B. „alle Notizen mit Tag X, die auf Y verlinken&amp;quot;) müssen über Dataview-Abfragen nachgebaut werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Suche&#039;&#039;&#039;&lt;br /&gt;
* Lokaler Volltextindex, rein clientseitig. Semantische/Vektorsuche (Modell 7) ist nur über Community-Plugins (z. B. Smart Connections) nachrüstbar, nicht im Core.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vollständiger Kurzvergleich:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Aspekt !! MediaWiki !! XWiki !! RAG-System !! Obsidian&lt;br /&gt;
|-&lt;br /&gt;
| Backend || Server + relationale DB || Server + relationale DB (Hibernate) || Server + Vektordatenbank || Kein Server, lokale Dateien&lt;br /&gt;
|-&lt;br /&gt;
| Hierarchie || Optisch + Kategorien (Graph) || Echte Space-Baumstruktur || Keine – nur Vektor-Nähe || Keine – nur Ordner (kosmetisch) + Graph&lt;br /&gt;
|-&lt;br /&gt;
| Strukturierte Daten || Nur per Extension (SMW) || Nativ (XClass/XObject) || Keine feste Struktur (Chunks) || YAML-Frontmatter (informell, kein Schema)&lt;br /&gt;
|-&lt;br /&gt;
| Abfrage || SMW-ASK / Volltext || XWQL / Volltext || Vektor-Ähnlichkeitssuche || Dataview (DQL) / Volltext&lt;br /&gt;
|-&lt;br /&gt;
| Programmlogik || ParserFunctions/Scribunto || Velocity/Groovy || Retrieval-Pipeline + LLM || Templater (JavaScript)&lt;br /&gt;
|-&lt;br /&gt;
| Typischer Einsatz || Große offene Wissensdatenbanken || Unternehmens-Intranets mit Formularen/Workflows || KI-Assistenten, semantische Suche || Persönliches Wissensmanagement (PKM)&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Grundbegriffe_Informatik&amp;diff=43</id>
		<title>Grundbegriffe Informatik</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Grundbegriffe_Informatik&amp;diff=43"/>
		<updated>2026-08-13T11:56:12Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__toc__&lt;br /&gt;
==Grundbegriffe Informatik==&lt;br /&gt;
* Daten,Variablen und Datentypen&lt;br /&gt;
* Datenstrukturen&lt;br /&gt;
* Modelle&lt;br /&gt;
* Algorithmen und Programmlogik&lt;br /&gt;
===Daten===&lt;br /&gt;
====Wissensbasiertes System====&lt;br /&gt;
=====Die Ebenen der Datenverarbeitung=====&lt;br /&gt;
* Faktendaten (Rohdaten &amp;amp; Information):&lt;br /&gt;
* Repräsentiertes Wissen: Strukturierte Daten, die logische Zusammenhänge, Regeln oder Beziehungen beschreiben&lt;br /&gt;
* Metadaten: Daten über die Daten&lt;br /&gt;
=====Typen von Daten in Wissenssystemen=====&lt;br /&gt;
Je nach Architektur und Einsatzzweck des Systems werden unterschiedliche Datenformen genutzt:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A. Regelbasiertes Wissen (Explizites Wissen)&#039;&#039;&#039;&lt;br /&gt;
* Form: „Wenn–Dann“-Regeln (If-Then-Rules).&lt;br /&gt;
* Anwendung: Klassische Expertensysteme (z. B. in der Medizin oder bei der Fehlerdiagnose).&lt;br /&gt;
* Beispiel: &#039;&#039;Wenn der Fehlercode E-101 auftritt und der Druck &amp;gt; 5 bar ist, dann öffne Ventil B.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;B. Strukturierte Wissensgraphen &amp;amp; Ontologien&#039;&#039;&#039;&lt;br /&gt;
* Form: Entitäten (Knoten) und deren Beziehungen (Kanten).&lt;br /&gt;
* Anwendung: Semantic Web, moderne Wiki-Systeme, Enterprise Search.&lt;br /&gt;
* Beispiel: &#039;&#039;[Ahrensburg] --(ist eine Stadt in)--&amp;gt; [Schleswig-Holstein]&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C. Dokumentenbasiertes / Unstrukturiertes Wissen&#039;&#039;&#039;&lt;br /&gt;
* Form: Volltexte, Markdown-Dateien, PDFs, Quellcode, Wiki-Seiten.&lt;br /&gt;
* Anwendung: Wissensmanagement-Plattformen, Dokumentations-Engines.&lt;br /&gt;
* Besonderheit: Oft kombiniert mit Volltext-Indizes oder Schlagwort-Katalogen zur schnellen Durchsuchbarkeit.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;D. Vektor-Daten (für KI &amp;amp; RAG)&#039;&#039;&#039;&lt;br /&gt;
* Form: Einbettungen (Embeddings) – hochdimensionale numerische Vektoren, die die semantische Bedeutung von Texten darstellen.&lt;br /&gt;
* Anwendung: Modernes LLM-basiertes Wissensmanagement (Retrieval-Augmented Generation / RAG).&lt;br /&gt;
* Vorteil: Ermöglicht die Suche nach Bedeutung und Kontext, nicht nur nach exakten Begriffen.&lt;br /&gt;
===Variable===&lt;br /&gt;
====Speicherarten in menschlichen kognitiven Systemen====&lt;br /&gt;
In der Kognitionswissenschaft unterscheidet man bezüglich des veränderbaren (variablen) Wissens vor allem zwei Speicherformen im Langzeitgedächtnis:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Explizites / Deklaratives Wissen (&amp;quot;Wissen, dass&amp;quot;)&#039;&#039;&#039;&lt;br /&gt;
* Episodisches Gedächtnis: Speichert konkrete, zeitlich gebundene Erlebnisse und Ereignisse (z. B. „Gestern habe ich Thema X unterrichtet&amp;quot;).&lt;br /&gt;
* Semantisches Gedächtnis: Speichert allgemeines, dekontextualisiertes Fakten- und Konzeptwissen (z. B. „Ein Verb beschreibt eine Handlung&amp;quot;). Dieses Netz aus Konzepten passt sich dynamisch an, wenn neue Regeln oder Fakten gelernt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Implizites / Prozedurales Wissen (&amp;quot;Wissen, wie&amp;quot;)&#039;&#039;&#039;&lt;br /&gt;
* Speichert Handlungsabläufe und Fertigkeiten (z. B. Grammatikregeln im Sprachgebrauch anwenden). Es verändert sich schrittweise durch Automatisierung und Praxis.&lt;br /&gt;
&lt;br /&gt;
====Speicherungsarten in technischen/digitalen Systemen (KI &amp;amp; Software)====&lt;br /&gt;
Bei variablen Wissenssystemen in der Informatik unterscheidet man hauptsächlich zwei Speicherebenen:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A) Parameter-Speicher (Parametrisches Wissen)&#039;&#039;&#039;&lt;br /&gt;
* Wie gespeichert? In den mathematischen Verknüpfungen (Gewichten) neuronaler Netze.&lt;br /&gt;
* Variabilität: Ändert sich kontinuierlich während des Trainings oder Fine-Tunings. Einmal trainiert, ist dieses Wissen im laufenden Betrieb jedoch oft starr.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;B) Externe Vektor- und Graphdatenbanken (Non-parametrisches Wissen)&#039;&#039;&#039;&lt;br /&gt;
* Wie gespeichert? Informationen werden als Einbettungen (Vectors) oder als semantische Netze (Knowledge Graphs) in Datenbanken abgelegt.&lt;br /&gt;
* Variabilität: Sehr hoch. Neue Daten können jederzeit hinzugefügt, aktualisiert oder gelöscht werden, ohne das Grundmodell neu zu trainieren (z. B. bei RAG-Systemen – Retrieval-Augmented Generation).&lt;br /&gt;
===Datentypen===&lt;br /&gt;
====1. Primitive / Elementare Datentypen====&lt;br /&gt;
Diese bilden die kleinsten Bausteine jedes Systems:&lt;br /&gt;
* Ganzzahlen (Integer): Diskrete Werte ohne Nachkommastellen (z. B. -42, 0, 1024).&lt;br /&gt;
* Gleitkommazahlen (Float, Double): Reelle Zahlen mit Nachkommastellen (z. B. 3.14159).&lt;br /&gt;
* Wahrheitswerte (Boolean): Binärwerte (true / false bzw. 1 / 0).&lt;br /&gt;
* Zeichen &amp;amp; Zeichenketten (Char, String): Textdaten (z. B. &amp;quot;Wissensgraph&amp;quot;).&lt;br /&gt;
* Datum &amp;amp; Zeit (Date, Timestamp): Zeitstempel zur zeitlichen Einordnung von Wissen.&lt;br /&gt;
&lt;br /&gt;
====2. Strukturierte &amp;amp; Komplexe Datentypen====&lt;br /&gt;
Dienen dazu, mehrere Datenpunkte logisch miteinander zu verknüpfen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Datentyp !! Beschreibung !! Beispiel / Anwendungsfall&lt;br /&gt;
|-&lt;br /&gt;
| Listen / Arrays || Geordnete Reihenfolge von Elementen || [1, 2, 3, 5, 8]&lt;br /&gt;
|-&lt;br /&gt;
| Schlüssel-Wert-Paare (Maps / Dictionaries) || Zuordnung von eindeutigen Keys zu Werten || {&amp;quot;Titel&amp;quot;: &amp;quot;Artikel&amp;quot;, &amp;quot;Autor&amp;quot;: &amp;quot;Max&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
| Sätze (Sets) || Ungeordnete Mengen ohne Duplikate || {Rot, Grün, Blau}&lt;br /&gt;
|-&lt;br /&gt;
| JSON / BSON || Hierarchisch strukturierte Dokumente || Ideal für semi-strukturierte Wissenseinträge&lt;br /&gt;
|-&lt;br /&gt;
| Blob / Binary || Unstrukturierte Binärdaten || Bilder, Audio-Dateien, Dokumente&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====3. Semantische Datentypen (Wissensrepräsentation)====&lt;br /&gt;
In modernen Wissenssystemen (z. B. RDF, OWL, Knowledge Graphs) gehen Datentypen über rein technische Formate hinaus und beschreiben Bedeutung und Beziehungen:&lt;br /&gt;
* Entitäten / Ressourcen (URIs/IRIs): Eindeutige Identifikatoren für Objekte, Personen oder Konzepte (z. B. http://example.org/person/Thorsten).&lt;br /&gt;
* Literale: Konkrete Werte, die an Entitäten hängen (oft kombiniert mit XML-Schema-Datentypen wie xsd:string oder xsd:dateTime).&lt;br /&gt;
* Relational- / Kanten-Typen (Predicates): Beschreiben die Art der Beziehung zwischen zwei Entitäten (z. B. istAutorVon, gehörtZuKategorie).&lt;br /&gt;
* Vektoren (Embeddings): Dichte numerische Vektoren, die von KI-Modellen und Vektordatenbanken verwendet werden, um semantische Ähnlichkeit zwischen Texten oder Konzepten abzubilden.&lt;br /&gt;
&lt;br /&gt;
===Datenstrukturen===&lt;br /&gt;
Wissenssysteme (Knowledge Management Systems, Wissensdatenbanken) nutzen je nach Einsatzzweck, Flexibilität und Abfragesprache ganz unterschiedliche Datenstrukturen. Hier ist eine Übersicht der wichtigsten Strukturen – von einfach und unstrukturiert bis hin zu hochkomplex und semantisch vernetzt:&lt;br /&gt;
&lt;br /&gt;
====1. Unstrukturierte &amp;amp; Hierarchische Strukturen====&lt;br /&gt;
&#039;&#039;&#039;Flat Files / Plain Text (Markdown, Wikitext)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Daten liegen in einfachen Textdateien vor (oft mit Frontmatter für Metadaten).&lt;br /&gt;
* Vorteile: Extrem schnell, versionierbar (z. B. via Git), zukunftssicher und ohne Datenbank-Overhead.&lt;br /&gt;
* Einsatz: Static Site Generators (Hugo, Jekyll), moderne Notiz-Systeme (Obsidian, Logseq), flache Dokumentationen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Baumstrukturen &amp;amp; Taxonomien&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Hierarchische Anordnung in Ordnern, Kategorien oder Unterkategorien (Eltern-Kind-Beziehungen).&lt;br /&gt;
* Vorteile: Intuitive Navigation für Menschen, klar abgegrenzte Themenbereiche.&lt;br /&gt;
* Einsatz: Klassische Dateisysteme, Firmen-Wikis, Inhaltsverzeichnisse.&lt;br /&gt;
&lt;br /&gt;
====2. Strukturierte &amp;amp; Relationale Datenstrukturen====&lt;br /&gt;
&#039;&#039;&#039;Relationale Datenbanken (SQL)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Tabellen mit festem Schema, Primär- und Fremdschlüsseln (z. B. PostgreSQL, MySQL).&lt;br /&gt;
* Vorteile: Hohe Datenintegrität (ACID-Konformität), ausgereifte Abfragesprachen, hervorragend für strukturierte Metadaten.&lt;br /&gt;
* Einsatz: Klassische Enterprise-CMS (Drupal, TYPO3), Lernplattformen (Moodle), MediaWiki.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dokumentenorientierte Datenbanken (NoSQL)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Speicherung in semi-strukturierten Formaten wie JSON, BSON oder XML.&lt;br /&gt;
* Vorteile: Flexibles Schema, einfache Skalierbarkeit, schnelle Entwicklung bei sich ändernden Datenmodellen.&lt;br /&gt;
* Einsatz: MongoDB, CouchDB, dynamische Wissensplattformen.&lt;br /&gt;
&lt;br /&gt;
====3. Semantische &amp;amp; Vernetzte Strukturen (Graph-basiert)====&lt;br /&gt;
&#039;&#039;&#039;Eigenschaftsgraphen (Property Graphs)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Knoten (Entitäten) und Kanten (Beziehungen) tragen Schlüssel-Wert-Paare (Attributes).&lt;br /&gt;
* Vorteile: Abfrage von komplexen, tief verschachtelten Zusammenhängen ohne teure SQL-JOINs.&lt;br /&gt;
* Einsatz: Neo4j, Memgraph, Wissensnetze, Empfehlungsdienste.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RDF-Tripel / Semantisches Web (Knowledge Graphs)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Wissen wird in Form von Aussagen-Tripeln gespeichert: Subjekt → Prädikat → Objekt (z. B. „Ahrensburg → liegtIn → Schleswig-Holstein&amp;quot;).&lt;br /&gt;
* Vorteile: Standardisiert (W3C, SPARQL, OWL), erlaubt automatische logische Schlussfolgerungen (Inferenz).&lt;br /&gt;
* Einsatz: Wikidata, DBpedia, Semantic MediaWiki, ontologiebasierte Expertensysteme.&lt;br /&gt;
&lt;br /&gt;
====4. Moderne &amp;amp; Vektorbasierte Strukturen====&lt;br /&gt;
&#039;&#039;&#039;Vektordatenbanken (Embeddings)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Texte oder Objekte werden durch Machine-Learning-Modelle in hochdimensionale Vektoren (Zahlenreihen) umgewandelt.&lt;br /&gt;
* Vorteile: Ermöglicht semantische Suche (Suche nach Bedeutung statt nach exakten Stichwörtern) und Retrieval-Augmented Generation (RAG).&lt;br /&gt;
* Einsatz: Pinecone, Qdrant, Chroma, pgvector für KI-Assistenten und LLM-Erweiterungen.&lt;br /&gt;
===Modelle===&lt;br /&gt;
Während die vorigen Abschnitte einzelne Daten, Datentypen und Datenstrukturen behandeln, beschreibt ein &#039;&#039;&#039;Modell&#039;&#039;&#039; das übergeordnete Ordnungsprinzip, nach dem ganze Wissensbestände organisiert werden. Die folgenden sieben Modelle sind die in der Praxis dominierenden Ansätze, von einfach bis hochformal.&lt;br /&gt;
&lt;br /&gt;
====1. Hierarchisches / Baum-Modell (Tree / Folder Model)====&lt;br /&gt;
* Prinzip: Ordnung über verschachtelte Ordner, Kategorien oder Seitenbäume (Eltern-Kind-Beziehung).&lt;br /&gt;
* Typischer Einsatz: Klassische CMS, Dateisysteme, Notiz-Apps (wie Notion, Confluence).&lt;br /&gt;
* Vorteil: Intuitive Bedienung, klare Navigation.&lt;br /&gt;
* Nachteil: Wissen lässt sich oft nicht eindeutig einem Fachbereich zuordnen (Problem der eierlegenden Wollmilchsau).&lt;br /&gt;
&lt;br /&gt;
====2. Flaches Modell mit Metadaten &amp;amp; Tags (Flat / Key-Value Model)====&lt;br /&gt;
* Prinzip: Alle Dokumente liegen auf einer Ebene (&amp;quot;Flat-File&amp;quot;) und werden über Schlagwörter (Tags), Taxonomien oder Key-Value-Eigenschaften charakterisiert.&lt;br /&gt;
* Typischer Einsatz: Flat-File CMS (z. B. Grav, Kirby), statische Wissensdatenbanken (Markdown-basiert mit Frontmatter).&lt;br /&gt;
* Vorteil: Keine starre Ordnerstruktur, hochgradig durchsuchbar, extrem einfach zu sichern/versionieren (z. B. mit Git).&lt;br /&gt;
* Nachteil: Ohne disziplinierte Verschlagwortung geht die Übersicht schnell verloren.&lt;br /&gt;
&lt;br /&gt;
====3. Relationales Datenmodell (Relational Model / SQL)====&lt;br /&gt;
* Prinzip: Wissen wird in zusammenhängenden Tabellen (Entitäten, Attribute, Fremdschlüssel) strukturiert.&lt;br /&gt;
* Typischer Einsatz: Enterprise-Wikis, Moodle/LMS, strukturierte Unternehmensdatenbanken.&lt;br /&gt;
* Vorteil: Hohe Datenintegrität, komplexe Abfragen über Fremdschlüssel und Tabellenverknüpfungen möglich.&lt;br /&gt;
* Nachteil: Starres Schema; Schemaänderungen bei sich veränderndem Wissen sind aufwendig.&lt;br /&gt;
&lt;br /&gt;
====4. Netzwerk- / Graphen-Modell (Graph Model)====&lt;br /&gt;
* Prinzip: Daten bestehen aus Knoten (Entitäten/Dokumenten) und Kanten (Beziehungen).&lt;br /&gt;
* Typischer Einsatz: Personal Knowledge Management (z. B. Obsidian, Roam Research), Graph-Datenbanken (Neo4j).&lt;br /&gt;
* Vorteil: Spiegelt vernetztes Denken wider. Beziehungen wie &#039;&#039;[Projekt X] --hängt ab von--&amp;gt; [Technologie Y]&#039;&#039; sind native Bestandteile der Datenbank.&lt;br /&gt;
* Nachteil: Schwer zu visualisieren/navigieren bei sehr großen Datenmengen ohne gute Filter.&lt;br /&gt;
&lt;br /&gt;
====5. Semantisches / Triples-Modell (RDF / Knowledge Graph)====&lt;br /&gt;
* Prinzip: Wissen wird in formallogischen Aussagen aus Subjekt – Prädikat – Objekt (Triples) gespeichert (z. B. &#039;&#039;[MediaWiki] [verwendet] [PostgreSQL]&#039;&#039;).&lt;br /&gt;
* Typischer Einsatz: Semantic MediaWiki, Wikidata, Ontologie-Systeme (OWL, RDF/SPARQL).&lt;br /&gt;
* Vorteil: Maschinenlesbar, erlaubt automatische logische Rückschlüsse (Inferenz) und komplexe semantische Abfragen.&lt;br /&gt;
* Nachteil: Hohe Einarbeitungszeit und formale Komplexität beim Erstellen der Ontologien.&lt;br /&gt;
&lt;br /&gt;
====6. Dokumentenorientiertes Modell (NoSQL / JSON)====&lt;br /&gt;
* Prinzip: Ein Wissenselement ist ein eigenständiges, strukturiertes Dokument (z. B. JSON/YAML), das eingebettete Attribute und Arrays enthält.&lt;br /&gt;
* Typischer Einsatz: CouchDB, MongoDB, elasticsearch-basierte Wissensspeicher.&lt;br /&gt;
* Vorteil: Flexibles Schema; jedes Dokument kann individuelle Felder haben, ohne das Gesamtsystem zu blockieren.&lt;br /&gt;
* Nachteil: Redundanzen bei Datenbanksicherungen, schwächere Konsistenzprüfungen als bei SQL.&lt;br /&gt;
&lt;br /&gt;
====7. Vektorraum-Modell (Embedding / Latent Space Model)====&lt;br /&gt;
* Prinzip: Wissen wird nicht symbolisch, sondern als Position in einem hochdimensionalen Vektorraum repräsentiert; semantische Nähe entspricht geometrischer Nähe (siehe auch [[#Vektor-Daten (für KI &amp;amp; RAG)|Vektor-Daten]] weiter oben).&lt;br /&gt;
* Typischer Einsatz: Retrieval-Augmented Generation (RAG), semantische Suche, Empfehlungssysteme (Pinecone, Qdrant, pgvector).&lt;br /&gt;
* Vorteil: Findet Zusammenhänge über Bedeutung statt exakter Begriffe, robust gegenüber Synonymen und unscharfen Anfragen.&lt;br /&gt;
* Nachteil: Nicht direkt interpretierbar (&amp;quot;Black Box&amp;quot;), keine expliziten Regeln oder Beziehungen wie im Graphen-Modell.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; In der Praxis werden diese Modelle selten pur eingesetzt, sondern kombiniert – dieses Wiki selbst ist ein Beispiel: Es nutzt eine Baumstruktur (Modell 1, über die `==`/`===`-Überschriften), liegt aber als flache, versionierte Textdatei vor (Modell 2).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Nr. !! Modell !! Kernprinzip !! Größter Vorteil !! Größter Nachteil&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Hierarchisch (Baum) || Eltern-Kind-Verschachtelung || Intuitive Navigation || Eindeutige Einordnung oft unmöglich&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Flach mit Tags || Ebene Dateien + Metadaten || Einfach, git-versionierbar || Erfordert Tagging-Disziplin&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Relational (SQL) || Tabellen + Fremdschlüssel || Hohe Datenintegrität || Starres Schema&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Graph (Property Graph) || Knoten + Kanten || Bildet vernetztes Denken ab || Schwer visualisierbar bei großer Skala&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Semantisch (RDF/Triples) || Subjekt–Prädikat–Objekt || Maschinelle Inferenz möglich || Hoher Formalisierungsaufwand&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Dokumentenorientiert (NoSQL) || Eigenständige JSON-Dokumente || Flexibles Schema || Schwächere Konsistenzprüfung&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Vektorraum (Embeddings) || Position im semantischen Raum || Suche nach Bedeutung statt Begriff || Nicht direkt interpretierbar&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Algorithmen und Programmlogik===&lt;br /&gt;
Wenn es darum geht, Algorithmen und Programmlogik bildhaft, strukturiert oder regelbasiert darzustellen, unterscheidet man zwischen visuellen Repräsentationsformen (zur Dokumentation und Planung) und formalen Wissenssystemen (zur automatischen Verarbeitung).&lt;br /&gt;
&lt;br /&gt;
====1. Visuelle Wissenssysteme &amp;amp; Graphische Modelle====&lt;br /&gt;
Diese Systeme helfen Entwicklern und Lernenden, die Logik eines Programms unabhängig von einer konkreten Programmiersprache zu visualisieren.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! System / Modell !! Einsatzbereich !! Besonderheit / Logikbausteine&lt;br /&gt;
|-&lt;br /&gt;
| Nassi-Shneiderman-Diagramm (Struktogramm) || Strukturierte Programmierung, Lehre &amp;amp; Didaktik || Vermeidet Unordnung (kein Pfeilsalat). Basiert auf Sequenz, Auswahl (If-Else) und Wiederholung (Schleifen).&lt;br /&gt;
|-&lt;br /&gt;
| Programmablaufplan (PAP) / Flowchart || Prozessvisualisierung, technische Abläufe || Klassisches Flussdiagramm (DIN 66001) mit Pfeilen, Rauten für Entscheidungen und Rechtecken für Aktionen.&lt;br /&gt;
|-&lt;br /&gt;
| UML-Aktivitätsdiagramm || Software-Engineering, objektorientiertes Design || Standard in der Industrie. Zeigt komplexe Kontroll- und Datenflüsse inklusive paralleler Verzweigungen.&lt;br /&gt;
|-&lt;br /&gt;
| Entscheidungstabellen || Komplexe Geschäftslogik &amp;amp; Regelwerke || Stellt alle möglichen Bedingungen und daraus resultierende Aktionen in Tabellenform gegenüber.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====2. Formale &amp;amp; Regelbasierte Wissenssysteme====&lt;br /&gt;
Diese Systeme dienen nicht nur der Visualisierung, sondern führen Programmlogik und Regeln direkt aus:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Regelbasierte Systeme &amp;amp; Expertensysteme&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Wissen wird in Form von Fakten und Logikregeln (WENN Bedingung DANN Aktion) gespeichert. Eine Inferenzmaschine (Inference Engine) wertet diese Logik aus.&lt;br /&gt;
* Beispiele:&lt;br /&gt;
** Prolog: Deklarative Programmierung basierend auf Prädikatenlogik.&lt;br /&gt;
** Drools / Business Rules Engines: Für komplexe Geschäftsregeln im Unternehmensumfeld.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pseudocode &amp;amp; Algorithmen-Markup&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Eine strukturierte, halbsprachliche Beschreibung von Logik. Er kombiniert natürliche Sprache mit Elementen höherer Programmiersprachen.&lt;br /&gt;
* Vorteil: Unabhängig von Syntaxfehlern und konzentriert auf das reine Problemlösungsmuster.&lt;br /&gt;
&lt;br /&gt;
====3. MediaWiki als Referenzimplementierung====&lt;br /&gt;
Ein echtes MediaWiki (die Software hinter Wikipedia) setzt praktisch alle in diesem Wiki beschriebenen Modelle gleichzeitig um – nur an unterschiedlichen Stellen der Architektur:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Speicherung (Modell 3 Relational + Modell 6 Dokumentenorientiert)&#039;&#039;&#039;&lt;br /&gt;
* Jede Seite ist ein Dokument (Wikitext-Blob), die Metadaten drumherum sind relational organisiert.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tabelle !! Inhalt&lt;br /&gt;
|-&lt;br /&gt;
| page || Titel, Namespace, Status je Seite&lt;br /&gt;
|-&lt;br /&gt;
| revision || Jede Version einer Seite (Autor, Zeitstempel) – die Versionierung&lt;br /&gt;
|-&lt;br /&gt;
| text / slots || Der eigentliche Wikitext-Blob – unstrukturiert, wie ein Dokument&lt;br /&gt;
|-&lt;br /&gt;
| page_props || Frei erweiterbare Key-Value-Metadaten pro Seite&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Struktur der Überschriften (Modell 1 Baum – nur optisch)&#039;&#039;&#039;&lt;br /&gt;
* `==`, `===`, `====` erzeugen keine echte Baumstruktur in der Datenbank, sondern werden zur Laufzeit nur zu einem Inhaltsverzeichnis (`&amp;lt;h2&amp;gt;`, `&amp;lt;h3&amp;gt;`, …) mit Anchor-Links geparst.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kategorien &amp;amp; Links (Modell 4 Graph + Modell 2 Flach/Tags)&#039;&#039;&#039;&lt;br /&gt;
* Intern ist MediaWiki ein Graph, kein Baum: die Tabelle `pagelinks` speichert, wer auf wen verlinkt (`[[Ziel]]`), `categorylinks`, welche Seite zu welcher Kategorie gehört, `templatelinks`, welche Seite welche Vorlage einbindet.&lt;br /&gt;
* Kategorien funktionieren wie Tags (flach + Metadaten), erlauben durch Verschachtelung aber auch baumartige Navigation – eine Seite kann in mehreren Kategorien gleichzeitig stehen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Semantik (Modell 5 RDF/Triples)&#039;&#039;&#039;&lt;br /&gt;
* Nicht Core-MediaWiki, sondern die Extension Semantic MediaWiki (SMW): Annotationen wie `[[liegt in::Schleswig-Holstein]]` werden zu echten RDF-Tripeln (Subjekt–Prädikat–Objekt), abgelegt in eigenen SQL-Tabellen und exportierbar als RDF/OWL. `ASK`-Abfragen (SPARQL-ähnlich) werden damit direkt im Wikitext möglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Algorithmen/Programmlogik im Wiki selbst&#039;&#039;&#039;&lt;br /&gt;
* ParserFunctions-Extension: `{{#if: Bedingung | Dann | Sonst}}`, `{{#switch: ... }}` – die praktische Umsetzung des „WENN Bedingung DANN Aktion&amp;quot;-Regelsystems, direkt im Wikitext ausführbar.&lt;br /&gt;
* Scribunto (Lua-Module): vollwertige Programmlogik innerhalb von Vorlagen – die Inferenzmaschine für Fälle, die ParserFunctions nicht mehr abbilden.&lt;br /&gt;
* Templates (`{{Vorlage|Parameter}}`): parametrisierter Pseudocode – wiederverwendbare Logikbausteine, die beim Rendern expandiert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Suche (Modell 7 Vektorraum, meist als Erweiterung)&#039;&#039;&#039;&lt;br /&gt;
* Core-MediaWiki bietet nur einfache Volltextsuche. Für semantische/Vektorsuche braucht es Extensions wie CirrusSearch (Elasticsearch) oder KI-gestützte Erweiterungen mit Embeddings – nativ ist das nicht vorgesehen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kurz zusammengefasst als Pipeline:&#039;&#039;&#039;&lt;br /&gt;
* Wikitext (Dokument, Modell 6) → Parser/Präprozessor (Templates/Scribunto = Algorithmen) → HTML-Rendering (Baum-Optik, Modell 1) → gespeichert in relationaler DB (Modell 3) → verknüpft über pagelinks/categorylinks (Graph, Modell 4; Tags, Modell 2) → optional angereichert um SMW-Tripel (Modell 5) und Suchindex/Embeddings (Modell 7).&lt;br /&gt;
&lt;br /&gt;
====4. XWiki als weiteres Beispiel====&lt;br /&gt;
XWiki (Java-basiert) verfolgt einen anderen Architekturansatz als MediaWiki und deckt die Modelle an anderen Stellen ab – vor allem, weil Struktur und Daten dort von Anfang an enger verzahnt sind:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Speicherung (Modell 3 Relational + Modell 6 Dokumentenorientiert, aber enger verzahnt)&#039;&#039;&#039;&lt;br /&gt;
* Über Hibernate ORM auf einer relationalen DB (standardmäßig) abgelegt. Jede Seite (`XWikiDocument`) ist zwar ein Dokument, trägt aber – anders als bei MediaWiki – strukturierte Daten direkt eingebettet statt nur als loser Freitext-Blob.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Echte Hierarchie (Modell 1 Baum, nicht nur optisch)&#039;&#039;&#039;&lt;br /&gt;
* XWiki-Seiten leben in verschachtelten Spaces (`Space.SubSpace.Seite`) – eine tatsächliche Baumstruktur in der Datenbank, kein bloß optisches Inhaltsverzeichnis wie bei MediaWikis `==`-Überschriften. Navigation und Rechteverwaltung (Berechtigungen vererben sich space-weise) folgen dieser echten Hierarchie.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;XClass / XObject – das Kernfeature (Modell 3 Relational, nativ statt per Extension)&#039;&#039;&#039;&lt;br /&gt;
* Jede Seite kann strukturierte, typisierte Datensätze (XObjects) tragen, deren Schema in einer XClass definiert ist – im Grunde eine pro Seite eingebettete Tabellenzeile mit festem Schema (Felder, Typen, Pflichtfelder).&lt;br /&gt;
* Damit sind Wissenseinträge gleichzeitig Dokument (Freitext) und Datensatz (strukturierte Felder) – MediaWiki braucht dafür die Extension Semantic MediaWiki, XWiki hat das nativ im Core.&lt;br /&gt;
* Abfragen darüber laufen über XWQL (XWiki Query Language, HQL/JPQL-artig) – SQL-ähnliche Abfragen direkt über die Wissensbasis, ohne SPARQL-Umweg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Algorithmen/Programmlogik im Wiki selbst&#039;&#039;&#039;&lt;br /&gt;
* Velocity- und Groovy-Skripte direkt in Seiten eingebettet (`#if()`, `#foreach()`, `$doc.getObject(...)`) – vollwertige Programmlogik, näher an einer richtigen Skriptsprache als MediaWikis ParserFunctions.&lt;br /&gt;
* Wiki-Makros (ähnlich Templates) kapseln wiederverwendbare Logik, können aber – weil Java-basiert – auch komplexe Berechnungen und Datenbankzugriffe direkt ausführen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Suche&#039;&#039;&#039;&lt;br /&gt;
* Solr/Lucene-basierte Volltext- und Facettensuche ist im Core enthalten (kein Extension-Zwang wie CirrusSearch bei MediaWiki); neuere Erweiterungen ergänzen KI-gestützte/semantische Suche mit Embeddings.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kurzvergleich MediaWiki vs. XWiki:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Aspekt !! MediaWiki !! XWiki&lt;br /&gt;
|-&lt;br /&gt;
| Hierarchie || Optisch über Überschriften, echte Struktur nur via Kategorien (Graph) || Echte verschachtelte Space-Baumstruktur&lt;br /&gt;
|-&lt;br /&gt;
| Strukturierte Daten (Modell 3/5) || Nur per Extension (Semantic MediaWiki) || Nativ im Core (XClass/XObject)&lt;br /&gt;
|-&lt;br /&gt;
| Abfragesprache || SMW-ASK (SPARQL-ähnlich, Extension) || XWQL (SQL-ähnlich, Core)&lt;br /&gt;
|-&lt;br /&gt;
| Programmlogik || ParserFunctions/Scribunto (Lua) || Velocity/Groovy (Java-Ökosystem)&lt;br /&gt;
|-&lt;br /&gt;
| Typischer Einsatz || Große offene Wissensdatenbanken (Wikipedia) || Unternehmens-Intranets mit strukturierten Formularen/Workflows&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====5. Beispiel: KI &amp;amp; RAG-Wissenssystem====&lt;br /&gt;
Ein modernes RAG-System (Retrieval-Augmented Generation) verfolgt einen grundlegend anderen Ansatz als MediaWiki und XWiki: Statt Wissen über explizite Struktur (Baum, Kategorien, XClass) zu ordnen, wird es über semantische Nähe im Vektorraum (Modell 7) auffindbar gemacht – die Struktur der vorigen Beispiele fehlt hier größtenteils.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Speicherung (Modell 7 Vektorraum + Modell 6 Dokumentenorientiert)&#039;&#039;&#039;&lt;br /&gt;
* Quelldokumente (Wiki-Seiten, PDFs, Markdown) werden in Chunks zerlegt und über ein Embedding-Modell in hochdimensionale Vektoren umgewandelt.&lt;br /&gt;
* Abgelegt in einer Vektordatenbank (Pinecone, Qdrant, Chroma, pgvector) – meist zusammen mit dem Originaltext als Payload/Metadaten, also weiterhin dokumentbasiert im Hintergrund.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Struktur (keine echte Hierarchie – Gegenteil von Modell 1)&#039;&#039;&#039;&lt;br /&gt;
* Es gibt keinen Seitenbaum und keine Kategorien wie bei MediaWiki/XWiki. Auffindbarkeit entsteht rein durch geometrische Nähe im Vektorraum, nicht durch Navigation oder Verlinkung.&lt;br /&gt;
* Optional wird das mit einem Graph (Modell 4, „GraphRAG&amp;quot;) oder mit Metadaten-Filtern (Modell 2, Tags) kombiniert, um reine Vektorsuche zu verbessern.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Algorithmen/Programmlogik – die eigentliche RAG-Pipeline&#039;&#039;&#039;&lt;br /&gt;
* Anfrage (Query) → Embedding der Anfrage → Ähnlichkeitssuche (z. B. Cosinus-Ähnlichkeit) in der Vektordatenbank → Top-k relevante Chunks abrufen → Re-Ranking (optional) → Chunks als Kontext in den Prompt einfügen → LLM generiert Antwort.&lt;br /&gt;
* Das ist funktional das Gegenstück zur „Inferenzmaschine&amp;quot; der regelbasierten Systeme (Abschnitt 2): statt fester WENN-DANN-Regeln wertet hier ein neuronales Netz statistische Ähnlichkeit aus – nicht deterministisch, sondern approximativ.&lt;br /&gt;
* Agenten-Frameworks (LangChain, LlamaIndex) übernehmen die Rolle von Templates/Makros: wiederverwendbare, parametrisierte Ablaufbausteine für Retrieval, Re-Ranking und Prompt-Konstruktion.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Semantik (implizit statt explizit – Gegenteil von Modell 5)&#039;&#039;&#039;&lt;br /&gt;
* Anders als RDF-Tripel (Subjekt–Prädikat–Objekt, explizit und maschinenlesbar) ist die „Semantik&amp;quot; eines Embeddings nicht symbolisch, sondern eine gelernte, nicht direkt interpretierbare Position im Vektorraum („Black Box&amp;quot;, vgl. Modell 7 im Abschnitt „Modelle&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Suche (Modell 7 nativ statt Extension)&#039;&#039;&#039;&lt;br /&gt;
* Semantische Suche ist hier kein Zusatzfeature (wie CirrusSearch bei MediaWiki), sondern der gesamte Zweck des Systems.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Erweiterter Kurzvergleich:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Aspekt !! MediaWiki !! XWiki !! RAG-System&lt;br /&gt;
|-&lt;br /&gt;
| Hierarchie || Optisch + Kategorien (Graph) || Echte Space-Baumstruktur || Keine – nur Vektor-Nähe (optional + Graph/Tags)&lt;br /&gt;
|-&lt;br /&gt;
| Strukturierte Daten || Nur per Extension (SMW) || Nativ (XClass/XObject) || Keine feste Struktur, nur Chunks + Embeddings&lt;br /&gt;
|-&lt;br /&gt;
| Abfrage || SMW-ASK / Volltext || XWQL / Volltext || Vektor-Ähnlichkeitssuche (semantisch)&lt;br /&gt;
|-&lt;br /&gt;
| Programmlogik || ParserFunctions/Scribunto || Velocity/Groovy || Retrieval-Pipeline + LLM (LangChain/LlamaIndex)&lt;br /&gt;
|-&lt;br /&gt;
| Ergebnis-Charakter || Deterministisch, nachvollziehbar || Deterministisch, nachvollziehbar || Approximativ, nicht immer nachvollziehbar&lt;br /&gt;
|-&lt;br /&gt;
| Typischer Einsatz || Große offene Wissensdatenbanken || Unternehmens-Intranets mit Formularen/Workflows || KI-Assistenten, semantische Suche über große Dokumentenmengen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====6. Obsidian als Beispiel für ein natives Graph-Modell====&lt;br /&gt;
Obsidian schließt eine Lücke der bisherigen Beispiele: Es braucht überhaupt keinen Server und keine Datenbank – die Graph-Struktur (Modell 4) entsteht rein client-seitig aus einfachen Textdateien.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Speicherung (Modell 2 Flach + Modell 6 Dokumentenorientiert, ohne jede Datenbank)&#039;&#039;&#039;&lt;br /&gt;
* Jede Notiz ist eine einzelne Markdown-Datei im lokalen Dateisystem (kein MySQL, kein Hibernate, keine Vektordatenbank) – die radikalste Umsetzung von Modell 2 (Flat File) unter allen fünf Beispielen.&lt;br /&gt;
* Metadaten liegen als YAML-Frontmatter direkt in der Datei (ähnlich einer sehr leichtgewichtigen XClass, aber ohne erzwungenes Schema).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Struktur (Modell 4 Graph, nativ und zentral statt Zusatzfeature)&#039;&#039;&#039;&lt;br /&gt;
* Verlinkung erfolgt über `[[Wikilinks]]` direkt im Text. Anders als bei MediaWikis `pagelinks`-Tabelle gibt es keine zentrale Datenbank dafür – der Graph wird beim Öffnen des Vaults aus allen Dateien neu aufgebaut (lokaler Index).&lt;br /&gt;
* Backlinks (eingehende Verweise) werden automatisch berechnet und in der Graph View visualisiert – der Graph ist hier das Kernprodukt, nicht ein Abfallprodukt der Struktur wie bei MediaWiki/XWiki.&lt;br /&gt;
* Es gibt bewusst keine erzwungene Hierarchie (Modell 1): Ordner sind rein organisatorisch, die eigentliche Navigation läuft über Links und Backlinks.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Algorithmen/Programmlogik im Wiki selbst&#039;&#039;&#039;&lt;br /&gt;
* Dataview-Plugin: eine eigene Abfragesprache (DQL, an SQL angelehnt, bzw. JS-basiert), die Frontmatter-Felder über alle Notizen hinweg wie eine Tabelle abfragt – funktional näher an XWQL als an MediaWikis ParserFunctions.&lt;br /&gt;
* Templater-Plugin: JavaScript-Templates für dynamische Notiz-Erstellung (Datumslogik, Platzhalter, bedingte Textbausteine) – das WENN-DANN aus Abschnitt 2, aber clientseitig in JS statt serverseitig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Semantik (Modell 5 nur rudimentär, kein echtes RDF)&#039;&#039;&#039;&lt;br /&gt;
* Frontmatter-Properties (`status: draft`, `tags: [...]`) sind einfache Key-Value-Paare, keine typisierten Tripel wie bei Semantic MediaWiki. Es gibt keine Inferenzmaschine – Schlussfolgerungen (z. B. „alle Notizen mit Tag X, die auf Y verlinken&amp;quot;) müssen über Dataview-Abfragen nachgebaut werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Suche&#039;&#039;&#039;&lt;br /&gt;
* Lokaler Volltextindex, rein clientseitig. Semantische/Vektorsuche (Modell 7) ist nur über Community-Plugins (z. B. Smart Connections) nachrüstbar, nicht im Core.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vollständiger Kurzvergleich:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Aspekt !! MediaWiki !! XWiki !! RAG-System !! Obsidian&lt;br /&gt;
|-&lt;br /&gt;
| Backend || Server + relationale DB || Server + relationale DB (Hibernate) || Server + Vektordatenbank || Kein Server, lokale Dateien&lt;br /&gt;
|-&lt;br /&gt;
| Hierarchie || Optisch + Kategorien (Graph) || Echte Space-Baumstruktur || Keine – nur Vektor-Nähe || Keine – nur Ordner (kosmetisch) + Graph&lt;br /&gt;
|-&lt;br /&gt;
| Strukturierte Daten || Nur per Extension (SMW) || Nativ (XClass/XObject) || Keine feste Struktur (Chunks) || YAML-Frontmatter (informell, kein Schema)&lt;br /&gt;
|-&lt;br /&gt;
| Abfrage || SMW-ASK / Volltext || XWQL / Volltext || Vektor-Ähnlichkeitssuche || Dataview (DQL) / Volltext&lt;br /&gt;
|-&lt;br /&gt;
| Programmlogik || ParserFunctions/Scribunto || Velocity/Groovy || Retrieval-Pipeline + LLM || Templater (JavaScript)&lt;br /&gt;
|-&lt;br /&gt;
| Typischer Einsatz || Große offene Wissensdatenbanken || Unternehmens-Intranets mit Formularen/Workflows || KI-Assistenten, semantische Suche || Persönliches Wissensmanagement (PKM)&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Grundbegriffe_Informatik&amp;diff=42</id>
		<title>Grundbegriffe Informatik</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Grundbegriffe_Informatik&amp;diff=42"/>
		<updated>2026-08-13T11:55:38Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
==Grundbegriffe Informatik==&lt;br /&gt;
* Daten,Variablen und Datentypen&lt;br /&gt;
* Datenstrukturen&lt;br /&gt;
* Modelle&lt;br /&gt;
* Algorithmen und Programmlogik&lt;br /&gt;
===Daten===&lt;br /&gt;
====Wissensbasiertes System====&lt;br /&gt;
=====Die Ebenen der Datenverarbeitung=====&lt;br /&gt;
* Faktendaten (Rohdaten &amp;amp; Information):&lt;br /&gt;
* Repräsentiertes Wissen: Strukturierte Daten, die logische Zusammenhänge, Regeln oder Beziehungen beschreiben&lt;br /&gt;
* Metadaten: Daten über die Daten&lt;br /&gt;
=====Typen von Daten in Wissenssystemen=====&lt;br /&gt;
Je nach Architektur und Einsatzzweck des Systems werden unterschiedliche Datenformen genutzt:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A. Regelbasiertes Wissen (Explizites Wissen)&#039;&#039;&#039;&lt;br /&gt;
* Form: „Wenn–Dann“-Regeln (If-Then-Rules).&lt;br /&gt;
* Anwendung: Klassische Expertensysteme (z. B. in der Medizin oder bei der Fehlerdiagnose).&lt;br /&gt;
* Beispiel: &#039;&#039;Wenn der Fehlercode E-101 auftritt und der Druck &amp;gt; 5 bar ist, dann öffne Ventil B.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;B. Strukturierte Wissensgraphen &amp;amp; Ontologien&#039;&#039;&#039;&lt;br /&gt;
* Form: Entitäten (Knoten) und deren Beziehungen (Kanten).&lt;br /&gt;
* Anwendung: Semantic Web, moderne Wiki-Systeme, Enterprise Search.&lt;br /&gt;
* Beispiel: &#039;&#039;[Ahrensburg] --(ist eine Stadt in)--&amp;gt; [Schleswig-Holstein]&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C. Dokumentenbasiertes / Unstrukturiertes Wissen&#039;&#039;&#039;&lt;br /&gt;
* Form: Volltexte, Markdown-Dateien, PDFs, Quellcode, Wiki-Seiten.&lt;br /&gt;
* Anwendung: Wissensmanagement-Plattformen, Dokumentations-Engines.&lt;br /&gt;
* Besonderheit: Oft kombiniert mit Volltext-Indizes oder Schlagwort-Katalogen zur schnellen Durchsuchbarkeit.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;D. Vektor-Daten (für KI &amp;amp; RAG)&#039;&#039;&#039;&lt;br /&gt;
* Form: Einbettungen (Embeddings) – hochdimensionale numerische Vektoren, die die semantische Bedeutung von Texten darstellen.&lt;br /&gt;
* Anwendung: Modernes LLM-basiertes Wissensmanagement (Retrieval-Augmented Generation / RAG).&lt;br /&gt;
* Vorteil: Ermöglicht die Suche nach Bedeutung und Kontext, nicht nur nach exakten Begriffen.&lt;br /&gt;
===Variable===&lt;br /&gt;
====Speicherarten in menschlichen kognitiven Systemen====&lt;br /&gt;
In der Kognitionswissenschaft unterscheidet man bezüglich des veränderbaren (variablen) Wissens vor allem zwei Speicherformen im Langzeitgedächtnis:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Explizites / Deklaratives Wissen (&amp;quot;Wissen, dass&amp;quot;)&#039;&#039;&#039;&lt;br /&gt;
* Episodisches Gedächtnis: Speichert konkrete, zeitlich gebundene Erlebnisse und Ereignisse (z. B. „Gestern habe ich Thema X unterrichtet&amp;quot;).&lt;br /&gt;
* Semantisches Gedächtnis: Speichert allgemeines, dekontextualisiertes Fakten- und Konzeptwissen (z. B. „Ein Verb beschreibt eine Handlung&amp;quot;). Dieses Netz aus Konzepten passt sich dynamisch an, wenn neue Regeln oder Fakten gelernt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Implizites / Prozedurales Wissen (&amp;quot;Wissen, wie&amp;quot;)&#039;&#039;&#039;&lt;br /&gt;
* Speichert Handlungsabläufe und Fertigkeiten (z. B. Grammatikregeln im Sprachgebrauch anwenden). Es verändert sich schrittweise durch Automatisierung und Praxis.&lt;br /&gt;
&lt;br /&gt;
====Speicherungsarten in technischen/digitalen Systemen (KI &amp;amp; Software)====&lt;br /&gt;
Bei variablen Wissenssystemen in der Informatik unterscheidet man hauptsächlich zwei Speicherebenen:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A) Parameter-Speicher (Parametrisches Wissen)&#039;&#039;&#039;&lt;br /&gt;
* Wie gespeichert? In den mathematischen Verknüpfungen (Gewichten) neuronaler Netze.&lt;br /&gt;
* Variabilität: Ändert sich kontinuierlich während des Trainings oder Fine-Tunings. Einmal trainiert, ist dieses Wissen im laufenden Betrieb jedoch oft starr.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;B) Externe Vektor- und Graphdatenbanken (Non-parametrisches Wissen)&#039;&#039;&#039;&lt;br /&gt;
* Wie gespeichert? Informationen werden als Einbettungen (Vectors) oder als semantische Netze (Knowledge Graphs) in Datenbanken abgelegt.&lt;br /&gt;
* Variabilität: Sehr hoch. Neue Daten können jederzeit hinzugefügt, aktualisiert oder gelöscht werden, ohne das Grundmodell neu zu trainieren (z. B. bei RAG-Systemen – Retrieval-Augmented Generation).&lt;br /&gt;
===Datentypen===&lt;br /&gt;
====1. Primitive / Elementare Datentypen====&lt;br /&gt;
Diese bilden die kleinsten Bausteine jedes Systems:&lt;br /&gt;
* Ganzzahlen (Integer): Diskrete Werte ohne Nachkommastellen (z. B. -42, 0, 1024).&lt;br /&gt;
* Gleitkommazahlen (Float, Double): Reelle Zahlen mit Nachkommastellen (z. B. 3.14159).&lt;br /&gt;
* Wahrheitswerte (Boolean): Binärwerte (true / false bzw. 1 / 0).&lt;br /&gt;
* Zeichen &amp;amp; Zeichenketten (Char, String): Textdaten (z. B. &amp;quot;Wissensgraph&amp;quot;).&lt;br /&gt;
* Datum &amp;amp; Zeit (Date, Timestamp): Zeitstempel zur zeitlichen Einordnung von Wissen.&lt;br /&gt;
&lt;br /&gt;
====2. Strukturierte &amp;amp; Komplexe Datentypen====&lt;br /&gt;
Dienen dazu, mehrere Datenpunkte logisch miteinander zu verknüpfen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Datentyp !! Beschreibung !! Beispiel / Anwendungsfall&lt;br /&gt;
|-&lt;br /&gt;
| Listen / Arrays || Geordnete Reihenfolge von Elementen || [1, 2, 3, 5, 8]&lt;br /&gt;
|-&lt;br /&gt;
| Schlüssel-Wert-Paare (Maps / Dictionaries) || Zuordnung von eindeutigen Keys zu Werten || {&amp;quot;Titel&amp;quot;: &amp;quot;Artikel&amp;quot;, &amp;quot;Autor&amp;quot;: &amp;quot;Max&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
| Sätze (Sets) || Ungeordnete Mengen ohne Duplikate || {Rot, Grün, Blau}&lt;br /&gt;
|-&lt;br /&gt;
| JSON / BSON || Hierarchisch strukturierte Dokumente || Ideal für semi-strukturierte Wissenseinträge&lt;br /&gt;
|-&lt;br /&gt;
| Blob / Binary || Unstrukturierte Binärdaten || Bilder, Audio-Dateien, Dokumente&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====3. Semantische Datentypen (Wissensrepräsentation)====&lt;br /&gt;
In modernen Wissenssystemen (z. B. RDF, OWL, Knowledge Graphs) gehen Datentypen über rein technische Formate hinaus und beschreiben Bedeutung und Beziehungen:&lt;br /&gt;
* Entitäten / Ressourcen (URIs/IRIs): Eindeutige Identifikatoren für Objekte, Personen oder Konzepte (z. B. http://example.org/person/Thorsten).&lt;br /&gt;
* Literale: Konkrete Werte, die an Entitäten hängen (oft kombiniert mit XML-Schema-Datentypen wie xsd:string oder xsd:dateTime).&lt;br /&gt;
* Relational- / Kanten-Typen (Predicates): Beschreiben die Art der Beziehung zwischen zwei Entitäten (z. B. istAutorVon, gehörtZuKategorie).&lt;br /&gt;
* Vektoren (Embeddings): Dichte numerische Vektoren, die von KI-Modellen und Vektordatenbanken verwendet werden, um semantische Ähnlichkeit zwischen Texten oder Konzepten abzubilden.&lt;br /&gt;
&lt;br /&gt;
===Datenstrukturen===&lt;br /&gt;
Wissenssysteme (Knowledge Management Systems, Wissensdatenbanken) nutzen je nach Einsatzzweck, Flexibilität und Abfragesprache ganz unterschiedliche Datenstrukturen. Hier ist eine Übersicht der wichtigsten Strukturen – von einfach und unstrukturiert bis hin zu hochkomplex und semantisch vernetzt:&lt;br /&gt;
&lt;br /&gt;
====1. Unstrukturierte &amp;amp; Hierarchische Strukturen====&lt;br /&gt;
&#039;&#039;&#039;Flat Files / Plain Text (Markdown, Wikitext)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Daten liegen in einfachen Textdateien vor (oft mit Frontmatter für Metadaten).&lt;br /&gt;
* Vorteile: Extrem schnell, versionierbar (z. B. via Git), zukunftssicher und ohne Datenbank-Overhead.&lt;br /&gt;
* Einsatz: Static Site Generators (Hugo, Jekyll), moderne Notiz-Systeme (Obsidian, Logseq), flache Dokumentationen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Baumstrukturen &amp;amp; Taxonomien&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Hierarchische Anordnung in Ordnern, Kategorien oder Unterkategorien (Eltern-Kind-Beziehungen).&lt;br /&gt;
* Vorteile: Intuitive Navigation für Menschen, klar abgegrenzte Themenbereiche.&lt;br /&gt;
* Einsatz: Klassische Dateisysteme, Firmen-Wikis, Inhaltsverzeichnisse.&lt;br /&gt;
&lt;br /&gt;
====2. Strukturierte &amp;amp; Relationale Datenstrukturen====&lt;br /&gt;
&#039;&#039;&#039;Relationale Datenbanken (SQL)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Tabellen mit festem Schema, Primär- und Fremdschlüsseln (z. B. PostgreSQL, MySQL).&lt;br /&gt;
* Vorteile: Hohe Datenintegrität (ACID-Konformität), ausgereifte Abfragesprachen, hervorragend für strukturierte Metadaten.&lt;br /&gt;
* Einsatz: Klassische Enterprise-CMS (Drupal, TYPO3), Lernplattformen (Moodle), MediaWiki.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dokumentenorientierte Datenbanken (NoSQL)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Speicherung in semi-strukturierten Formaten wie JSON, BSON oder XML.&lt;br /&gt;
* Vorteile: Flexibles Schema, einfache Skalierbarkeit, schnelle Entwicklung bei sich ändernden Datenmodellen.&lt;br /&gt;
* Einsatz: MongoDB, CouchDB, dynamische Wissensplattformen.&lt;br /&gt;
&lt;br /&gt;
====3. Semantische &amp;amp; Vernetzte Strukturen (Graph-basiert)====&lt;br /&gt;
&#039;&#039;&#039;Eigenschaftsgraphen (Property Graphs)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Knoten (Entitäten) und Kanten (Beziehungen) tragen Schlüssel-Wert-Paare (Attributes).&lt;br /&gt;
* Vorteile: Abfrage von komplexen, tief verschachtelten Zusammenhängen ohne teure SQL-JOINs.&lt;br /&gt;
* Einsatz: Neo4j, Memgraph, Wissensnetze, Empfehlungsdienste.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RDF-Tripel / Semantisches Web (Knowledge Graphs)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Wissen wird in Form von Aussagen-Tripeln gespeichert: Subjekt → Prädikat → Objekt (z. B. „Ahrensburg → liegtIn → Schleswig-Holstein&amp;quot;).&lt;br /&gt;
* Vorteile: Standardisiert (W3C, SPARQL, OWL), erlaubt automatische logische Schlussfolgerungen (Inferenz).&lt;br /&gt;
* Einsatz: Wikidata, DBpedia, Semantic MediaWiki, ontologiebasierte Expertensysteme.&lt;br /&gt;
&lt;br /&gt;
====4. Moderne &amp;amp; Vektorbasierte Strukturen====&lt;br /&gt;
&#039;&#039;&#039;Vektordatenbanken (Embeddings)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Texte oder Objekte werden durch Machine-Learning-Modelle in hochdimensionale Vektoren (Zahlenreihen) umgewandelt.&lt;br /&gt;
* Vorteile: Ermöglicht semantische Suche (Suche nach Bedeutung statt nach exakten Stichwörtern) und Retrieval-Augmented Generation (RAG).&lt;br /&gt;
* Einsatz: Pinecone, Qdrant, Chroma, pgvector für KI-Assistenten und LLM-Erweiterungen.&lt;br /&gt;
===Modelle===&lt;br /&gt;
Während die vorigen Abschnitte einzelne Daten, Datentypen und Datenstrukturen behandeln, beschreibt ein &#039;&#039;&#039;Modell&#039;&#039;&#039; das übergeordnete Ordnungsprinzip, nach dem ganze Wissensbestände organisiert werden. Die folgenden sieben Modelle sind die in der Praxis dominierenden Ansätze, von einfach bis hochformal.&lt;br /&gt;
&lt;br /&gt;
====1. Hierarchisches / Baum-Modell (Tree / Folder Model)====&lt;br /&gt;
* Prinzip: Ordnung über verschachtelte Ordner, Kategorien oder Seitenbäume (Eltern-Kind-Beziehung).&lt;br /&gt;
* Typischer Einsatz: Klassische CMS, Dateisysteme, Notiz-Apps (wie Notion, Confluence).&lt;br /&gt;
* Vorteil: Intuitive Bedienung, klare Navigation.&lt;br /&gt;
* Nachteil: Wissen lässt sich oft nicht eindeutig einem Fachbereich zuordnen (Problem der eierlegenden Wollmilchsau).&lt;br /&gt;
&lt;br /&gt;
====2. Flaches Modell mit Metadaten &amp;amp; Tags (Flat / Key-Value Model)====&lt;br /&gt;
* Prinzip: Alle Dokumente liegen auf einer Ebene (&amp;quot;Flat-File&amp;quot;) und werden über Schlagwörter (Tags), Taxonomien oder Key-Value-Eigenschaften charakterisiert.&lt;br /&gt;
* Typischer Einsatz: Flat-File CMS (z. B. Grav, Kirby), statische Wissensdatenbanken (Markdown-basiert mit Frontmatter).&lt;br /&gt;
* Vorteil: Keine starre Ordnerstruktur, hochgradig durchsuchbar, extrem einfach zu sichern/versionieren (z. B. mit Git).&lt;br /&gt;
* Nachteil: Ohne disziplinierte Verschlagwortung geht die Übersicht schnell verloren.&lt;br /&gt;
&lt;br /&gt;
====3. Relationales Datenmodell (Relational Model / SQL)====&lt;br /&gt;
* Prinzip: Wissen wird in zusammenhängenden Tabellen (Entitäten, Attribute, Fremdschlüssel) strukturiert.&lt;br /&gt;
* Typischer Einsatz: Enterprise-Wikis, Moodle/LMS, strukturierte Unternehmensdatenbanken.&lt;br /&gt;
* Vorteil: Hohe Datenintegrität, komplexe Abfragen über Fremdschlüssel und Tabellenverknüpfungen möglich.&lt;br /&gt;
* Nachteil: Starres Schema; Schemaänderungen bei sich veränderndem Wissen sind aufwendig.&lt;br /&gt;
&lt;br /&gt;
====4. Netzwerk- / Graphen-Modell (Graph Model)====&lt;br /&gt;
* Prinzip: Daten bestehen aus Knoten (Entitäten/Dokumenten) und Kanten (Beziehungen).&lt;br /&gt;
* Typischer Einsatz: Personal Knowledge Management (z. B. Obsidian, Roam Research), Graph-Datenbanken (Neo4j).&lt;br /&gt;
* Vorteil: Spiegelt vernetztes Denken wider. Beziehungen wie &#039;&#039;[Projekt X] --hängt ab von--&amp;gt; [Technologie Y]&#039;&#039; sind native Bestandteile der Datenbank.&lt;br /&gt;
* Nachteil: Schwer zu visualisieren/navigieren bei sehr großen Datenmengen ohne gute Filter.&lt;br /&gt;
&lt;br /&gt;
====5. Semantisches / Triples-Modell (RDF / Knowledge Graph)====&lt;br /&gt;
* Prinzip: Wissen wird in formallogischen Aussagen aus Subjekt – Prädikat – Objekt (Triples) gespeichert (z. B. &#039;&#039;[MediaWiki] [verwendet] [PostgreSQL]&#039;&#039;).&lt;br /&gt;
* Typischer Einsatz: Semantic MediaWiki, Wikidata, Ontologie-Systeme (OWL, RDF/SPARQL).&lt;br /&gt;
* Vorteil: Maschinenlesbar, erlaubt automatische logische Rückschlüsse (Inferenz) und komplexe semantische Abfragen.&lt;br /&gt;
* Nachteil: Hohe Einarbeitungszeit und formale Komplexität beim Erstellen der Ontologien.&lt;br /&gt;
&lt;br /&gt;
====6. Dokumentenorientiertes Modell (NoSQL / JSON)====&lt;br /&gt;
* Prinzip: Ein Wissenselement ist ein eigenständiges, strukturiertes Dokument (z. B. JSON/YAML), das eingebettete Attribute und Arrays enthält.&lt;br /&gt;
* Typischer Einsatz: CouchDB, MongoDB, elasticsearch-basierte Wissensspeicher.&lt;br /&gt;
* Vorteil: Flexibles Schema; jedes Dokument kann individuelle Felder haben, ohne das Gesamtsystem zu blockieren.&lt;br /&gt;
* Nachteil: Redundanzen bei Datenbanksicherungen, schwächere Konsistenzprüfungen als bei SQL.&lt;br /&gt;
&lt;br /&gt;
====7. Vektorraum-Modell (Embedding / Latent Space Model)====&lt;br /&gt;
* Prinzip: Wissen wird nicht symbolisch, sondern als Position in einem hochdimensionalen Vektorraum repräsentiert; semantische Nähe entspricht geometrischer Nähe (siehe auch [[#Vektor-Daten (für KI &amp;amp; RAG)|Vektor-Daten]] weiter oben).&lt;br /&gt;
* Typischer Einsatz: Retrieval-Augmented Generation (RAG), semantische Suche, Empfehlungssysteme (Pinecone, Qdrant, pgvector).&lt;br /&gt;
* Vorteil: Findet Zusammenhänge über Bedeutung statt exakter Begriffe, robust gegenüber Synonymen und unscharfen Anfragen.&lt;br /&gt;
* Nachteil: Nicht direkt interpretierbar (&amp;quot;Black Box&amp;quot;), keine expliziten Regeln oder Beziehungen wie im Graphen-Modell.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; In der Praxis werden diese Modelle selten pur eingesetzt, sondern kombiniert – dieses Wiki selbst ist ein Beispiel: Es nutzt eine Baumstruktur (Modell 1, über die `==`/`===`-Überschriften), liegt aber als flache, versionierte Textdatei vor (Modell 2).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Nr. !! Modell !! Kernprinzip !! Größter Vorteil !! Größter Nachteil&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Hierarchisch (Baum) || Eltern-Kind-Verschachtelung || Intuitive Navigation || Eindeutige Einordnung oft unmöglich&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Flach mit Tags || Ebene Dateien + Metadaten || Einfach, git-versionierbar || Erfordert Tagging-Disziplin&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Relational (SQL) || Tabellen + Fremdschlüssel || Hohe Datenintegrität || Starres Schema&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Graph (Property Graph) || Knoten + Kanten || Bildet vernetztes Denken ab || Schwer visualisierbar bei großer Skala&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Semantisch (RDF/Triples) || Subjekt–Prädikat–Objekt || Maschinelle Inferenz möglich || Hoher Formalisierungsaufwand&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Dokumentenorientiert (NoSQL) || Eigenständige JSON-Dokumente || Flexibles Schema || Schwächere Konsistenzprüfung&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Vektorraum (Embeddings) || Position im semantischen Raum || Suche nach Bedeutung statt Begriff || Nicht direkt interpretierbar&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Algorithmen und Programmlogik===&lt;br /&gt;
Wenn es darum geht, Algorithmen und Programmlogik bildhaft, strukturiert oder regelbasiert darzustellen, unterscheidet man zwischen visuellen Repräsentationsformen (zur Dokumentation und Planung) und formalen Wissenssystemen (zur automatischen Verarbeitung).&lt;br /&gt;
&lt;br /&gt;
====1. Visuelle Wissenssysteme &amp;amp; Graphische Modelle====&lt;br /&gt;
Diese Systeme helfen Entwicklern und Lernenden, die Logik eines Programms unabhängig von einer konkreten Programmiersprache zu visualisieren.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! System / Modell !! Einsatzbereich !! Besonderheit / Logikbausteine&lt;br /&gt;
|-&lt;br /&gt;
| Nassi-Shneiderman-Diagramm (Struktogramm) || Strukturierte Programmierung, Lehre &amp;amp; Didaktik || Vermeidet Unordnung (kein Pfeilsalat). Basiert auf Sequenz, Auswahl (If-Else) und Wiederholung (Schleifen).&lt;br /&gt;
|-&lt;br /&gt;
| Programmablaufplan (PAP) / Flowchart || Prozessvisualisierung, technische Abläufe || Klassisches Flussdiagramm (DIN 66001) mit Pfeilen, Rauten für Entscheidungen und Rechtecken für Aktionen.&lt;br /&gt;
|-&lt;br /&gt;
| UML-Aktivitätsdiagramm || Software-Engineering, objektorientiertes Design || Standard in der Industrie. Zeigt komplexe Kontroll- und Datenflüsse inklusive paralleler Verzweigungen.&lt;br /&gt;
|-&lt;br /&gt;
| Entscheidungstabellen || Komplexe Geschäftslogik &amp;amp; Regelwerke || Stellt alle möglichen Bedingungen und daraus resultierende Aktionen in Tabellenform gegenüber.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====2. Formale &amp;amp; Regelbasierte Wissenssysteme====&lt;br /&gt;
Diese Systeme dienen nicht nur der Visualisierung, sondern führen Programmlogik und Regeln direkt aus:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Regelbasierte Systeme &amp;amp; Expertensysteme&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Wissen wird in Form von Fakten und Logikregeln (WENN Bedingung DANN Aktion) gespeichert. Eine Inferenzmaschine (Inference Engine) wertet diese Logik aus.&lt;br /&gt;
* Beispiele:&lt;br /&gt;
** Prolog: Deklarative Programmierung basierend auf Prädikatenlogik.&lt;br /&gt;
** Drools / Business Rules Engines: Für komplexe Geschäftsregeln im Unternehmensumfeld.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pseudocode &amp;amp; Algorithmen-Markup&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Eine strukturierte, halbsprachliche Beschreibung von Logik. Er kombiniert natürliche Sprache mit Elementen höherer Programmiersprachen.&lt;br /&gt;
* Vorteil: Unabhängig von Syntaxfehlern und konzentriert auf das reine Problemlösungsmuster.&lt;br /&gt;
&lt;br /&gt;
====3. MediaWiki als Referenzimplementierung====&lt;br /&gt;
Ein echtes MediaWiki (die Software hinter Wikipedia) setzt praktisch alle in diesem Wiki beschriebenen Modelle gleichzeitig um – nur an unterschiedlichen Stellen der Architektur:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Speicherung (Modell 3 Relational + Modell 6 Dokumentenorientiert)&#039;&#039;&#039;&lt;br /&gt;
* Jede Seite ist ein Dokument (Wikitext-Blob), die Metadaten drumherum sind relational organisiert.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tabelle !! Inhalt&lt;br /&gt;
|-&lt;br /&gt;
| page || Titel, Namespace, Status je Seite&lt;br /&gt;
|-&lt;br /&gt;
| revision || Jede Version einer Seite (Autor, Zeitstempel) – die Versionierung&lt;br /&gt;
|-&lt;br /&gt;
| text / slots || Der eigentliche Wikitext-Blob – unstrukturiert, wie ein Dokument&lt;br /&gt;
|-&lt;br /&gt;
| page_props || Frei erweiterbare Key-Value-Metadaten pro Seite&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Struktur der Überschriften (Modell 1 Baum – nur optisch)&#039;&#039;&#039;&lt;br /&gt;
* `==`, `===`, `====` erzeugen keine echte Baumstruktur in der Datenbank, sondern werden zur Laufzeit nur zu einem Inhaltsverzeichnis (`&amp;lt;h2&amp;gt;`, `&amp;lt;h3&amp;gt;`, …) mit Anchor-Links geparst.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kategorien &amp;amp; Links (Modell 4 Graph + Modell 2 Flach/Tags)&#039;&#039;&#039;&lt;br /&gt;
* Intern ist MediaWiki ein Graph, kein Baum: die Tabelle `pagelinks` speichert, wer auf wen verlinkt (`[[Ziel]]`), `categorylinks`, welche Seite zu welcher Kategorie gehört, `templatelinks`, welche Seite welche Vorlage einbindet.&lt;br /&gt;
* Kategorien funktionieren wie Tags (flach + Metadaten), erlauben durch Verschachtelung aber auch baumartige Navigation – eine Seite kann in mehreren Kategorien gleichzeitig stehen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Semantik (Modell 5 RDF/Triples)&#039;&#039;&#039;&lt;br /&gt;
* Nicht Core-MediaWiki, sondern die Extension Semantic MediaWiki (SMW): Annotationen wie `[[liegt in::Schleswig-Holstein]]` werden zu echten RDF-Tripeln (Subjekt–Prädikat–Objekt), abgelegt in eigenen SQL-Tabellen und exportierbar als RDF/OWL. `ASK`-Abfragen (SPARQL-ähnlich) werden damit direkt im Wikitext möglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Algorithmen/Programmlogik im Wiki selbst&#039;&#039;&#039;&lt;br /&gt;
* ParserFunctions-Extension: `{{#if: Bedingung | Dann | Sonst}}`, `{{#switch: ... }}` – die praktische Umsetzung des „WENN Bedingung DANN Aktion&amp;quot;-Regelsystems, direkt im Wikitext ausführbar.&lt;br /&gt;
* Scribunto (Lua-Module): vollwertige Programmlogik innerhalb von Vorlagen – die Inferenzmaschine für Fälle, die ParserFunctions nicht mehr abbilden.&lt;br /&gt;
* Templates (`{{Vorlage|Parameter}}`): parametrisierter Pseudocode – wiederverwendbare Logikbausteine, die beim Rendern expandiert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Suche (Modell 7 Vektorraum, meist als Erweiterung)&#039;&#039;&#039;&lt;br /&gt;
* Core-MediaWiki bietet nur einfache Volltextsuche. Für semantische/Vektorsuche braucht es Extensions wie CirrusSearch (Elasticsearch) oder KI-gestützte Erweiterungen mit Embeddings – nativ ist das nicht vorgesehen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kurz zusammengefasst als Pipeline:&#039;&#039;&#039;&lt;br /&gt;
* Wikitext (Dokument, Modell 6) → Parser/Präprozessor (Templates/Scribunto = Algorithmen) → HTML-Rendering (Baum-Optik, Modell 1) → gespeichert in relationaler DB (Modell 3) → verknüpft über pagelinks/categorylinks (Graph, Modell 4; Tags, Modell 2) → optional angereichert um SMW-Tripel (Modell 5) und Suchindex/Embeddings (Modell 7).&lt;br /&gt;
&lt;br /&gt;
====4. XWiki als weiteres Beispiel====&lt;br /&gt;
XWiki (Java-basiert) verfolgt einen anderen Architekturansatz als MediaWiki und deckt die Modelle an anderen Stellen ab – vor allem, weil Struktur und Daten dort von Anfang an enger verzahnt sind:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Speicherung (Modell 3 Relational + Modell 6 Dokumentenorientiert, aber enger verzahnt)&#039;&#039;&#039;&lt;br /&gt;
* Über Hibernate ORM auf einer relationalen DB (standardmäßig) abgelegt. Jede Seite (`XWikiDocument`) ist zwar ein Dokument, trägt aber – anders als bei MediaWiki – strukturierte Daten direkt eingebettet statt nur als loser Freitext-Blob.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Echte Hierarchie (Modell 1 Baum, nicht nur optisch)&#039;&#039;&#039;&lt;br /&gt;
* XWiki-Seiten leben in verschachtelten Spaces (`Space.SubSpace.Seite`) – eine tatsächliche Baumstruktur in der Datenbank, kein bloß optisches Inhaltsverzeichnis wie bei MediaWikis `==`-Überschriften. Navigation und Rechteverwaltung (Berechtigungen vererben sich space-weise) folgen dieser echten Hierarchie.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;XClass / XObject – das Kernfeature (Modell 3 Relational, nativ statt per Extension)&#039;&#039;&#039;&lt;br /&gt;
* Jede Seite kann strukturierte, typisierte Datensätze (XObjects) tragen, deren Schema in einer XClass definiert ist – im Grunde eine pro Seite eingebettete Tabellenzeile mit festem Schema (Felder, Typen, Pflichtfelder).&lt;br /&gt;
* Damit sind Wissenseinträge gleichzeitig Dokument (Freitext) und Datensatz (strukturierte Felder) – MediaWiki braucht dafür die Extension Semantic MediaWiki, XWiki hat das nativ im Core.&lt;br /&gt;
* Abfragen darüber laufen über XWQL (XWiki Query Language, HQL/JPQL-artig) – SQL-ähnliche Abfragen direkt über die Wissensbasis, ohne SPARQL-Umweg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Algorithmen/Programmlogik im Wiki selbst&#039;&#039;&#039;&lt;br /&gt;
* Velocity- und Groovy-Skripte direkt in Seiten eingebettet (`#if()`, `#foreach()`, `$doc.getObject(...)`) – vollwertige Programmlogik, näher an einer richtigen Skriptsprache als MediaWikis ParserFunctions.&lt;br /&gt;
* Wiki-Makros (ähnlich Templates) kapseln wiederverwendbare Logik, können aber – weil Java-basiert – auch komplexe Berechnungen und Datenbankzugriffe direkt ausführen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Suche&#039;&#039;&#039;&lt;br /&gt;
* Solr/Lucene-basierte Volltext- und Facettensuche ist im Core enthalten (kein Extension-Zwang wie CirrusSearch bei MediaWiki); neuere Erweiterungen ergänzen KI-gestützte/semantische Suche mit Embeddings.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kurzvergleich MediaWiki vs. XWiki:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Aspekt !! MediaWiki !! XWiki&lt;br /&gt;
|-&lt;br /&gt;
| Hierarchie || Optisch über Überschriften, echte Struktur nur via Kategorien (Graph) || Echte verschachtelte Space-Baumstruktur&lt;br /&gt;
|-&lt;br /&gt;
| Strukturierte Daten (Modell 3/5) || Nur per Extension (Semantic MediaWiki) || Nativ im Core (XClass/XObject)&lt;br /&gt;
|-&lt;br /&gt;
| Abfragesprache || SMW-ASK (SPARQL-ähnlich, Extension) || XWQL (SQL-ähnlich, Core)&lt;br /&gt;
|-&lt;br /&gt;
| Programmlogik || ParserFunctions/Scribunto (Lua) || Velocity/Groovy (Java-Ökosystem)&lt;br /&gt;
|-&lt;br /&gt;
| Typischer Einsatz || Große offene Wissensdatenbanken (Wikipedia) || Unternehmens-Intranets mit strukturierten Formularen/Workflows&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====5. Beispiel: KI &amp;amp; RAG-Wissenssystem====&lt;br /&gt;
Ein modernes RAG-System (Retrieval-Augmented Generation) verfolgt einen grundlegend anderen Ansatz als MediaWiki und XWiki: Statt Wissen über explizite Struktur (Baum, Kategorien, XClass) zu ordnen, wird es über semantische Nähe im Vektorraum (Modell 7) auffindbar gemacht – die Struktur der vorigen Beispiele fehlt hier größtenteils.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Speicherung (Modell 7 Vektorraum + Modell 6 Dokumentenorientiert)&#039;&#039;&#039;&lt;br /&gt;
* Quelldokumente (Wiki-Seiten, PDFs, Markdown) werden in Chunks zerlegt und über ein Embedding-Modell in hochdimensionale Vektoren umgewandelt.&lt;br /&gt;
* Abgelegt in einer Vektordatenbank (Pinecone, Qdrant, Chroma, pgvector) – meist zusammen mit dem Originaltext als Payload/Metadaten, also weiterhin dokumentbasiert im Hintergrund.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Struktur (keine echte Hierarchie – Gegenteil von Modell 1)&#039;&#039;&#039;&lt;br /&gt;
* Es gibt keinen Seitenbaum und keine Kategorien wie bei MediaWiki/XWiki. Auffindbarkeit entsteht rein durch geometrische Nähe im Vektorraum, nicht durch Navigation oder Verlinkung.&lt;br /&gt;
* Optional wird das mit einem Graph (Modell 4, „GraphRAG&amp;quot;) oder mit Metadaten-Filtern (Modell 2, Tags) kombiniert, um reine Vektorsuche zu verbessern.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Algorithmen/Programmlogik – die eigentliche RAG-Pipeline&#039;&#039;&#039;&lt;br /&gt;
* Anfrage (Query) → Embedding der Anfrage → Ähnlichkeitssuche (z. B. Cosinus-Ähnlichkeit) in der Vektordatenbank → Top-k relevante Chunks abrufen → Re-Ranking (optional) → Chunks als Kontext in den Prompt einfügen → LLM generiert Antwort.&lt;br /&gt;
* Das ist funktional das Gegenstück zur „Inferenzmaschine&amp;quot; der regelbasierten Systeme (Abschnitt 2): statt fester WENN-DANN-Regeln wertet hier ein neuronales Netz statistische Ähnlichkeit aus – nicht deterministisch, sondern approximativ.&lt;br /&gt;
* Agenten-Frameworks (LangChain, LlamaIndex) übernehmen die Rolle von Templates/Makros: wiederverwendbare, parametrisierte Ablaufbausteine für Retrieval, Re-Ranking und Prompt-Konstruktion.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Semantik (implizit statt explizit – Gegenteil von Modell 5)&#039;&#039;&#039;&lt;br /&gt;
* Anders als RDF-Tripel (Subjekt–Prädikat–Objekt, explizit und maschinenlesbar) ist die „Semantik&amp;quot; eines Embeddings nicht symbolisch, sondern eine gelernte, nicht direkt interpretierbare Position im Vektorraum („Black Box&amp;quot;, vgl. Modell 7 im Abschnitt „Modelle&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Suche (Modell 7 nativ statt Extension)&#039;&#039;&#039;&lt;br /&gt;
* Semantische Suche ist hier kein Zusatzfeature (wie CirrusSearch bei MediaWiki), sondern der gesamte Zweck des Systems.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Erweiterter Kurzvergleich:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Aspekt !! MediaWiki !! XWiki !! RAG-System&lt;br /&gt;
|-&lt;br /&gt;
| Hierarchie || Optisch + Kategorien (Graph) || Echte Space-Baumstruktur || Keine – nur Vektor-Nähe (optional + Graph/Tags)&lt;br /&gt;
|-&lt;br /&gt;
| Strukturierte Daten || Nur per Extension (SMW) || Nativ (XClass/XObject) || Keine feste Struktur, nur Chunks + Embeddings&lt;br /&gt;
|-&lt;br /&gt;
| Abfrage || SMW-ASK / Volltext || XWQL / Volltext || Vektor-Ähnlichkeitssuche (semantisch)&lt;br /&gt;
|-&lt;br /&gt;
| Programmlogik || ParserFunctions/Scribunto || Velocity/Groovy || Retrieval-Pipeline + LLM (LangChain/LlamaIndex)&lt;br /&gt;
|-&lt;br /&gt;
| Ergebnis-Charakter || Deterministisch, nachvollziehbar || Deterministisch, nachvollziehbar || Approximativ, nicht immer nachvollziehbar&lt;br /&gt;
|-&lt;br /&gt;
| Typischer Einsatz || Große offene Wissensdatenbanken || Unternehmens-Intranets mit Formularen/Workflows || KI-Assistenten, semantische Suche über große Dokumentenmengen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====6. Obsidian als Beispiel für ein natives Graph-Modell====&lt;br /&gt;
Obsidian schließt eine Lücke der bisherigen Beispiele: Es braucht überhaupt keinen Server und keine Datenbank – die Graph-Struktur (Modell 4) entsteht rein client-seitig aus einfachen Textdateien.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Speicherung (Modell 2 Flach + Modell 6 Dokumentenorientiert, ohne jede Datenbank)&#039;&#039;&#039;&lt;br /&gt;
* Jede Notiz ist eine einzelne Markdown-Datei im lokalen Dateisystem (kein MySQL, kein Hibernate, keine Vektordatenbank) – die radikalste Umsetzung von Modell 2 (Flat File) unter allen fünf Beispielen.&lt;br /&gt;
* Metadaten liegen als YAML-Frontmatter direkt in der Datei (ähnlich einer sehr leichtgewichtigen XClass, aber ohne erzwungenes Schema).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Struktur (Modell 4 Graph, nativ und zentral statt Zusatzfeature)&#039;&#039;&#039;&lt;br /&gt;
* Verlinkung erfolgt über `[[Wikilinks]]` direkt im Text. Anders als bei MediaWikis `pagelinks`-Tabelle gibt es keine zentrale Datenbank dafür – der Graph wird beim Öffnen des Vaults aus allen Dateien neu aufgebaut (lokaler Index).&lt;br /&gt;
* Backlinks (eingehende Verweise) werden automatisch berechnet und in der Graph View visualisiert – der Graph ist hier das Kernprodukt, nicht ein Abfallprodukt der Struktur wie bei MediaWiki/XWiki.&lt;br /&gt;
* Es gibt bewusst keine erzwungene Hierarchie (Modell 1): Ordner sind rein organisatorisch, die eigentliche Navigation läuft über Links und Backlinks.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Algorithmen/Programmlogik im Wiki selbst&#039;&#039;&#039;&lt;br /&gt;
* Dataview-Plugin: eine eigene Abfragesprache (DQL, an SQL angelehnt, bzw. JS-basiert), die Frontmatter-Felder über alle Notizen hinweg wie eine Tabelle abfragt – funktional näher an XWQL als an MediaWikis ParserFunctions.&lt;br /&gt;
* Templater-Plugin: JavaScript-Templates für dynamische Notiz-Erstellung (Datumslogik, Platzhalter, bedingte Textbausteine) – das WENN-DANN aus Abschnitt 2, aber clientseitig in JS statt serverseitig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Semantik (Modell 5 nur rudimentär, kein echtes RDF)&#039;&#039;&#039;&lt;br /&gt;
* Frontmatter-Properties (`status: draft`, `tags: [...]`) sind einfache Key-Value-Paare, keine typisierten Tripel wie bei Semantic MediaWiki. Es gibt keine Inferenzmaschine – Schlussfolgerungen (z. B. „alle Notizen mit Tag X, die auf Y verlinken&amp;quot;) müssen über Dataview-Abfragen nachgebaut werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Suche&#039;&#039;&#039;&lt;br /&gt;
* Lokaler Volltextindex, rein clientseitig. Semantische/Vektorsuche (Modell 7) ist nur über Community-Plugins (z. B. Smart Connections) nachrüstbar, nicht im Core.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vollständiger Kurzvergleich:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Aspekt !! MediaWiki !! XWiki !! RAG-System !! Obsidian&lt;br /&gt;
|-&lt;br /&gt;
| Backend || Server + relationale DB || Server + relationale DB (Hibernate) || Server + Vektordatenbank || Kein Server, lokale Dateien&lt;br /&gt;
|-&lt;br /&gt;
| Hierarchie || Optisch + Kategorien (Graph) || Echte Space-Baumstruktur || Keine – nur Vektor-Nähe || Keine – nur Ordner (kosmetisch) + Graph&lt;br /&gt;
|-&lt;br /&gt;
| Strukturierte Daten || Nur per Extension (SMW) || Nativ (XClass/XObject) || Keine feste Struktur (Chunks) || YAML-Frontmatter (informell, kein Schema)&lt;br /&gt;
|-&lt;br /&gt;
| Abfrage || SMW-ASK / Volltext || XWQL / Volltext || Vektor-Ähnlichkeitssuche || Dataview (DQL) / Volltext&lt;br /&gt;
|-&lt;br /&gt;
| Programmlogik || ParserFunctions/Scribunto || Velocity/Groovy || Retrieval-Pipeline + LLM || Templater (JavaScript)&lt;br /&gt;
|-&lt;br /&gt;
| Typischer Einsatz || Große offene Wissensdatenbanken || Unternehmens-Intranets mit Formularen/Workflows || KI-Assistenten, semantische Suche || Persönliches Wissensmanagement (PKM)&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Grundbegriffe_Informatik&amp;diff=41</id>
		<title>Grundbegriffe Informatik</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Grundbegriffe_Informatik&amp;diff=41"/>
		<updated>2026-08-13T11:55:09Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Grundbegriffe Informatik==&lt;br /&gt;
* Daten,Variablen und Datentypen&lt;br /&gt;
* Datenstrukturen&lt;br /&gt;
* Modelle&lt;br /&gt;
* Algorithmen und Programmlogik&lt;br /&gt;
===Daten===&lt;br /&gt;
====Wissensbasiertes System====&lt;br /&gt;
=====Die Ebenen der Datenverarbeitung=====&lt;br /&gt;
* Faktendaten (Rohdaten &amp;amp; Information):&lt;br /&gt;
* Repräsentiertes Wissen: Strukturierte Daten, die logische Zusammenhänge, Regeln oder Beziehungen beschreiben&lt;br /&gt;
* Metadaten: Daten über die Daten&lt;br /&gt;
=====Typen von Daten in Wissenssystemen=====&lt;br /&gt;
Je nach Architektur und Einsatzzweck des Systems werden unterschiedliche Datenformen genutzt:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A. Regelbasiertes Wissen (Explizites Wissen)&#039;&#039;&#039;&lt;br /&gt;
* Form: „Wenn–Dann“-Regeln (If-Then-Rules).&lt;br /&gt;
* Anwendung: Klassische Expertensysteme (z. B. in der Medizin oder bei der Fehlerdiagnose).&lt;br /&gt;
* Beispiel: &#039;&#039;Wenn der Fehlercode E-101 auftritt und der Druck &amp;gt; 5 bar ist, dann öffne Ventil B.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;B. Strukturierte Wissensgraphen &amp;amp; Ontologien&#039;&#039;&#039;&lt;br /&gt;
* Form: Entitäten (Knoten) und deren Beziehungen (Kanten).&lt;br /&gt;
* Anwendung: Semantic Web, moderne Wiki-Systeme, Enterprise Search.&lt;br /&gt;
* Beispiel: &#039;&#039;[Ahrensburg] --(ist eine Stadt in)--&amp;gt; [Schleswig-Holstein]&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C. Dokumentenbasiertes / Unstrukturiertes Wissen&#039;&#039;&#039;&lt;br /&gt;
* Form: Volltexte, Markdown-Dateien, PDFs, Quellcode, Wiki-Seiten.&lt;br /&gt;
* Anwendung: Wissensmanagement-Plattformen, Dokumentations-Engines.&lt;br /&gt;
* Besonderheit: Oft kombiniert mit Volltext-Indizes oder Schlagwort-Katalogen zur schnellen Durchsuchbarkeit.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;D. Vektor-Daten (für KI &amp;amp; RAG)&#039;&#039;&#039;&lt;br /&gt;
* Form: Einbettungen (Embeddings) – hochdimensionale numerische Vektoren, die die semantische Bedeutung von Texten darstellen.&lt;br /&gt;
* Anwendung: Modernes LLM-basiertes Wissensmanagement (Retrieval-Augmented Generation / RAG).&lt;br /&gt;
* Vorteil: Ermöglicht die Suche nach Bedeutung und Kontext, nicht nur nach exakten Begriffen.&lt;br /&gt;
===Variable===&lt;br /&gt;
====Speicherarten in menschlichen kognitiven Systemen====&lt;br /&gt;
In der Kognitionswissenschaft unterscheidet man bezüglich des veränderbaren (variablen) Wissens vor allem zwei Speicherformen im Langzeitgedächtnis:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Explizites / Deklaratives Wissen (&amp;quot;Wissen, dass&amp;quot;)&#039;&#039;&#039;&lt;br /&gt;
* Episodisches Gedächtnis: Speichert konkrete, zeitlich gebundene Erlebnisse und Ereignisse (z. B. „Gestern habe ich Thema X unterrichtet&amp;quot;).&lt;br /&gt;
* Semantisches Gedächtnis: Speichert allgemeines, dekontextualisiertes Fakten- und Konzeptwissen (z. B. „Ein Verb beschreibt eine Handlung&amp;quot;). Dieses Netz aus Konzepten passt sich dynamisch an, wenn neue Regeln oder Fakten gelernt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Implizites / Prozedurales Wissen (&amp;quot;Wissen, wie&amp;quot;)&#039;&#039;&#039;&lt;br /&gt;
* Speichert Handlungsabläufe und Fertigkeiten (z. B. Grammatikregeln im Sprachgebrauch anwenden). Es verändert sich schrittweise durch Automatisierung und Praxis.&lt;br /&gt;
&lt;br /&gt;
====Speicherungsarten in technischen/digitalen Systemen (KI &amp;amp; Software)====&lt;br /&gt;
Bei variablen Wissenssystemen in der Informatik unterscheidet man hauptsächlich zwei Speicherebenen:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A) Parameter-Speicher (Parametrisches Wissen)&#039;&#039;&#039;&lt;br /&gt;
* Wie gespeichert? In den mathematischen Verknüpfungen (Gewichten) neuronaler Netze.&lt;br /&gt;
* Variabilität: Ändert sich kontinuierlich während des Trainings oder Fine-Tunings. Einmal trainiert, ist dieses Wissen im laufenden Betrieb jedoch oft starr.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;B) Externe Vektor- und Graphdatenbanken (Non-parametrisches Wissen)&#039;&#039;&#039;&lt;br /&gt;
* Wie gespeichert? Informationen werden als Einbettungen (Vectors) oder als semantische Netze (Knowledge Graphs) in Datenbanken abgelegt.&lt;br /&gt;
* Variabilität: Sehr hoch. Neue Daten können jederzeit hinzugefügt, aktualisiert oder gelöscht werden, ohne das Grundmodell neu zu trainieren (z. B. bei RAG-Systemen – Retrieval-Augmented Generation).&lt;br /&gt;
===Datentypen===&lt;br /&gt;
====1. Primitive / Elementare Datentypen====&lt;br /&gt;
Diese bilden die kleinsten Bausteine jedes Systems:&lt;br /&gt;
* Ganzzahlen (Integer): Diskrete Werte ohne Nachkommastellen (z. B. -42, 0, 1024).&lt;br /&gt;
* Gleitkommazahlen (Float, Double): Reelle Zahlen mit Nachkommastellen (z. B. 3.14159).&lt;br /&gt;
* Wahrheitswerte (Boolean): Binärwerte (true / false bzw. 1 / 0).&lt;br /&gt;
* Zeichen &amp;amp; Zeichenketten (Char, String): Textdaten (z. B. &amp;quot;Wissensgraph&amp;quot;).&lt;br /&gt;
* Datum &amp;amp; Zeit (Date, Timestamp): Zeitstempel zur zeitlichen Einordnung von Wissen.&lt;br /&gt;
&lt;br /&gt;
====2. Strukturierte &amp;amp; Komplexe Datentypen====&lt;br /&gt;
Dienen dazu, mehrere Datenpunkte logisch miteinander zu verknüpfen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Datentyp !! Beschreibung !! Beispiel / Anwendungsfall&lt;br /&gt;
|-&lt;br /&gt;
| Listen / Arrays || Geordnete Reihenfolge von Elementen || [1, 2, 3, 5, 8]&lt;br /&gt;
|-&lt;br /&gt;
| Schlüssel-Wert-Paare (Maps / Dictionaries) || Zuordnung von eindeutigen Keys zu Werten || {&amp;quot;Titel&amp;quot;: &amp;quot;Artikel&amp;quot;, &amp;quot;Autor&amp;quot;: &amp;quot;Max&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
| Sätze (Sets) || Ungeordnete Mengen ohne Duplikate || {Rot, Grün, Blau}&lt;br /&gt;
|-&lt;br /&gt;
| JSON / BSON || Hierarchisch strukturierte Dokumente || Ideal für semi-strukturierte Wissenseinträge&lt;br /&gt;
|-&lt;br /&gt;
| Blob / Binary || Unstrukturierte Binärdaten || Bilder, Audio-Dateien, Dokumente&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====3. Semantische Datentypen (Wissensrepräsentation)====&lt;br /&gt;
In modernen Wissenssystemen (z. B. RDF, OWL, Knowledge Graphs) gehen Datentypen über rein technische Formate hinaus und beschreiben Bedeutung und Beziehungen:&lt;br /&gt;
* Entitäten / Ressourcen (URIs/IRIs): Eindeutige Identifikatoren für Objekte, Personen oder Konzepte (z. B. http://example.org/person/Thorsten).&lt;br /&gt;
* Literale: Konkrete Werte, die an Entitäten hängen (oft kombiniert mit XML-Schema-Datentypen wie xsd:string oder xsd:dateTime).&lt;br /&gt;
* Relational- / Kanten-Typen (Predicates): Beschreiben die Art der Beziehung zwischen zwei Entitäten (z. B. istAutorVon, gehörtZuKategorie).&lt;br /&gt;
* Vektoren (Embeddings): Dichte numerische Vektoren, die von KI-Modellen und Vektordatenbanken verwendet werden, um semantische Ähnlichkeit zwischen Texten oder Konzepten abzubilden.&lt;br /&gt;
&lt;br /&gt;
===Datenstrukturen===&lt;br /&gt;
Wissenssysteme (Knowledge Management Systems, Wissensdatenbanken) nutzen je nach Einsatzzweck, Flexibilität und Abfragesprache ganz unterschiedliche Datenstrukturen. Hier ist eine Übersicht der wichtigsten Strukturen – von einfach und unstrukturiert bis hin zu hochkomplex und semantisch vernetzt:&lt;br /&gt;
&lt;br /&gt;
====1. Unstrukturierte &amp;amp; Hierarchische Strukturen====&lt;br /&gt;
&#039;&#039;&#039;Flat Files / Plain Text (Markdown, Wikitext)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Daten liegen in einfachen Textdateien vor (oft mit Frontmatter für Metadaten).&lt;br /&gt;
* Vorteile: Extrem schnell, versionierbar (z. B. via Git), zukunftssicher und ohne Datenbank-Overhead.&lt;br /&gt;
* Einsatz: Static Site Generators (Hugo, Jekyll), moderne Notiz-Systeme (Obsidian, Logseq), flache Dokumentationen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Baumstrukturen &amp;amp; Taxonomien&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Hierarchische Anordnung in Ordnern, Kategorien oder Unterkategorien (Eltern-Kind-Beziehungen).&lt;br /&gt;
* Vorteile: Intuitive Navigation für Menschen, klar abgegrenzte Themenbereiche.&lt;br /&gt;
* Einsatz: Klassische Dateisysteme, Firmen-Wikis, Inhaltsverzeichnisse.&lt;br /&gt;
&lt;br /&gt;
====2. Strukturierte &amp;amp; Relationale Datenstrukturen====&lt;br /&gt;
&#039;&#039;&#039;Relationale Datenbanken (SQL)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Tabellen mit festem Schema, Primär- und Fremdschlüsseln (z. B. PostgreSQL, MySQL).&lt;br /&gt;
* Vorteile: Hohe Datenintegrität (ACID-Konformität), ausgereifte Abfragesprachen, hervorragend für strukturierte Metadaten.&lt;br /&gt;
* Einsatz: Klassische Enterprise-CMS (Drupal, TYPO3), Lernplattformen (Moodle), MediaWiki.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dokumentenorientierte Datenbanken (NoSQL)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Speicherung in semi-strukturierten Formaten wie JSON, BSON oder XML.&lt;br /&gt;
* Vorteile: Flexibles Schema, einfache Skalierbarkeit, schnelle Entwicklung bei sich ändernden Datenmodellen.&lt;br /&gt;
* Einsatz: MongoDB, CouchDB, dynamische Wissensplattformen.&lt;br /&gt;
&lt;br /&gt;
====3. Semantische &amp;amp; Vernetzte Strukturen (Graph-basiert)====&lt;br /&gt;
&#039;&#039;&#039;Eigenschaftsgraphen (Property Graphs)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Knoten (Entitäten) und Kanten (Beziehungen) tragen Schlüssel-Wert-Paare (Attributes).&lt;br /&gt;
* Vorteile: Abfrage von komplexen, tief verschachtelten Zusammenhängen ohne teure SQL-JOINs.&lt;br /&gt;
* Einsatz: Neo4j, Memgraph, Wissensnetze, Empfehlungsdienste.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RDF-Tripel / Semantisches Web (Knowledge Graphs)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Wissen wird in Form von Aussagen-Tripeln gespeichert: Subjekt → Prädikat → Objekt (z. B. „Ahrensburg → liegtIn → Schleswig-Holstein&amp;quot;).&lt;br /&gt;
* Vorteile: Standardisiert (W3C, SPARQL, OWL), erlaubt automatische logische Schlussfolgerungen (Inferenz).&lt;br /&gt;
* Einsatz: Wikidata, DBpedia, Semantic MediaWiki, ontologiebasierte Expertensysteme.&lt;br /&gt;
&lt;br /&gt;
====4. Moderne &amp;amp; Vektorbasierte Strukturen====&lt;br /&gt;
&#039;&#039;&#039;Vektordatenbanken (Embeddings)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Texte oder Objekte werden durch Machine-Learning-Modelle in hochdimensionale Vektoren (Zahlenreihen) umgewandelt.&lt;br /&gt;
* Vorteile: Ermöglicht semantische Suche (Suche nach Bedeutung statt nach exakten Stichwörtern) und Retrieval-Augmented Generation (RAG).&lt;br /&gt;
* Einsatz: Pinecone, Qdrant, Chroma, pgvector für KI-Assistenten und LLM-Erweiterungen.&lt;br /&gt;
===Modelle===&lt;br /&gt;
Während die vorigen Abschnitte einzelne Daten, Datentypen und Datenstrukturen behandeln, beschreibt ein &#039;&#039;&#039;Modell&#039;&#039;&#039; das übergeordnete Ordnungsprinzip, nach dem ganze Wissensbestände organisiert werden. Die folgenden sieben Modelle sind die in der Praxis dominierenden Ansätze, von einfach bis hochformal.&lt;br /&gt;
&lt;br /&gt;
====1. Hierarchisches / Baum-Modell (Tree / Folder Model)====&lt;br /&gt;
* Prinzip: Ordnung über verschachtelte Ordner, Kategorien oder Seitenbäume (Eltern-Kind-Beziehung).&lt;br /&gt;
* Typischer Einsatz: Klassische CMS, Dateisysteme, Notiz-Apps (wie Notion, Confluence).&lt;br /&gt;
* Vorteil: Intuitive Bedienung, klare Navigation.&lt;br /&gt;
* Nachteil: Wissen lässt sich oft nicht eindeutig einem Fachbereich zuordnen (Problem der eierlegenden Wollmilchsau).&lt;br /&gt;
&lt;br /&gt;
====2. Flaches Modell mit Metadaten &amp;amp; Tags (Flat / Key-Value Model)====&lt;br /&gt;
* Prinzip: Alle Dokumente liegen auf einer Ebene (&amp;quot;Flat-File&amp;quot;) und werden über Schlagwörter (Tags), Taxonomien oder Key-Value-Eigenschaften charakterisiert.&lt;br /&gt;
* Typischer Einsatz: Flat-File CMS (z. B. Grav, Kirby), statische Wissensdatenbanken (Markdown-basiert mit Frontmatter).&lt;br /&gt;
* Vorteil: Keine starre Ordnerstruktur, hochgradig durchsuchbar, extrem einfach zu sichern/versionieren (z. B. mit Git).&lt;br /&gt;
* Nachteil: Ohne disziplinierte Verschlagwortung geht die Übersicht schnell verloren.&lt;br /&gt;
&lt;br /&gt;
====3. Relationales Datenmodell (Relational Model / SQL)====&lt;br /&gt;
* Prinzip: Wissen wird in zusammenhängenden Tabellen (Entitäten, Attribute, Fremdschlüssel) strukturiert.&lt;br /&gt;
* Typischer Einsatz: Enterprise-Wikis, Moodle/LMS, strukturierte Unternehmensdatenbanken.&lt;br /&gt;
* Vorteil: Hohe Datenintegrität, komplexe Abfragen über Fremdschlüssel und Tabellenverknüpfungen möglich.&lt;br /&gt;
* Nachteil: Starres Schema; Schemaänderungen bei sich veränderndem Wissen sind aufwendig.&lt;br /&gt;
&lt;br /&gt;
====4. Netzwerk- / Graphen-Modell (Graph Model)====&lt;br /&gt;
* Prinzip: Daten bestehen aus Knoten (Entitäten/Dokumenten) und Kanten (Beziehungen).&lt;br /&gt;
* Typischer Einsatz: Personal Knowledge Management (z. B. Obsidian, Roam Research), Graph-Datenbanken (Neo4j).&lt;br /&gt;
* Vorteil: Spiegelt vernetztes Denken wider. Beziehungen wie &#039;&#039;[Projekt X] --hängt ab von--&amp;gt; [Technologie Y]&#039;&#039; sind native Bestandteile der Datenbank.&lt;br /&gt;
* Nachteil: Schwer zu visualisieren/navigieren bei sehr großen Datenmengen ohne gute Filter.&lt;br /&gt;
&lt;br /&gt;
====5. Semantisches / Triples-Modell (RDF / Knowledge Graph)====&lt;br /&gt;
* Prinzip: Wissen wird in formallogischen Aussagen aus Subjekt – Prädikat – Objekt (Triples) gespeichert (z. B. &#039;&#039;[MediaWiki] [verwendet] [PostgreSQL]&#039;&#039;).&lt;br /&gt;
* Typischer Einsatz: Semantic MediaWiki, Wikidata, Ontologie-Systeme (OWL, RDF/SPARQL).&lt;br /&gt;
* Vorteil: Maschinenlesbar, erlaubt automatische logische Rückschlüsse (Inferenz) und komplexe semantische Abfragen.&lt;br /&gt;
* Nachteil: Hohe Einarbeitungszeit und formale Komplexität beim Erstellen der Ontologien.&lt;br /&gt;
&lt;br /&gt;
====6. Dokumentenorientiertes Modell (NoSQL / JSON)====&lt;br /&gt;
* Prinzip: Ein Wissenselement ist ein eigenständiges, strukturiertes Dokument (z. B. JSON/YAML), das eingebettete Attribute und Arrays enthält.&lt;br /&gt;
* Typischer Einsatz: CouchDB, MongoDB, elasticsearch-basierte Wissensspeicher.&lt;br /&gt;
* Vorteil: Flexibles Schema; jedes Dokument kann individuelle Felder haben, ohne das Gesamtsystem zu blockieren.&lt;br /&gt;
* Nachteil: Redundanzen bei Datenbanksicherungen, schwächere Konsistenzprüfungen als bei SQL.&lt;br /&gt;
&lt;br /&gt;
====7. Vektorraum-Modell (Embedding / Latent Space Model)====&lt;br /&gt;
* Prinzip: Wissen wird nicht symbolisch, sondern als Position in einem hochdimensionalen Vektorraum repräsentiert; semantische Nähe entspricht geometrischer Nähe (siehe auch [[#Vektor-Daten (für KI &amp;amp; RAG)|Vektor-Daten]] weiter oben).&lt;br /&gt;
* Typischer Einsatz: Retrieval-Augmented Generation (RAG), semantische Suche, Empfehlungssysteme (Pinecone, Qdrant, pgvector).&lt;br /&gt;
* Vorteil: Findet Zusammenhänge über Bedeutung statt exakter Begriffe, robust gegenüber Synonymen und unscharfen Anfragen.&lt;br /&gt;
* Nachteil: Nicht direkt interpretierbar (&amp;quot;Black Box&amp;quot;), keine expliziten Regeln oder Beziehungen wie im Graphen-Modell.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; In der Praxis werden diese Modelle selten pur eingesetzt, sondern kombiniert – dieses Wiki selbst ist ein Beispiel: Es nutzt eine Baumstruktur (Modell 1, über die `==`/`===`-Überschriften), liegt aber als flache, versionierte Textdatei vor (Modell 2).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Nr. !! Modell !! Kernprinzip !! Größter Vorteil !! Größter Nachteil&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Hierarchisch (Baum) || Eltern-Kind-Verschachtelung || Intuitive Navigation || Eindeutige Einordnung oft unmöglich&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Flach mit Tags || Ebene Dateien + Metadaten || Einfach, git-versionierbar || Erfordert Tagging-Disziplin&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Relational (SQL) || Tabellen + Fremdschlüssel || Hohe Datenintegrität || Starres Schema&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Graph (Property Graph) || Knoten + Kanten || Bildet vernetztes Denken ab || Schwer visualisierbar bei großer Skala&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Semantisch (RDF/Triples) || Subjekt–Prädikat–Objekt || Maschinelle Inferenz möglich || Hoher Formalisierungsaufwand&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Dokumentenorientiert (NoSQL) || Eigenständige JSON-Dokumente || Flexibles Schema || Schwächere Konsistenzprüfung&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Vektorraum (Embeddings) || Position im semantischen Raum || Suche nach Bedeutung statt Begriff || Nicht direkt interpretierbar&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Algorithmen und Programmlogik===&lt;br /&gt;
Wenn es darum geht, Algorithmen und Programmlogik bildhaft, strukturiert oder regelbasiert darzustellen, unterscheidet man zwischen visuellen Repräsentationsformen (zur Dokumentation und Planung) und formalen Wissenssystemen (zur automatischen Verarbeitung).&lt;br /&gt;
&lt;br /&gt;
====1. Visuelle Wissenssysteme &amp;amp; Graphische Modelle====&lt;br /&gt;
Diese Systeme helfen Entwicklern und Lernenden, die Logik eines Programms unabhängig von einer konkreten Programmiersprache zu visualisieren.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! System / Modell !! Einsatzbereich !! Besonderheit / Logikbausteine&lt;br /&gt;
|-&lt;br /&gt;
| Nassi-Shneiderman-Diagramm (Struktogramm) || Strukturierte Programmierung, Lehre &amp;amp; Didaktik || Vermeidet Unordnung (kein Pfeilsalat). Basiert auf Sequenz, Auswahl (If-Else) und Wiederholung (Schleifen).&lt;br /&gt;
|-&lt;br /&gt;
| Programmablaufplan (PAP) / Flowchart || Prozessvisualisierung, technische Abläufe || Klassisches Flussdiagramm (DIN 66001) mit Pfeilen, Rauten für Entscheidungen und Rechtecken für Aktionen.&lt;br /&gt;
|-&lt;br /&gt;
| UML-Aktivitätsdiagramm || Software-Engineering, objektorientiertes Design || Standard in der Industrie. Zeigt komplexe Kontroll- und Datenflüsse inklusive paralleler Verzweigungen.&lt;br /&gt;
|-&lt;br /&gt;
| Entscheidungstabellen || Komplexe Geschäftslogik &amp;amp; Regelwerke || Stellt alle möglichen Bedingungen und daraus resultierende Aktionen in Tabellenform gegenüber.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====2. Formale &amp;amp; Regelbasierte Wissenssysteme====&lt;br /&gt;
Diese Systeme dienen nicht nur der Visualisierung, sondern führen Programmlogik und Regeln direkt aus:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Regelbasierte Systeme &amp;amp; Expertensysteme&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Wissen wird in Form von Fakten und Logikregeln (WENN Bedingung DANN Aktion) gespeichert. Eine Inferenzmaschine (Inference Engine) wertet diese Logik aus.&lt;br /&gt;
* Beispiele:&lt;br /&gt;
** Prolog: Deklarative Programmierung basierend auf Prädikatenlogik.&lt;br /&gt;
** Drools / Business Rules Engines: Für komplexe Geschäftsregeln im Unternehmensumfeld.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pseudocode &amp;amp; Algorithmen-Markup&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Eine strukturierte, halbsprachliche Beschreibung von Logik. Er kombiniert natürliche Sprache mit Elementen höherer Programmiersprachen.&lt;br /&gt;
* Vorteil: Unabhängig von Syntaxfehlern und konzentriert auf das reine Problemlösungsmuster.&lt;br /&gt;
&lt;br /&gt;
====3. MediaWiki als Referenzimplementierung====&lt;br /&gt;
Ein echtes MediaWiki (die Software hinter Wikipedia) setzt praktisch alle in diesem Wiki beschriebenen Modelle gleichzeitig um – nur an unterschiedlichen Stellen der Architektur:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Speicherung (Modell 3 Relational + Modell 6 Dokumentenorientiert)&#039;&#039;&#039;&lt;br /&gt;
* Jede Seite ist ein Dokument (Wikitext-Blob), die Metadaten drumherum sind relational organisiert.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tabelle !! Inhalt&lt;br /&gt;
|-&lt;br /&gt;
| page || Titel, Namespace, Status je Seite&lt;br /&gt;
|-&lt;br /&gt;
| revision || Jede Version einer Seite (Autor, Zeitstempel) – die Versionierung&lt;br /&gt;
|-&lt;br /&gt;
| text / slots || Der eigentliche Wikitext-Blob – unstrukturiert, wie ein Dokument&lt;br /&gt;
|-&lt;br /&gt;
| page_props || Frei erweiterbare Key-Value-Metadaten pro Seite&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Struktur der Überschriften (Modell 1 Baum – nur optisch)&#039;&#039;&#039;&lt;br /&gt;
* `==`, `===`, `====` erzeugen keine echte Baumstruktur in der Datenbank, sondern werden zur Laufzeit nur zu einem Inhaltsverzeichnis (`&amp;lt;h2&amp;gt;`, `&amp;lt;h3&amp;gt;`, …) mit Anchor-Links geparst.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kategorien &amp;amp; Links (Modell 4 Graph + Modell 2 Flach/Tags)&#039;&#039;&#039;&lt;br /&gt;
* Intern ist MediaWiki ein Graph, kein Baum: die Tabelle `pagelinks` speichert, wer auf wen verlinkt (`[[Ziel]]`), `categorylinks`, welche Seite zu welcher Kategorie gehört, `templatelinks`, welche Seite welche Vorlage einbindet.&lt;br /&gt;
* Kategorien funktionieren wie Tags (flach + Metadaten), erlauben durch Verschachtelung aber auch baumartige Navigation – eine Seite kann in mehreren Kategorien gleichzeitig stehen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Semantik (Modell 5 RDF/Triples)&#039;&#039;&#039;&lt;br /&gt;
* Nicht Core-MediaWiki, sondern die Extension Semantic MediaWiki (SMW): Annotationen wie `[[liegt in::Schleswig-Holstein]]` werden zu echten RDF-Tripeln (Subjekt–Prädikat–Objekt), abgelegt in eigenen SQL-Tabellen und exportierbar als RDF/OWL. `ASK`-Abfragen (SPARQL-ähnlich) werden damit direkt im Wikitext möglich.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Algorithmen/Programmlogik im Wiki selbst&#039;&#039;&#039;&lt;br /&gt;
* ParserFunctions-Extension: `{{#if: Bedingung | Dann | Sonst}}`, `{{#switch: ... }}` – die praktische Umsetzung des „WENN Bedingung DANN Aktion&amp;quot;-Regelsystems, direkt im Wikitext ausführbar.&lt;br /&gt;
* Scribunto (Lua-Module): vollwertige Programmlogik innerhalb von Vorlagen – die Inferenzmaschine für Fälle, die ParserFunctions nicht mehr abbilden.&lt;br /&gt;
* Templates (`{{Vorlage|Parameter}}`): parametrisierter Pseudocode – wiederverwendbare Logikbausteine, die beim Rendern expandiert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Suche (Modell 7 Vektorraum, meist als Erweiterung)&#039;&#039;&#039;&lt;br /&gt;
* Core-MediaWiki bietet nur einfache Volltextsuche. Für semantische/Vektorsuche braucht es Extensions wie CirrusSearch (Elasticsearch) oder KI-gestützte Erweiterungen mit Embeddings – nativ ist das nicht vorgesehen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kurz zusammengefasst als Pipeline:&#039;&#039;&#039;&lt;br /&gt;
* Wikitext (Dokument, Modell 6) → Parser/Präprozessor (Templates/Scribunto = Algorithmen) → HTML-Rendering (Baum-Optik, Modell 1) → gespeichert in relationaler DB (Modell 3) → verknüpft über pagelinks/categorylinks (Graph, Modell 4; Tags, Modell 2) → optional angereichert um SMW-Tripel (Modell 5) und Suchindex/Embeddings (Modell 7).&lt;br /&gt;
&lt;br /&gt;
====4. XWiki als weiteres Beispiel====&lt;br /&gt;
XWiki (Java-basiert) verfolgt einen anderen Architekturansatz als MediaWiki und deckt die Modelle an anderen Stellen ab – vor allem, weil Struktur und Daten dort von Anfang an enger verzahnt sind:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Speicherung (Modell 3 Relational + Modell 6 Dokumentenorientiert, aber enger verzahnt)&#039;&#039;&#039;&lt;br /&gt;
* Über Hibernate ORM auf einer relationalen DB (standardmäßig) abgelegt. Jede Seite (`XWikiDocument`) ist zwar ein Dokument, trägt aber – anders als bei MediaWiki – strukturierte Daten direkt eingebettet statt nur als loser Freitext-Blob.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Echte Hierarchie (Modell 1 Baum, nicht nur optisch)&#039;&#039;&#039;&lt;br /&gt;
* XWiki-Seiten leben in verschachtelten Spaces (`Space.SubSpace.Seite`) – eine tatsächliche Baumstruktur in der Datenbank, kein bloß optisches Inhaltsverzeichnis wie bei MediaWikis `==`-Überschriften. Navigation und Rechteverwaltung (Berechtigungen vererben sich space-weise) folgen dieser echten Hierarchie.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;XClass / XObject – das Kernfeature (Modell 3 Relational, nativ statt per Extension)&#039;&#039;&#039;&lt;br /&gt;
* Jede Seite kann strukturierte, typisierte Datensätze (XObjects) tragen, deren Schema in einer XClass definiert ist – im Grunde eine pro Seite eingebettete Tabellenzeile mit festem Schema (Felder, Typen, Pflichtfelder).&lt;br /&gt;
* Damit sind Wissenseinträge gleichzeitig Dokument (Freitext) und Datensatz (strukturierte Felder) – MediaWiki braucht dafür die Extension Semantic MediaWiki, XWiki hat das nativ im Core.&lt;br /&gt;
* Abfragen darüber laufen über XWQL (XWiki Query Language, HQL/JPQL-artig) – SQL-ähnliche Abfragen direkt über die Wissensbasis, ohne SPARQL-Umweg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Algorithmen/Programmlogik im Wiki selbst&#039;&#039;&#039;&lt;br /&gt;
* Velocity- und Groovy-Skripte direkt in Seiten eingebettet (`#if()`, `#foreach()`, `$doc.getObject(...)`) – vollwertige Programmlogik, näher an einer richtigen Skriptsprache als MediaWikis ParserFunctions.&lt;br /&gt;
* Wiki-Makros (ähnlich Templates) kapseln wiederverwendbare Logik, können aber – weil Java-basiert – auch komplexe Berechnungen und Datenbankzugriffe direkt ausführen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Suche&#039;&#039;&#039;&lt;br /&gt;
* Solr/Lucene-basierte Volltext- und Facettensuche ist im Core enthalten (kein Extension-Zwang wie CirrusSearch bei MediaWiki); neuere Erweiterungen ergänzen KI-gestützte/semantische Suche mit Embeddings.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kurzvergleich MediaWiki vs. XWiki:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Aspekt !! MediaWiki !! XWiki&lt;br /&gt;
|-&lt;br /&gt;
| Hierarchie || Optisch über Überschriften, echte Struktur nur via Kategorien (Graph) || Echte verschachtelte Space-Baumstruktur&lt;br /&gt;
|-&lt;br /&gt;
| Strukturierte Daten (Modell 3/5) || Nur per Extension (Semantic MediaWiki) || Nativ im Core (XClass/XObject)&lt;br /&gt;
|-&lt;br /&gt;
| Abfragesprache || SMW-ASK (SPARQL-ähnlich, Extension) || XWQL (SQL-ähnlich, Core)&lt;br /&gt;
|-&lt;br /&gt;
| Programmlogik || ParserFunctions/Scribunto (Lua) || Velocity/Groovy (Java-Ökosystem)&lt;br /&gt;
|-&lt;br /&gt;
| Typischer Einsatz || Große offene Wissensdatenbanken (Wikipedia) || Unternehmens-Intranets mit strukturierten Formularen/Workflows&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====5. Beispiel: KI &amp;amp; RAG-Wissenssystem====&lt;br /&gt;
Ein modernes RAG-System (Retrieval-Augmented Generation) verfolgt einen grundlegend anderen Ansatz als MediaWiki und XWiki: Statt Wissen über explizite Struktur (Baum, Kategorien, XClass) zu ordnen, wird es über semantische Nähe im Vektorraum (Modell 7) auffindbar gemacht – die Struktur der vorigen Beispiele fehlt hier größtenteils.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Speicherung (Modell 7 Vektorraum + Modell 6 Dokumentenorientiert)&#039;&#039;&#039;&lt;br /&gt;
* Quelldokumente (Wiki-Seiten, PDFs, Markdown) werden in Chunks zerlegt und über ein Embedding-Modell in hochdimensionale Vektoren umgewandelt.&lt;br /&gt;
* Abgelegt in einer Vektordatenbank (Pinecone, Qdrant, Chroma, pgvector) – meist zusammen mit dem Originaltext als Payload/Metadaten, also weiterhin dokumentbasiert im Hintergrund.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Struktur (keine echte Hierarchie – Gegenteil von Modell 1)&#039;&#039;&#039;&lt;br /&gt;
* Es gibt keinen Seitenbaum und keine Kategorien wie bei MediaWiki/XWiki. Auffindbarkeit entsteht rein durch geometrische Nähe im Vektorraum, nicht durch Navigation oder Verlinkung.&lt;br /&gt;
* Optional wird das mit einem Graph (Modell 4, „GraphRAG&amp;quot;) oder mit Metadaten-Filtern (Modell 2, Tags) kombiniert, um reine Vektorsuche zu verbessern.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Algorithmen/Programmlogik – die eigentliche RAG-Pipeline&#039;&#039;&#039;&lt;br /&gt;
* Anfrage (Query) → Embedding der Anfrage → Ähnlichkeitssuche (z. B. Cosinus-Ähnlichkeit) in der Vektordatenbank → Top-k relevante Chunks abrufen → Re-Ranking (optional) → Chunks als Kontext in den Prompt einfügen → LLM generiert Antwort.&lt;br /&gt;
* Das ist funktional das Gegenstück zur „Inferenzmaschine&amp;quot; der regelbasierten Systeme (Abschnitt 2): statt fester WENN-DANN-Regeln wertet hier ein neuronales Netz statistische Ähnlichkeit aus – nicht deterministisch, sondern approximativ.&lt;br /&gt;
* Agenten-Frameworks (LangChain, LlamaIndex) übernehmen die Rolle von Templates/Makros: wiederverwendbare, parametrisierte Ablaufbausteine für Retrieval, Re-Ranking und Prompt-Konstruktion.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Semantik (implizit statt explizit – Gegenteil von Modell 5)&#039;&#039;&#039;&lt;br /&gt;
* Anders als RDF-Tripel (Subjekt–Prädikat–Objekt, explizit und maschinenlesbar) ist die „Semantik&amp;quot; eines Embeddings nicht symbolisch, sondern eine gelernte, nicht direkt interpretierbare Position im Vektorraum („Black Box&amp;quot;, vgl. Modell 7 im Abschnitt „Modelle&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Suche (Modell 7 nativ statt Extension)&#039;&#039;&#039;&lt;br /&gt;
* Semantische Suche ist hier kein Zusatzfeature (wie CirrusSearch bei MediaWiki), sondern der gesamte Zweck des Systems.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Erweiterter Kurzvergleich:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Aspekt !! MediaWiki !! XWiki !! RAG-System&lt;br /&gt;
|-&lt;br /&gt;
| Hierarchie || Optisch + Kategorien (Graph) || Echte Space-Baumstruktur || Keine – nur Vektor-Nähe (optional + Graph/Tags)&lt;br /&gt;
|-&lt;br /&gt;
| Strukturierte Daten || Nur per Extension (SMW) || Nativ (XClass/XObject) || Keine feste Struktur, nur Chunks + Embeddings&lt;br /&gt;
|-&lt;br /&gt;
| Abfrage || SMW-ASK / Volltext || XWQL / Volltext || Vektor-Ähnlichkeitssuche (semantisch)&lt;br /&gt;
|-&lt;br /&gt;
| Programmlogik || ParserFunctions/Scribunto || Velocity/Groovy || Retrieval-Pipeline + LLM (LangChain/LlamaIndex)&lt;br /&gt;
|-&lt;br /&gt;
| Ergebnis-Charakter || Deterministisch, nachvollziehbar || Deterministisch, nachvollziehbar || Approximativ, nicht immer nachvollziehbar&lt;br /&gt;
|-&lt;br /&gt;
| Typischer Einsatz || Große offene Wissensdatenbanken || Unternehmens-Intranets mit Formularen/Workflows || KI-Assistenten, semantische Suche über große Dokumentenmengen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====6. Obsidian als Beispiel für ein natives Graph-Modell====&lt;br /&gt;
Obsidian schließt eine Lücke der bisherigen Beispiele: Es braucht überhaupt keinen Server und keine Datenbank – die Graph-Struktur (Modell 4) entsteht rein client-seitig aus einfachen Textdateien.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Speicherung (Modell 2 Flach + Modell 6 Dokumentenorientiert, ohne jede Datenbank)&#039;&#039;&#039;&lt;br /&gt;
* Jede Notiz ist eine einzelne Markdown-Datei im lokalen Dateisystem (kein MySQL, kein Hibernate, keine Vektordatenbank) – die radikalste Umsetzung von Modell 2 (Flat File) unter allen fünf Beispielen.&lt;br /&gt;
* Metadaten liegen als YAML-Frontmatter direkt in der Datei (ähnlich einer sehr leichtgewichtigen XClass, aber ohne erzwungenes Schema).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Struktur (Modell 4 Graph, nativ und zentral statt Zusatzfeature)&#039;&#039;&#039;&lt;br /&gt;
* Verlinkung erfolgt über `[[Wikilinks]]` direkt im Text. Anders als bei MediaWikis `pagelinks`-Tabelle gibt es keine zentrale Datenbank dafür – der Graph wird beim Öffnen des Vaults aus allen Dateien neu aufgebaut (lokaler Index).&lt;br /&gt;
* Backlinks (eingehende Verweise) werden automatisch berechnet und in der Graph View visualisiert – der Graph ist hier das Kernprodukt, nicht ein Abfallprodukt der Struktur wie bei MediaWiki/XWiki.&lt;br /&gt;
* Es gibt bewusst keine erzwungene Hierarchie (Modell 1): Ordner sind rein organisatorisch, die eigentliche Navigation läuft über Links und Backlinks.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Algorithmen/Programmlogik im Wiki selbst&#039;&#039;&#039;&lt;br /&gt;
* Dataview-Plugin: eine eigene Abfragesprache (DQL, an SQL angelehnt, bzw. JS-basiert), die Frontmatter-Felder über alle Notizen hinweg wie eine Tabelle abfragt – funktional näher an XWQL als an MediaWikis ParserFunctions.&lt;br /&gt;
* Templater-Plugin: JavaScript-Templates für dynamische Notiz-Erstellung (Datumslogik, Platzhalter, bedingte Textbausteine) – das WENN-DANN aus Abschnitt 2, aber clientseitig in JS statt serverseitig.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Semantik (Modell 5 nur rudimentär, kein echtes RDF)&#039;&#039;&#039;&lt;br /&gt;
* Frontmatter-Properties (`status: draft`, `tags: [...]`) sind einfache Key-Value-Paare, keine typisierten Tripel wie bei Semantic MediaWiki. Es gibt keine Inferenzmaschine – Schlussfolgerungen (z. B. „alle Notizen mit Tag X, die auf Y verlinken&amp;quot;) müssen über Dataview-Abfragen nachgebaut werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Suche&#039;&#039;&#039;&lt;br /&gt;
* Lokaler Volltextindex, rein clientseitig. Semantische/Vektorsuche (Modell 7) ist nur über Community-Plugins (z. B. Smart Connections) nachrüstbar, nicht im Core.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vollständiger Kurzvergleich:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Aspekt !! MediaWiki !! XWiki !! RAG-System !! Obsidian&lt;br /&gt;
|-&lt;br /&gt;
| Backend || Server + relationale DB || Server + relationale DB (Hibernate) || Server + Vektordatenbank || Kein Server, lokale Dateien&lt;br /&gt;
|-&lt;br /&gt;
| Hierarchie || Optisch + Kategorien (Graph) || Echte Space-Baumstruktur || Keine – nur Vektor-Nähe || Keine – nur Ordner (kosmetisch) + Graph&lt;br /&gt;
|-&lt;br /&gt;
| Strukturierte Daten || Nur per Extension (SMW) || Nativ (XClass/XObject) || Keine feste Struktur (Chunks) || YAML-Frontmatter (informell, kein Schema)&lt;br /&gt;
|-&lt;br /&gt;
| Abfrage || SMW-ASK / Volltext || XWQL / Volltext || Vektor-Ähnlichkeitssuche || Dataview (DQL) / Volltext&lt;br /&gt;
|-&lt;br /&gt;
| Programmlogik || ParserFunctions/Scribunto || Velocity/Groovy || Retrieval-Pipeline + LLM || Templater (JavaScript)&lt;br /&gt;
|-&lt;br /&gt;
| Typischer Einsatz || Große offene Wissensdatenbanken || Unternehmens-Intranets mit Formularen/Workflows || KI-Assistenten, semantische Suche || Persönliches Wissensmanagement (PKM)&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Grundbegriffe_Informatik&amp;diff=40</id>
		<title>Grundbegriffe Informatik</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Grundbegriffe_Informatik&amp;diff=40"/>
		<updated>2026-08-13T11:26:52Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: Die Seite wurde neu angelegt: „==Grundbegriffe Informatik== * Daten,Variablen und Datentypen * Datenstrukturen * Modelle * Algorithmen und Programmlogik ===Daten=== ====Wissensbasiertes System==== =====Die Ebenen der Datenverarbeitung===== * Faktendaten (Rohdaten &amp;amp; Information): * Repräsentiertes Wissen: Strukturierte Daten, die logische Zusammenhänge, Regeln oder Beziehungen beschreiben * Metadaten: Daten über die Daten =====Typen von Daten in Wissenssystemen===== Je nach Architekt…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Grundbegriffe Informatik==&lt;br /&gt;
* Daten,Variablen und Datentypen&lt;br /&gt;
* Datenstrukturen&lt;br /&gt;
* Modelle&lt;br /&gt;
* Algorithmen und Programmlogik&lt;br /&gt;
===Daten===&lt;br /&gt;
====Wissensbasiertes System====&lt;br /&gt;
=====Die Ebenen der Datenverarbeitung=====&lt;br /&gt;
* Faktendaten (Rohdaten &amp;amp; Information):&lt;br /&gt;
* Repräsentiertes Wissen: Strukturierte Daten, die logische Zusammenhänge, Regeln oder Beziehungen beschreiben&lt;br /&gt;
* Metadaten: Daten über die Daten&lt;br /&gt;
=====Typen von Daten in Wissenssystemen=====&lt;br /&gt;
Je nach Architektur und Einsatzzweck des Systems werden unterschiedliche Datenformen genutzt:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A. Regelbasiertes Wissen (Explizites Wissen)&#039;&#039;&#039;&lt;br /&gt;
* Form: „Wenn–Dann“-Regeln (If-Then-Rules).&lt;br /&gt;
* Anwendung: Klassische Expertensysteme (z. B. in der Medizin oder bei der Fehlerdiagnose).&lt;br /&gt;
* Beispiel: &#039;&#039;Wenn der Fehlercode E-101 auftritt und der Druck &amp;gt; 5 bar ist, dann öffne Ventil B.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;B. Strukturierte Wissensgraphen &amp;amp; Ontologien&#039;&#039;&#039;&lt;br /&gt;
* Form: Entitäten (Knoten) und deren Beziehungen (Kanten).&lt;br /&gt;
* Anwendung: Semantic Web, moderne Wiki-Systeme, Enterprise Search.&lt;br /&gt;
* Beispiel: &#039;&#039;[Ahrensburg] --(ist eine Stadt in)--&amp;gt; [Schleswig-Holstein]&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C. Dokumentenbasiertes / Unstrukturiertes Wissen&#039;&#039;&#039;&lt;br /&gt;
* Form: Volltexte, Markdown-Dateien, PDFs, Quellcode, Wiki-Seiten.&lt;br /&gt;
* Anwendung: Wissensmanagement-Plattformen, Dokumentations-Engines.&lt;br /&gt;
* Besonderheit: Oft kombiniert mit Volltext-Indizes oder Schlagwort-Katalogen zur schnellen Durchsuchbarkeit.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;D. Vektor-Daten (für KI &amp;amp; RAG)&#039;&#039;&#039;&lt;br /&gt;
* Form: Einbettungen (Embeddings) – hochdimensionale numerische Vektoren, die die semantische Bedeutung von Texten darstellen.&lt;br /&gt;
* Anwendung: Modernes LLM-basiertes Wissensmanagement (Retrieval-Augmented Generation / RAG).&lt;br /&gt;
* Vorteil: Ermöglicht die Suche nach Bedeutung und Kontext, nicht nur nach exakten Begriffen.&lt;br /&gt;
===Variable===&lt;br /&gt;
====Speicherarten in menschlichen kognitiven Systemen====&lt;br /&gt;
In der Kognitionswissenschaft unterscheidet man bezüglich des veränderbaren (variablen) Wissens vor allem zwei Speicherformen im Langzeitgedächtnis:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Explizites / Deklaratives Wissen (&amp;quot;Wissen, dass&amp;quot;)&#039;&#039;&#039;&lt;br /&gt;
* Episodisches Gedächtnis: Speichert konkrete, zeitlich gebundene Erlebnisse und Ereignisse (z. B. „Gestern habe ich Thema X unterrichtet&amp;quot;).&lt;br /&gt;
* Semantisches Gedächtnis: Speichert allgemeines, dekontextualisiertes Fakten- und Konzeptwissen (z. B. „Ein Verb beschreibt eine Handlung&amp;quot;). Dieses Netz aus Konzepten passt sich dynamisch an, wenn neue Regeln oder Fakten gelernt werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Implizites / Prozedurales Wissen (&amp;quot;Wissen, wie&amp;quot;)&#039;&#039;&#039;&lt;br /&gt;
* Speichert Handlungsabläufe und Fertigkeiten (z. B. Grammatikregeln im Sprachgebrauch anwenden). Es verändert sich schrittweise durch Automatisierung und Praxis.&lt;br /&gt;
&lt;br /&gt;
====Speicherungsarten in technischen/digitalen Systemen (KI &amp;amp; Software)====&lt;br /&gt;
Bei variablen Wissenssystemen in der Informatik unterscheidet man hauptsächlich zwei Speicherebenen:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A) Parameter-Speicher (Parametrisches Wissen)&#039;&#039;&#039;&lt;br /&gt;
* Wie gespeichert? In den mathematischen Verknüpfungen (Gewichten) neuronaler Netze.&lt;br /&gt;
* Variabilität: Ändert sich kontinuierlich während des Trainings oder Fine-Tunings. Einmal trainiert, ist dieses Wissen im laufenden Betrieb jedoch oft starr.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;B) Externe Vektor- und Graphdatenbanken (Non-parametrisches Wissen)&#039;&#039;&#039;&lt;br /&gt;
* Wie gespeichert? Informationen werden als Einbettungen (Vectors) oder als semantische Netze (Knowledge Graphs) in Datenbanken abgelegt.&lt;br /&gt;
* Variabilität: Sehr hoch. Neue Daten können jederzeit hinzugefügt, aktualisiert oder gelöscht werden, ohne das Grundmodell neu zu trainieren (z. B. bei RAG-Systemen – Retrieval-Augmented Generation).&lt;br /&gt;
===Datentypen===&lt;br /&gt;
====1. Primitive / Elementare Datentypen====&lt;br /&gt;
Diese bilden die kleinsten Bausteine jedes Systems:&lt;br /&gt;
* Ganzzahlen (Integer): Diskrete Werte ohne Nachkommastellen (z. B. -42, 0, 1024).&lt;br /&gt;
* Gleitkommazahlen (Float, Double): Reelle Zahlen mit Nachkommastellen (z. B. 3.14159).&lt;br /&gt;
* Wahrheitswerte (Boolean): Binärwerte (true / false bzw. 1 / 0).&lt;br /&gt;
* Zeichen &amp;amp; Zeichenketten (Char, String): Textdaten (z. B. &amp;quot;Wissensgraph&amp;quot;).&lt;br /&gt;
* Datum &amp;amp; Zeit (Date, Timestamp): Zeitstempel zur zeitlichen Einordnung von Wissen.&lt;br /&gt;
&lt;br /&gt;
====2. Strukturierte &amp;amp; Komplexe Datentypen====&lt;br /&gt;
Dienen dazu, mehrere Datenpunkte logisch miteinander zu verknüpfen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Datentyp !! Beschreibung !! Beispiel / Anwendungsfall&lt;br /&gt;
|-&lt;br /&gt;
| Listen / Arrays || Geordnete Reihenfolge von Elementen || [1, 2, 3, 5, 8]&lt;br /&gt;
|-&lt;br /&gt;
| Schlüssel-Wert-Paare (Maps / Dictionaries) || Zuordnung von eindeutigen Keys zu Werten || {&amp;quot;Titel&amp;quot;: &amp;quot;Artikel&amp;quot;, &amp;quot;Autor&amp;quot;: &amp;quot;Max&amp;quot;}&lt;br /&gt;
|-&lt;br /&gt;
| Sätze (Sets) || Ungeordnete Mengen ohne Duplikate || {Rot, Grün, Blau}&lt;br /&gt;
|-&lt;br /&gt;
| JSON / BSON || Hierarchisch strukturierte Dokumente || Ideal für semi-strukturierte Wissenseinträge&lt;br /&gt;
|-&lt;br /&gt;
| Blob / Binary || Unstrukturierte Binärdaten || Bilder, Audio-Dateien, Dokumente&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====3. Semantische Datentypen (Wissensrepräsentation)====&lt;br /&gt;
In modernen Wissenssystemen (z. B. RDF, OWL, Knowledge Graphs) gehen Datentypen über rein technische Formate hinaus und beschreiben Bedeutung und Beziehungen:&lt;br /&gt;
* Entitäten / Ressourcen (URIs/IRIs): Eindeutige Identifikatoren für Objekte, Personen oder Konzepte (z. B. http://example.org/person/Thorsten).&lt;br /&gt;
* Literale: Konkrete Werte, die an Entitäten hängen (oft kombiniert mit XML-Schema-Datentypen wie xsd:string oder xsd:dateTime).&lt;br /&gt;
* Relational- / Kanten-Typen (Predicates): Beschreiben die Art der Beziehung zwischen zwei Entitäten (z. B. istAutorVon, gehörtZuKategorie).&lt;br /&gt;
* Vektoren (Embeddings): Dichte numerische Vektoren, die von KI-Modellen und Vektordatenbanken verwendet werden, um semantische Ähnlichkeit zwischen Texten oder Konzepten abzubilden.&lt;br /&gt;
&lt;br /&gt;
===Datenstrukturen===&lt;br /&gt;
Wissenssysteme (Knowledge Management Systems, Wissensdatenbanken) nutzen je nach Einsatzzweck, Flexibilität und Abfragesprache ganz unterschiedliche Datenstrukturen. Hier ist eine Übersicht der wichtigsten Strukturen – von einfach und unstrukturiert bis hin zu hochkomplex und semantisch vernetzt:&lt;br /&gt;
&lt;br /&gt;
====1. Unstrukturierte &amp;amp; Hierarchische Strukturen====&lt;br /&gt;
&#039;&#039;&#039;Flat Files / Plain Text (Markdown, Wikitext)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Daten liegen in einfachen Textdateien vor (oft mit Frontmatter für Metadaten).&lt;br /&gt;
* Vorteile: Extrem schnell, versionierbar (z. B. via Git), zukunftssicher und ohne Datenbank-Overhead.&lt;br /&gt;
* Einsatz: Static Site Generators (Hugo, Jekyll), moderne Notiz-Systeme (Obsidian, Logseq), flache Dokumentationen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Baumstrukturen &amp;amp; Taxonomien&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Hierarchische Anordnung in Ordnern, Kategorien oder Unterkategorien (Eltern-Kind-Beziehungen).&lt;br /&gt;
* Vorteile: Intuitive Navigation für Menschen, klar abgegrenzte Themenbereiche.&lt;br /&gt;
* Einsatz: Klassische Dateisysteme, Firmen-Wikis, Inhaltsverzeichnisse.&lt;br /&gt;
&lt;br /&gt;
====2. Strukturierte &amp;amp; Relationale Datenstrukturen====&lt;br /&gt;
&#039;&#039;&#039;Relationale Datenbanken (SQL)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Tabellen mit festem Schema, Primär- und Fremdschlüsseln (z. B. PostgreSQL, MySQL).&lt;br /&gt;
* Vorteile: Hohe Datenintegrität (ACID-Konformität), ausgereifte Abfragesprachen, hervorragend für strukturierte Metadaten.&lt;br /&gt;
* Einsatz: Klassische Enterprise-CMS (Drupal, TYPO3), Lernplattformen (Moodle), MediaWiki.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dokumentenorientierte Datenbanken (NoSQL)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Speicherung in semi-strukturierten Formaten wie JSON, BSON oder XML.&lt;br /&gt;
* Vorteile: Flexibles Schema, einfache Skalierbarkeit, schnelle Entwicklung bei sich ändernden Datenmodellen.&lt;br /&gt;
* Einsatz: MongoDB, CouchDB, dynamische Wissensplattformen.&lt;br /&gt;
&lt;br /&gt;
====3. Semantische &amp;amp; Vernetzte Strukturen (Graph-basiert)====&lt;br /&gt;
&#039;&#039;&#039;Eigenschaftsgraphen (Property Graphs)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Knoten (Entitäten) und Kanten (Beziehungen) tragen Schlüssel-Wert-Paare (Attributes).&lt;br /&gt;
* Vorteile: Abfrage von komplexen, tief verschachtelten Zusammenhängen ohne teure SQL-JOINs.&lt;br /&gt;
* Einsatz: Neo4j, Memgraph, Wissensnetze, Empfehlungsdienste.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RDF-Tripel / Semantisches Web (Knowledge Graphs)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Wissen wird in Form von Aussagen-Tripeln gespeichert: Subjekt → Prädikat → Objekt (z. B. „Ahrensburg → liegtIn → Schleswig-Holstein&amp;quot;).&lt;br /&gt;
* Vorteile: Standardisiert (W3C, SPARQL, OWL), erlaubt automatische logische Schlussfolgerungen (Inferenz).&lt;br /&gt;
* Einsatz: Wikidata, DBpedia, Semantic MediaWiki, ontologiebasierte Expertensysteme.&lt;br /&gt;
&lt;br /&gt;
====4. Moderne &amp;amp; Vektorbasierte Strukturen====&lt;br /&gt;
&#039;&#039;&#039;Vektordatenbanken (Embeddings)&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Texte oder Objekte werden durch Machine-Learning-Modelle in hochdimensionale Vektoren (Zahlenreihen) umgewandelt.&lt;br /&gt;
* Vorteile: Ermöglicht semantische Suche (Suche nach Bedeutung statt nach exakten Stichwörtern) und Retrieval-Augmented Generation (RAG).&lt;br /&gt;
* Einsatz: Pinecone, Qdrant, Chroma, pgvector für KI-Assistenten und LLM-Erweiterungen.&lt;br /&gt;
===Modelle===&lt;br /&gt;
Während die vorigen Abschnitte einzelne Daten, Datentypen und Datenstrukturen behandeln, beschreibt ein &#039;&#039;&#039;Modell&#039;&#039;&#039; das übergeordnete Ordnungsprinzip, nach dem ganze Wissensbestände organisiert werden. Die folgenden sieben Modelle sind die in der Praxis dominierenden Ansätze, von einfach bis hochformal.&lt;br /&gt;
&lt;br /&gt;
====1. Hierarchisches / Baum-Modell (Tree / Folder Model)====&lt;br /&gt;
* Prinzip: Ordnung über verschachtelte Ordner, Kategorien oder Seitenbäume (Eltern-Kind-Beziehung).&lt;br /&gt;
* Typischer Einsatz: Klassische CMS, Dateisysteme, Notiz-Apps (wie Notion, Confluence).&lt;br /&gt;
* Vorteil: Intuitive Bedienung, klare Navigation.&lt;br /&gt;
* Nachteil: Wissen lässt sich oft nicht eindeutig einem Fachbereich zuordnen (Problem der eierlegenden Wollmilchsau).&lt;br /&gt;
&lt;br /&gt;
====2. Flaches Modell mit Metadaten &amp;amp; Tags (Flat / Key-Value Model)====&lt;br /&gt;
* Prinzip: Alle Dokumente liegen auf einer Ebene (&amp;quot;Flat-File&amp;quot;) und werden über Schlagwörter (Tags), Taxonomien oder Key-Value-Eigenschaften charakterisiert.&lt;br /&gt;
* Typischer Einsatz: Flat-File CMS (z. B. Grav, Kirby), statische Wissensdatenbanken (Markdown-basiert mit Frontmatter).&lt;br /&gt;
* Vorteil: Keine starre Ordnerstruktur, hochgradig durchsuchbar, extrem einfach zu sichern/versionieren (z. B. mit Git).&lt;br /&gt;
* Nachteil: Ohne disziplinierte Verschlagwortung geht die Übersicht schnell verloren.&lt;br /&gt;
&lt;br /&gt;
====3. Relationales Datenmodell (Relational Model / SQL)====&lt;br /&gt;
* Prinzip: Wissen wird in zusammenhängenden Tabellen (Entitäten, Attribute, Fremdschlüssel) strukturiert.&lt;br /&gt;
* Typischer Einsatz: Enterprise-Wikis, Moodle/LMS, strukturierte Unternehmensdatenbanken.&lt;br /&gt;
* Vorteil: Hohe Datenintegrität, komplexe Abfragen über Fremdschlüssel und Tabellenverknüpfungen möglich.&lt;br /&gt;
* Nachteil: Starres Schema; Schemaänderungen bei sich veränderndem Wissen sind aufwendig.&lt;br /&gt;
&lt;br /&gt;
====4. Netzwerk- / Graphen-Modell (Graph Model)====&lt;br /&gt;
* Prinzip: Daten bestehen aus Knoten (Entitäten/Dokumenten) und Kanten (Beziehungen).&lt;br /&gt;
* Typischer Einsatz: Personal Knowledge Management (z. B. Obsidian, Roam Research), Graph-Datenbanken (Neo4j).&lt;br /&gt;
* Vorteil: Spiegelt vernetztes Denken wider. Beziehungen wie &#039;&#039;[Projekt X] --hängt ab von--&amp;gt; [Technologie Y]&#039;&#039; sind native Bestandteile der Datenbank.&lt;br /&gt;
* Nachteil: Schwer zu visualisieren/navigieren bei sehr großen Datenmengen ohne gute Filter.&lt;br /&gt;
&lt;br /&gt;
====5. Semantisches / Triples-Modell (RDF / Knowledge Graph)====&lt;br /&gt;
* Prinzip: Wissen wird in formallogischen Aussagen aus Subjekt – Prädikat – Objekt (Triples) gespeichert (z. B. &#039;&#039;[MediaWiki] [verwendet] [PostgreSQL]&#039;&#039;).&lt;br /&gt;
* Typischer Einsatz: Semantic MediaWiki, Wikidata, Ontologie-Systeme (OWL, RDF/SPARQL).&lt;br /&gt;
* Vorteil: Maschinenlesbar, erlaubt automatische logische Rückschlüsse (Inferenz) und komplexe semantische Abfragen.&lt;br /&gt;
* Nachteil: Hohe Einarbeitungszeit und formale Komplexität beim Erstellen der Ontologien.&lt;br /&gt;
&lt;br /&gt;
====6. Dokumentenorientiertes Modell (NoSQL / JSON)====&lt;br /&gt;
* Prinzip: Ein Wissenselement ist ein eigenständiges, strukturiertes Dokument (z. B. JSON/YAML), das eingebettete Attribute und Arrays enthält.&lt;br /&gt;
* Typischer Einsatz: CouchDB, MongoDB, elasticsearch-basierte Wissensspeicher.&lt;br /&gt;
* Vorteil: Flexibles Schema; jedes Dokument kann individuelle Felder haben, ohne das Gesamtsystem zu blockieren.&lt;br /&gt;
* Nachteil: Redundanzen bei Datenbanksicherungen, schwächere Konsistenzprüfungen als bei SQL.&lt;br /&gt;
&lt;br /&gt;
====7. Vektorraum-Modell (Embedding / Latent Space Model)====&lt;br /&gt;
* Prinzip: Wissen wird nicht symbolisch, sondern als Position in einem hochdimensionalen Vektorraum repräsentiert; semantische Nähe entspricht geometrischer Nähe (siehe auch [[#Vektor-Daten (für KI &amp;amp; RAG)|Vektor-Daten]] weiter oben).&lt;br /&gt;
* Typischer Einsatz: Retrieval-Augmented Generation (RAG), semantische Suche, Empfehlungssysteme (Pinecone, Qdrant, pgvector).&lt;br /&gt;
* Vorteil: Findet Zusammenhänge über Bedeutung statt exakter Begriffe, robust gegenüber Synonymen und unscharfen Anfragen.&lt;br /&gt;
* Nachteil: Nicht direkt interpretierbar (&amp;quot;Black Box&amp;quot;), keine expliziten Regeln oder Beziehungen wie im Graphen-Modell.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; In der Praxis werden diese Modelle selten pur eingesetzt, sondern kombiniert – dieses Wiki selbst ist ein Beispiel: Es nutzt eine Baumstruktur (Modell 1, über die `==`/`===`-Überschriften), liegt aber als flache, versionierte Textdatei vor (Modell 2).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Nr. !! Modell !! Kernprinzip !! Größter Vorteil !! Größter Nachteil&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Hierarchisch (Baum) || Eltern-Kind-Verschachtelung || Intuitive Navigation || Eindeutige Einordnung oft unmöglich&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Flach mit Tags || Ebene Dateien + Metadaten || Einfach, git-versionierbar || Erfordert Tagging-Disziplin&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Relational (SQL) || Tabellen + Fremdschlüssel || Hohe Datenintegrität || Starres Schema&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Graph (Property Graph) || Knoten + Kanten || Bildet vernetztes Denken ab || Schwer visualisierbar bei großer Skala&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Semantisch (RDF/Triples) || Subjekt–Prädikat–Objekt || Maschinelle Inferenz möglich || Hoher Formalisierungsaufwand&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Dokumentenorientiert (NoSQL) || Eigenständige JSON-Dokumente || Flexibles Schema || Schwächere Konsistenzprüfung&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Vektorraum (Embeddings) || Position im semantischen Raum || Suche nach Bedeutung statt Begriff || Nicht direkt interpretierbar&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Algorithmen und Programmlogik===&lt;br /&gt;
Wenn es darum geht, Algorithmen und Programmlogik bildhaft, strukturiert oder regelbasiert darzustellen, unterscheidet man zwischen visuellen Repräsentationsformen (zur Dokumentation und Planung) und formalen Wissenssystemen (zur automatischen Verarbeitung).&lt;br /&gt;
&lt;br /&gt;
====1. Visuelle Wissenssysteme &amp;amp; Graphische Modelle====&lt;br /&gt;
Diese Systeme helfen Entwicklern und Lernenden, die Logik eines Programms unabhängig von einer konkreten Programmiersprache zu visualisieren.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! System / Modell !! Einsatzbereich !! Besonderheit / Logikbausteine&lt;br /&gt;
|-&lt;br /&gt;
| Nassi-Shneiderman-Diagramm (Struktogramm) || Strukturierte Programmierung, Lehre &amp;amp; Didaktik || Vermeidet Unordnung (kein Pfeilsalat). Basiert auf Sequenz, Auswahl (If-Else) und Wiederholung (Schleifen).&lt;br /&gt;
|-&lt;br /&gt;
| Programmablaufplan (PAP) / Flowchart || Prozessvisualisierung, technische Abläufe || Klassisches Flussdiagramm (DIN 66001) mit Pfeilen, Rauten für Entscheidungen und Rechtecken für Aktionen.&lt;br /&gt;
|-&lt;br /&gt;
| UML-Aktivitätsdiagramm || Software-Engineering, objektorientiertes Design || Standard in der Industrie. Zeigt komplexe Kontroll- und Datenflüsse inklusive paralleler Verzweigungen.&lt;br /&gt;
|-&lt;br /&gt;
| Entscheidungstabellen || Komplexe Geschäftslogik &amp;amp; Regelwerke || Stellt alle möglichen Bedingungen und daraus resultierende Aktionen in Tabellenform gegenüber.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====2. Formale &amp;amp; Regelbasierte Wissenssysteme====&lt;br /&gt;
Diese Systeme dienen nicht nur der Visualisierung, sondern führen Programmlogik und Regeln direkt aus:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Regelbasierte Systeme &amp;amp; Expertensysteme&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Wissen wird in Form von Fakten und Logikregeln (WENN Bedingung DANN Aktion) gespeichert. Eine Inferenzmaschine (Inference Engine) wertet diese Logik aus.&lt;br /&gt;
* Beispiele:&lt;br /&gt;
** Prolog: Deklarative Programmierung basierend auf Prädikatenlogik.&lt;br /&gt;
** Drools / Business Rules Engines: Für komplexe Geschäftsregeln im Unternehmensumfeld.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pseudocode &amp;amp; Algorithmen-Markup&#039;&#039;&#039;&lt;br /&gt;
* Funktionsweise: Eine strukturierte, halbsprachliche Beschreibung von Logik. Er kombiniert natürliche Sprache mit Elementen höherer Programmiersprachen.&lt;br /&gt;
* Vorteil: Unabhängig von Syntaxfehlern und konzentriert auf das reine Problemlösungsmuster.&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Hauptseite&amp;diff=39</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Hauptseite&amp;diff=39"/>
		<updated>2026-08-13T11:26:02Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: /* Hinweis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;br /&gt;
== Grundaufbau eines Wissensmanagement-Systems ==&lt;br /&gt;
Die folgenden Bausteine beschreiben kein klassisches CMS für Blog-Artikel, sondern ein &#039;&#039;&#039;Wissensmanagement-System (Wiki-artig)&#039;&#039;&#039;: Im Mittelpunkt steht nicht die einzelne Seite, sondern das Netz aus Wissensartikeln, ihren Verknüpfungen und ihrer Auffindbarkeit. Entsprechend rücken Taxonomie, Verlinkung und Suche stärker in den Vordergrund als bei einem reinen Content-Ausgabe-System.&lt;br /&gt;
&lt;br /&gt;
== Hauptbausteine im Detail ==&lt;br /&gt;
&lt;br /&gt;
=== [[Data Engine]] ([[Wissensmodell]] &amp;amp;  [[Speicherung]]) ===&lt;br /&gt;
Das Herzstück des Systems. Es definiert, wie Wissensartikel und ihre Beziehungen abgelegt werden:&lt;br /&gt;
* Entwickler-Entscheidung: Monolithisches Datenmodell (feste Tabellen für articles, categories, tags) oder flexibles Schema (JSONB / EAV-Muster für benutzerdefinierte Wissens-Typen wie Glossareinträge, How-Tos, FAQs).&lt;br /&gt;
* Taxonomie als Kernbestandteil: Eigene Tabellen für Kategorien, Tags und Artikel-Artikel-Relationen (Verlinkungen), nicht nur für den Inhalt selbst.&lt;br /&gt;
* Mandantenfähigkeit / Multi-Tenancy (optional): Trennung von Daten per tenant_id-Spalte oder separaten Datenbankschemas.&lt;br /&gt;
* Datenbank: Relationale Datenbanken wie PostgreSQL bieten mit JSON-Unterstützung volle Flexibilität bei hoher Integrität – wichtig, da Wissensartikel oft variable Zusatzfelder benötigen.&lt;br /&gt;
&lt;br /&gt;
=== Content &amp;amp; Routing Layer (Wissensartikel-Verwaltung &amp;amp; URLs) ===&lt;br /&gt;
Verantwortlich für das Laden und Rendern von Wissensartikeln für Nutzer:&lt;br /&gt;
* Slug-Mapping: Zuordnung von lesbaren Pfaden (/wiki/rust-cms-guide) zu Datenbank-Einträgen.&lt;br /&gt;
* Status &amp;amp; Versionierung: Artikel besitzen Zustände (draft, published, archived) sowie eine Revisions-Historie – bei einem Wissenssystem meist zentraler als bei einem Blog, da Artikel fortlaufend gepflegt statt einmalig veröffentlicht werden.&lt;br /&gt;
* Rendering:&lt;br /&gt;
** Server-Side Rendering (SSR): HTML wird direkt über eine Template-Engine (z. B. Askama, Tera) gerendert.&lt;br /&gt;
** Headless (API): Ausgabe von JSON für entkoppelte Frontends.&lt;br /&gt;
&lt;br /&gt;
=== Wissensverknüpfung &amp;amp; Taxonomie (Knowledge Graph) ===&lt;br /&gt;
Das eigentliche Unterscheidungsmerkmal eines Wissenssystems gegenüber einem reinen CMS – Wissen entsteht durch Verknüpfung, nicht nur durch einzelne Artikel:&lt;br /&gt;
* Wiki-Links &amp;amp; Backlinks: Erkennung von Verweisen zwischen Artikeln (z. B. &amp;lt;nowiki&amp;gt;[[Artikelname]]&amp;lt;/nowiki&amp;gt;-Syntax) sowie automatische Rückverfolgung, welche Artikel auf einen bestimmten Artikel verlinken.&lt;br /&gt;
* Kategorien &amp;amp; Tags: Hierarchische und flache Klassifizierung von Wissensartikeln zur Navigation und Filterung.&lt;br /&gt;
* Verwandte Artikel: Automatische oder manuelle Vorschläge thematisch ähnlicher Artikel (z. B. über gemeinsame Tags oder Verlinkungsdichte).&lt;br /&gt;
* Glossar &amp;amp; Begriffsdefinitionen: Zentrale Verwaltung wiederkehrender Fachbegriffe, die aus Artikeltexten heraus verlinkt werden können.&lt;br /&gt;
&lt;br /&gt;
=== Authentication &amp;amp; Authorization (Sicherheit) ===&lt;br /&gt;
Trennt den öffentlichen Bereich vom Verwaltungsbereich:&lt;br /&gt;
* Authentifizierung: Identitätsprüfung von Benutzern (z. B. Session-Cookies oder JWT-Tokens).&lt;br /&gt;
* Rechteverwaltung (RBAC): Rollenbasierte Zugriffskontrolle (z. B. Admin, Editor, Author), um festzulegen, wer welche Endpunkte oder Inhalte bearbeiten darf.&lt;br /&gt;
&lt;br /&gt;
=== Media Manager (Dateiverwaltung) ===&lt;br /&gt;
Verwaltet Bilder, PDFs und sonstige Uploads:&lt;br /&gt;
* Upload-Pipeline: Empfang von Dateien, Prüfung von MIME-Types und Dateigrößen.&lt;br /&gt;
* Verarbeitung: Automatische Skalierung oder Konvertierung von Bildern (z. B. Erzeugung von WebP-Thumbnails).&lt;br /&gt;
* Storage: Speicherung auf dem lokalen Dateisystem oder in einem Object-Storage (S3/MinIO).&lt;br /&gt;
&lt;br /&gt;
=== Admin Backend (Verwaltungsoberfläche) ===&lt;br /&gt;
Die Benutzeroberfläche für Redakteure:&lt;br /&gt;
* Rich-Text / Markdown Editor: Eingabeoberfläche für Inhalte.&lt;br /&gt;
* REST / gRPC / GraphQL API: Kommuniziert mit dem Backend, um Inhalte, Einstellungen, Benutzer und Medien zu verwalten.&lt;br /&gt;
&lt;br /&gt;
=== Caching &amp;amp; Performance Layer ===&lt;br /&gt;
Verhindert unnötige Datenbankabfragen bei hoher Last:&lt;br /&gt;
* HTTP-Caching: Passende Header (Cache-Control, ETag) für Nginx oder CDNs.&lt;br /&gt;
* In-Memory Caching: Zwischenspeichern von zusammengestellten Seiten oder Datenbank-Ergebnissen (z. B. über In-Memory-Stores oder Redis).&lt;br /&gt;
&lt;br /&gt;
=== Search &amp;amp; Discovery (Suche) ===&lt;br /&gt;
In einem Wissenssystem oft der wichtigste Einstiegspunkt überhaupt – Nutzer suchen gezielt nach Antworten statt zu stöbern:&lt;br /&gt;
* DB-native Suche: Volltextsuche über PostgreSQL tsvector/tsquery, ausreichend für kleinere bis mittlere Datenmengen.&lt;br /&gt;
* Externer Suchindex: Bei höheren Anforderungen an Relevanz und Performance Anbindung an Meilisearch, Typesense oder Elasticsearch.&lt;br /&gt;
* Facettierung &amp;amp; Filter: Eingrenzung nach Kategorie, Tag, Datum oder Autor.&lt;br /&gt;
&lt;br /&gt;
=== SEO &amp;amp; Metadata ===&lt;br /&gt;
Sorgt dafür, dass Inhalte von Suchmaschinen korrekt erfasst werden:&lt;br /&gt;
* Meta-Tags &amp;amp; Open Graph: Pro Inhalt konfigurierbare Title-, Description- und Social-Preview-Daten.&lt;br /&gt;
* Sitemap &amp;amp; Robots: Automatisch generierte sitemap.xml und robots.txt.&lt;br /&gt;
* Kanonische URLs &amp;amp; Redirects: Vermeidung von Duplicate Content, Verwaltung von 301-Weiterleitungen bei Slug-Änderungen.&lt;br /&gt;
&lt;br /&gt;
=== Plugin- &amp;amp; Extension-System ===&lt;br /&gt;
Erlaubt es, Funktionalität ohne Eingriff in den Core zu erweitern:&lt;br /&gt;
* Hooks &amp;amp; Events: Definierte Erweiterungspunkte (z. B. before_publish, after_upload), an denen Plugins andocken können.&lt;br /&gt;
* Middleware-Ketten: Zusätzliche Verarbeitungsschritte in Request/Response-Pipeline einschiebbar.&lt;br /&gt;
&lt;br /&gt;
=== Background Jobs / Task Queue ===&lt;br /&gt;
Verlagert zeitintensive Arbeiten aus dem Request-Zyklus:&lt;br /&gt;
* Queue-Anbindung: Asynchrone Verarbeitung über Redis-basierte Queues oder tokio-Task-Runner.&lt;br /&gt;
* Typische Jobs: Bildkonvertierung, E-Mail-Versand, Sitemap-Neubau, Webhook-Zustellung.&lt;br /&gt;
* Retry &amp;amp; Fehlerbehandlung: Wiederholungslogik und Dead-Letter-Handling bei fehlgeschlagenen Jobs.&lt;br /&gt;
&lt;br /&gt;
=== Internationalisierung (i18n / l10n) ===&lt;br /&gt;
Unterstützt mehrsprachige Inhalte und Oberflächen:&lt;br /&gt;
* Mehrsprachige Inhalte: Übersetzungsstatus pro Sprache und Content-Objekt.&lt;br /&gt;
* Locale-Routing: Sprachspezifische Pfade (/de/…, /en/…) oder Subdomains.&lt;br /&gt;
* UI-Übersetzung: Lokalisierte Texte im Admin Backend.&lt;br /&gt;
&lt;br /&gt;
=== Notifications &amp;amp; E-Mail ===&lt;br /&gt;
Kommuniziert Systemereignisse an Nutzer und Redakteure:&lt;br /&gt;
* Transaktionale Mails: Passwort-Reset, Einladungen, Kommentar-Benachrichtigungen.&lt;br /&gt;
* Workflow-Benachrichtigungen: Hinweise bei Freigabe-Anfragen oder Statuswechseln von Inhalten.&lt;br /&gt;
&lt;br /&gt;
=== Audit-Log &amp;amp; Monitoring ===&lt;br /&gt;
Schafft Nachvollziehbarkeit und Betriebssicherheit:&lt;br /&gt;
* Audit-Log: Protokollierung, wer wann welche Änderung vorgenommen hat (Compliance, Nachvollziehbarkeit).&lt;br /&gt;
* Monitoring &amp;amp; Tracing: Metriken, Logs und Fehlerreporting für den laufenden Betrieb (z. B. über OpenTelemetry).&lt;br /&gt;
&lt;br /&gt;
=== Konfigurationsmanagement ===&lt;br /&gt;
Zentrale Steuerung systemweiter Einstellungen:&lt;br /&gt;
* Site-Settings: Globale Konfiguration wie Seitenname, Standardsprache, Zeitzone.&lt;br /&gt;
* Feature-Flags: Kontrolliertes Ein-/Ausschalten einzelner Funktionen ohne Redeploy.&lt;br /&gt;
&lt;br /&gt;
=== Deployment &amp;amp; Infrastructure ===&lt;br /&gt;
Betrifft Betrieb und Wartbarkeit des Systems:&lt;br /&gt;
* Migrations-Tooling: Versionierte Datenbank-Migrationen (z. B. via sqlx oder refinery).&lt;br /&gt;
* CI/CD: Automatisierte Tests und Deployments.&lt;br /&gt;
* Backup-Strategie: Regelmäßige Sicherung von Datenbank und Medien-Storage.&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[Grundbegriffe Informatik]]&lt;br /&gt;
==Hinweis==&lt;br /&gt;
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Wiki.js_Rust-Datenmodell&amp;diff=38</id>
		<title>Wiki.js Rust-Datenmodell</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Wiki.js_Rust-Datenmodell&amp;diff=38"/>
		<updated>2026-08-12T14:39:41Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;br /&gt;
&lt;br /&gt;
Dieses Dokument beschreibt ein reines Rust-Datenmodell (Structs/Enums, ohne externe Crates wie &amp;lt;code&amp;gt;serde&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sqlx&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;chrono&amp;lt;/code&amp;gt;) für das PostgreSQL-Schema von [https://github.com/requarks/wiki Wiki.js] (&amp;lt;code&amp;gt;server/models/*.js&amp;lt;/code&amp;gt; + Knex-Migrationen). Der vollständige Quelltext liegt in &amp;lt;code&amp;gt;wikijs_models.rs&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Überblick ==&lt;br /&gt;
&lt;br /&gt;
* Keine Abhängigkeiten — reine &amp;lt;code&amp;gt;std&amp;lt;/code&amp;gt;.&lt;br /&gt;
* JSONB-Spalten werden als roher JSON-Text (&amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;) abgebildet — kein eigener JSON-Typ.&lt;br /&gt;
* Zeitstempel werden über den ebenfalls selbstgebauten Typ &amp;lt;code&amp;gt;Timestamp&amp;lt;/code&amp;gt; (Unix-Zeit in Sekunden) abgebildet (siehe [[#Timestamp]]).&lt;br /&gt;
* Enums bilden die in Wiki.js als String/Int gespeicherten &amp;quot;closed sets&amp;quot; ab (z. B. &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;kind&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Cargo.toml ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[dependencies]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Timestamp ==&lt;br /&gt;
&lt;br /&gt;
Einfacher Zeitstempel ohne externe Crates.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| 0 (Tupelfeld) || i64 || Unix-Zeit in Sekunden seit 1970-01-01 UTC&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pages ==&lt;br /&gt;
&lt;br /&gt;
=== Page ===&lt;br /&gt;
&lt;br /&gt;
Entspricht der Tabelle &amp;lt;code&amp;gt;pages&amp;lt;/code&amp;gt; — Kerntabelle für Wiki-Seiten.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || i32 || Primärschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| path || String || Seitenpfad&lt;br /&gt;
|-&lt;br /&gt;
| hash || String || Hash des Pfads (für Lookups)&lt;br /&gt;
|-&lt;br /&gt;
| title || String || Titel&lt;br /&gt;
|-&lt;br /&gt;
| description || String || Kurzbeschreibung&lt;br /&gt;
|-&lt;br /&gt;
| is_private || bool || private Sichtbarkeit&lt;br /&gt;
|-&lt;br /&gt;
| is_published || bool || veröffentlicht?&lt;br /&gt;
|-&lt;br /&gt;
| private_ns || Option&amp;amp;lt;String&amp;amp;gt; || private Namespace-Kennung&lt;br /&gt;
|-&lt;br /&gt;
| publish_start_date || Option&amp;amp;lt;Timestamp&amp;amp;gt; || Start des Veröffentlichungsfensters&lt;br /&gt;
|-&lt;br /&gt;
| publish_end_date || Option&amp;amp;lt;Timestamp&amp;amp;gt; || Ende des Veröffentlichungsfensters&lt;br /&gt;
|-&lt;br /&gt;
| content || String || Rohinhalt (Quelltext)&lt;br /&gt;
|-&lt;br /&gt;
| content_type || [[#ContentType]] || Editor-/Renderformat&lt;br /&gt;
|-&lt;br /&gt;
| render || Option&amp;amp;lt;String&amp;amp;gt; || gerenderter HTML-Output&lt;br /&gt;
|-&lt;br /&gt;
| toc || Option&amp;amp;lt;String&amp;amp;gt; || Inhaltsverzeichnis-Baum als roher JSON-Text&lt;br /&gt;
|-&lt;br /&gt;
| extra || Option&amp;amp;lt;String&amp;amp;gt; || beliebige Zusatzdaten als roher JSON-Text&lt;br /&gt;
|-&lt;br /&gt;
| editor_key || String || genutzter Editor&lt;br /&gt;
|-&lt;br /&gt;
| locale_code || String || Sprachcode&lt;br /&gt;
|-&lt;br /&gt;
| creator_id || i32 || erstellender Benutzer&lt;br /&gt;
|-&lt;br /&gt;
| author_id || i32 || letzter Bearbeiter&lt;br /&gt;
|-&lt;br /&gt;
| owner_id || i32 || Eigentümer&lt;br /&gt;
|-&lt;br /&gt;
| css || Option&amp;amp;lt;String&amp;amp;gt; || seitenspezifisches CSS&lt;br /&gt;
|-&lt;br /&gt;
| script_css || Option&amp;amp;lt;String&amp;amp;gt; || zusätzliches CSS (Skript-Editor)&lt;br /&gt;
|-&lt;br /&gt;
| script_js || Option&amp;amp;lt;String&amp;amp;gt; || zusätzliches JS (Skript-Editor)&lt;br /&gt;
|-&lt;br /&gt;
| created_at || Timestamp || Erstellungszeitpunkt&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp || letzte Änderung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== ContentType ===&lt;br /&gt;
&lt;br /&gt;
Editor/Rendering-Format einer Seite (&amp;lt;code&amp;gt;pages.contentType&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pageHistory.contentType&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Markdown&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Html&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Asciidoc&amp;lt;/code&amp;gt; — nicht mehr aktiv genutzt, aber historisch im Schema möglich&lt;br /&gt;
&lt;br /&gt;
=== PageHistory ===&lt;br /&gt;
&lt;br /&gt;
Entspricht der Tabelle &amp;lt;code&amp;gt;pageHistory&amp;lt;/code&amp;gt; — Versionsverlauf, gleiche Spalten wie [[#Page]] plus &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;version_date&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || i32 || Primärschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| page_id || i32 || zugehörige Seite&lt;br /&gt;
|-&lt;br /&gt;
| path || String || Seitenpfad zum Zeitpunkt der Version&lt;br /&gt;
|-&lt;br /&gt;
| hash || String || Hash des Pfads&lt;br /&gt;
|-&lt;br /&gt;
| title || String || Titel zum Zeitpunkt der Version&lt;br /&gt;
|-&lt;br /&gt;
| description || String || Kurzbeschreibung&lt;br /&gt;
|-&lt;br /&gt;
| is_private || bool || private Sichtbarkeit&lt;br /&gt;
|-&lt;br /&gt;
| content || String || Rohinhalt dieser Version&lt;br /&gt;
|-&lt;br /&gt;
| content_type || [[#ContentType]] || Editor-/Renderformat&lt;br /&gt;
|-&lt;br /&gt;
| render || Option&amp;amp;lt;String&amp;amp;gt; || gerenderter HTML-Output&lt;br /&gt;
|-&lt;br /&gt;
| toc || Option&amp;amp;lt;String&amp;amp;gt; || Inhaltsverzeichnis-Baum als roher JSON-Text&lt;br /&gt;
|-&lt;br /&gt;
| editor_key || String || genutzter Editor&lt;br /&gt;
|-&lt;br /&gt;
| locale_code || String || Sprachcode&lt;br /&gt;
|-&lt;br /&gt;
| action || [[#PageHistoryAction]] || Art der Änderung&lt;br /&gt;
|-&lt;br /&gt;
| version_date || Timestamp || Zeitpunkt der Version&lt;br /&gt;
|-&lt;br /&gt;
| author_id || i32 || Bearbeiter dieser Version&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== PageHistoryAction ===&lt;br /&gt;
&lt;br /&gt;
Art der historisierten Änderung (&amp;lt;code&amp;gt;pageHistory.action&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Initial&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Edit&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Delete&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Move&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Restore&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PageLink ===&lt;br /&gt;
&lt;br /&gt;
Entspricht der Tabelle &amp;lt;code&amp;gt;pageLinks&amp;lt;/code&amp;gt; — extrahierte Verlinkungen zwischen Seiten (für Broken-Link-Check).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || i32 || Primärschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| path || String || Ziel-Pfad des Links&lt;br /&gt;
|-&lt;br /&gt;
| locale_code || String || Sprachcode des Ziels&lt;br /&gt;
|-&lt;br /&gt;
| page_id || i32 || Quellseite des Links&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
&lt;br /&gt;
=== Tag ===&lt;br /&gt;
&lt;br /&gt;
Entspricht der Tabelle &amp;lt;code&amp;gt;tags&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || i32 || Primärschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| tag || String || Tag-Slug&lt;br /&gt;
|-&lt;br /&gt;
| title || Option&amp;amp;lt;String&amp;amp;gt; || Anzeigename&lt;br /&gt;
|-&lt;br /&gt;
| created_at || Timestamp || Erstellungszeitpunkt&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp || letzte Änderung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== PageTag ===&lt;br /&gt;
&lt;br /&gt;
Join-Tabelle &amp;lt;code&amp;gt;pageTags&amp;lt;/code&amp;gt; (n:m zwischen [[#Page]] und [[#Tag]]).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| page_id || i32 || FK auf [[#Page]]&lt;br /&gt;
|-&lt;br /&gt;
| tag_id || i32 || FK auf [[#Tag]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Users ==&lt;br /&gt;
&lt;br /&gt;
=== User ===&lt;br /&gt;
&lt;br /&gt;
Entspricht der Tabelle &amp;lt;code&amp;gt;users&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || i32 || Primärschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| email || String || E-Mail-Adresse&lt;br /&gt;
|-&lt;br /&gt;
| name || String || Anzeigename&lt;br /&gt;
|-&lt;br /&gt;
| provider || String || Modul-ID des Auth-Providers (z. B. &amp;quot;local&amp;quot;, &amp;quot;ldap&amp;quot;, &amp;quot;google&amp;quot;, &amp;quot;azure&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| provider_id || Option&amp;amp;lt;String&amp;amp;gt; || externe Provider-ID&lt;br /&gt;
|-&lt;br /&gt;
| provider_key || Option&amp;amp;lt;String&amp;amp;gt; || Provider-Schlüssel&lt;br /&gt;
|-&lt;br /&gt;
| password || Option&amp;amp;lt;String&amp;amp;gt; || bcrypt-Hash, nur bei provider == &amp;quot;local&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| tfa_is_active || bool || Zwei-Faktor-Auth aktiv?&lt;br /&gt;
|-&lt;br /&gt;
| tfa_secret || Option&amp;amp;lt;String&amp;amp;gt; || 2FA-Secret&lt;br /&gt;
|-&lt;br /&gt;
| job_title || Option&amp;amp;lt;String&amp;amp;gt; || Berufsbezeichnung&lt;br /&gt;
|-&lt;br /&gt;
| location || Option&amp;amp;lt;String&amp;amp;gt; || Standort&lt;br /&gt;
|-&lt;br /&gt;
| picture_url || Option&amp;amp;lt;String&amp;amp;gt; || Profilbild-URL&lt;br /&gt;
|-&lt;br /&gt;
| timezone || String || Zeitzone&lt;br /&gt;
|-&lt;br /&gt;
| date_format || String || bevorzugtes Datumsformat&lt;br /&gt;
|-&lt;br /&gt;
| appearance || String || UI-Theme-Einstellung&lt;br /&gt;
|-&lt;br /&gt;
| is_system || bool || Systembenutzer?&lt;br /&gt;
|-&lt;br /&gt;
| is_active || bool || Konto aktiv?&lt;br /&gt;
|-&lt;br /&gt;
| is_verified || bool || E-Mail verifiziert?&lt;br /&gt;
|-&lt;br /&gt;
| meta || Option&amp;amp;lt;String&amp;amp;gt; || beliebige Provider-spezifische Zusatzdaten als roher JSON-Text&lt;br /&gt;
|-&lt;br /&gt;
| last_login_at || Option&amp;amp;lt;Timestamp&amp;amp;gt; || letzter Login&lt;br /&gt;
|-&lt;br /&gt;
| created_at || Timestamp || Erstellungszeitpunkt&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp || letzte Änderung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== UserKeyKind ===&lt;br /&gt;
&lt;br /&gt;
Zweck eines temporären Tokens (&amp;lt;code&amp;gt;userKeys.kind&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Validation&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ResetPwd&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ChangeEmail&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Api&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== UserKey ===&lt;br /&gt;
&lt;br /&gt;
Entspricht der Tabelle &amp;lt;code&amp;gt;userKeys&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || i32 || Primärschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| kind || [[#UserKeyKind]] || Zweck des Tokens&lt;br /&gt;
|-&lt;br /&gt;
| token || String || Token-Wert&lt;br /&gt;
|-&lt;br /&gt;
| user_id || i32 || FK auf [[#User]]&lt;br /&gt;
|-&lt;br /&gt;
| expiration || Timestamp || Ablaufzeitpunkt&lt;br /&gt;
|-&lt;br /&gt;
| created_at || Timestamp || Erstellungszeitpunkt&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp || letzte Änderung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Groups ==&lt;br /&gt;
&lt;br /&gt;
=== Group ===&lt;br /&gt;
&lt;br /&gt;
Entspricht der Tabelle &amp;lt;code&amp;gt;groups&amp;lt;/code&amp;gt; — Rechte- und Gruppenverwaltung.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || i32 || Primärschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| name || String || Gruppenname&lt;br /&gt;
|-&lt;br /&gt;
| is_system || bool || Systemgruppe?&lt;br /&gt;
|-&lt;br /&gt;
| permissions || Vec&amp;amp;lt;[[#Permission]]&amp;amp;gt; || globale Rechte, z. B. [ReadPages, WritePages]&lt;br /&gt;
|-&lt;br /&gt;
| page_rules || Vec&amp;amp;lt;[[#PageRule]]&amp;amp;gt; || pfadbasierte Zugriffsregeln&lt;br /&gt;
|-&lt;br /&gt;
| created_at || Timestamp || Erstellungszeitpunkt&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp || letzte Änderung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== UserGroup ===&lt;br /&gt;
&lt;br /&gt;
Join-Tabelle &amp;lt;code&amp;gt;userGroups&amp;lt;/code&amp;gt; (n:m zwischen [[#User]] und [[#Group]]).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| user_id || i32 || FK auf [[#User]]&lt;br /&gt;
|-&lt;br /&gt;
| group_id || i32 || FK auf [[#Group]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Permission ===&lt;br /&gt;
&lt;br /&gt;
Bekannte globale Rechte, in &amp;lt;code&amp;gt;groups.permissions&amp;lt;/code&amp;gt; als String-Array (JSON) gespeichert.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ManageSystem&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ManageGroups&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ManageNavigation&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ManageTheme&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ManageApi&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ManageUsers&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ManagePages&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ReadPages&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ReadAssets&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ReadComments&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;WritePages&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;WriteAssets&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;WriteComments&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ManageComments&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;DeletePages&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;DeleteAssets&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;DeleteComments&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PageRule ===&lt;br /&gt;
&lt;br /&gt;
Ein Eintrag aus &amp;lt;code&amp;gt;groups.pageRules&amp;lt;/code&amp;gt; (JSONB-Array).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || String || Regel-ID&lt;br /&gt;
|-&lt;br /&gt;
| deny || bool || Regel verweigert (statt erlaubt)?&lt;br /&gt;
|-&lt;br /&gt;
| roles || Vec&amp;amp;lt;[[#Permission]]&amp;amp;gt; || betroffene Rechte&lt;br /&gt;
|-&lt;br /&gt;
| match (r#match) || [[#PageRuleMatch]] || Art des Pfad-Matchings&lt;br /&gt;
|-&lt;br /&gt;
| path || String || Pfad-Muster&lt;br /&gt;
|-&lt;br /&gt;
| locales || Vec&amp;amp;lt;String&amp;amp;gt; || betroffene Sprachcodes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== PageRuleMatch ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Start&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;End&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Regex&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Exact&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Tag&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
&lt;br /&gt;
=== Comment ===&lt;br /&gt;
&lt;br /&gt;
Entspricht der Tabelle &amp;lt;code&amp;gt;comments&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || i32 || Primärschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| content || String || Rohinhalt des Kommentars&lt;br /&gt;
|-&lt;br /&gt;
| render || String || gerenderter HTML-Output&lt;br /&gt;
|-&lt;br /&gt;
| name || String || angezeigter Name&lt;br /&gt;
|-&lt;br /&gt;
| email || String || E-Mail des Verfassers&lt;br /&gt;
|-&lt;br /&gt;
| ip || String || IP-Adresse des Verfassers&lt;br /&gt;
|-&lt;br /&gt;
| page_id || i32 || FK auf [[#Page]]&lt;br /&gt;
|-&lt;br /&gt;
| author_id || i32 || FK auf [[#User]]&lt;br /&gt;
|-&lt;br /&gt;
| created_at || Timestamp || Erstellungszeitpunkt&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp || letzte Änderung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Assets ==&lt;br /&gt;
&lt;br /&gt;
=== Asset ===&lt;br /&gt;
&lt;br /&gt;
Entspricht der Tabelle &amp;lt;code&amp;gt;assets&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || i32 || Primärschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| filename || String || Dateiname&lt;br /&gt;
|-&lt;br /&gt;
| ext || String || Dateiendung&lt;br /&gt;
|-&lt;br /&gt;
| kind || [[#AssetKind]] || Art der Datei&lt;br /&gt;
|-&lt;br /&gt;
| mime || String || MIME-Type&lt;br /&gt;
|-&lt;br /&gt;
| file_size || i64 || Dateigröße in Bytes&lt;br /&gt;
|-&lt;br /&gt;
| metadata || Option&amp;amp;lt;String&amp;amp;gt; || Zusatzmetadaten als roher JSON-Text&lt;br /&gt;
|-&lt;br /&gt;
| folder_id || Option&amp;amp;lt;i32&amp;amp;gt; || FK auf [[#AssetFolder]]&lt;br /&gt;
|-&lt;br /&gt;
| author_id || i32 || FK auf [[#User]]&lt;br /&gt;
|-&lt;br /&gt;
| created_at || Timestamp || Erstellungszeitpunkt&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp || letzte Änderung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== AssetKind ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Image&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Binary&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AssetFolder ===&lt;br /&gt;
&lt;br /&gt;
Entspricht der Tabelle &amp;lt;code&amp;gt;assetFolders&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || i32 || Primärschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| slug || String || URL-Slug&lt;br /&gt;
|-&lt;br /&gt;
| name || String || Anzeigename&lt;br /&gt;
|-&lt;br /&gt;
| parent_id || Option&amp;amp;lt;i32&amp;amp;gt; || übergeordneter Ordner (rekursiv)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== AssetData ===&lt;br /&gt;
&lt;br /&gt;
Binärdaten getrennt von den Metadaten gehalten (1:1 zu [[#Asset]]).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || i32 || FK/PK auf [[#Asset]]&lt;br /&gt;
|-&lt;br /&gt;
| data || Vec&amp;amp;lt;u8&amp;amp;gt; || Binärinhalt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Storage ==&lt;br /&gt;
&lt;br /&gt;
=== StorageTarget ===&lt;br /&gt;
&lt;br /&gt;
Sync-Status der konfigurierten Storage-Targets (Git, S3, ...), Tabelle &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || i32 || Primärschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| key || String || Target-Kennung (z. B. &amp;quot;git&amp;quot;, &amp;quot;s3&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| is_enabled || bool || aktiviert?&lt;br /&gt;
|-&lt;br /&gt;
| mode || [[#StorageMode]] || Sync-Richtung&lt;br /&gt;
|-&lt;br /&gt;
| config || String || provider-spezifische Konfiguration (als roher JSON-Text) (Repo-URL, Credentials-Ref, ...)&lt;br /&gt;
|-&lt;br /&gt;
| state || Option&amp;amp;lt;String&amp;amp;gt; || letzter bekannter Sync-Zustand (als roher JSON-Text)&lt;br /&gt;
|-&lt;br /&gt;
| sync_interval || Option&amp;amp;lt;String&amp;amp;gt; || Sync-Intervall&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== StorageMode ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Push&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Pull&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Sync&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Navigation ==&lt;br /&gt;
&lt;br /&gt;
=== NavigationTree ===&lt;br /&gt;
&lt;br /&gt;
Seitenbaum pro Locale, Tabelle &amp;lt;code&amp;gt;navigation&amp;lt;/code&amp;gt; (eine Zeile je Locale-Code).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || String || Locale-Code, z. B. &amp;quot;en&amp;quot; oder &amp;quot;de&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| config || Vec&amp;amp;lt;[[#NavigationItem]]&amp;amp;gt; || Navigationseinträge&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NavigationItem ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || String || Eintrags-ID&lt;br /&gt;
|-&lt;br /&gt;
| kind || [[#NavigationItemKind]] || Art des Eintrags&lt;br /&gt;
|-&lt;br /&gt;
| label || Option&amp;amp;lt;String&amp;amp;gt; || Anzeigetext&lt;br /&gt;
|-&lt;br /&gt;
| icon || Option&amp;amp;lt;String&amp;amp;gt; || Icon-Kennung&lt;br /&gt;
|-&lt;br /&gt;
| target_type || Option&amp;amp;lt;[[#NavigationTargetType]]&amp;amp;gt; || Ziel-Art&lt;br /&gt;
|-&lt;br /&gt;
| target || Option&amp;amp;lt;String&amp;amp;gt; || Ziel (Pfad/URL)&lt;br /&gt;
|-&lt;br /&gt;
| visibility_rules || Option&amp;amp;lt;Vec&amp;amp;lt;String&amp;amp;gt;&amp;amp;gt; || Sichtbarkeitsregeln&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NavigationItemKind ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Link&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Header&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Divider&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== NavigationTargetType ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Internal&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;External&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Locales ==&lt;br /&gt;
&lt;br /&gt;
=== Locale ===&lt;br /&gt;
&lt;br /&gt;
Entspricht der Tabelle &amp;lt;code&amp;gt;locales&amp;lt;/code&amp;gt; — installierte Sprachpakete.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| code || String || Sprachcode (Primärschlüssel)&lt;br /&gt;
|-&lt;br /&gt;
| strings || String || Übersetzungs-Strings (als roher JSON-Text)&lt;br /&gt;
|-&lt;br /&gt;
| is_rtl || bool || rechts-nach-links-Schrift?&lt;br /&gt;
|-&lt;br /&gt;
| name || String || englischer Name&lt;br /&gt;
|-&lt;br /&gt;
| native_name || String || einheimischer Name&lt;br /&gt;
|-&lt;br /&gt;
| created_at || Timestamp || Erstellungszeitpunkt&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp || letzte Änderung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== API Keys ==&lt;br /&gt;
&lt;br /&gt;
=== ApiKey ===&lt;br /&gt;
&lt;br /&gt;
Entspricht der Tabelle &amp;lt;code&amp;gt;apiKeys&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || i32 || Primärschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| name || String || Bezeichnung&lt;br /&gt;
|-&lt;br /&gt;
| key || String || Schlüsselwert&lt;br /&gt;
|-&lt;br /&gt;
| expiration || Timestamp || Ablaufzeitpunkt&lt;br /&gt;
|-&lt;br /&gt;
| is_revoked || bool || widerrufen?&lt;br /&gt;
|-&lt;br /&gt;
| created_at || Timestamp || Erstellungszeitpunkt&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp || letzte Änderung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
=== Setting ===&lt;br /&gt;
&lt;br /&gt;
Generischer Key/Value-Store für Sitekonfiguration, Tabelle &amp;lt;code&amp;gt;settings&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| key || String || Einstellungsschlüssel (Primärschlüssel)&lt;br /&gt;
|-&lt;br /&gt;
| value || String || Wert (als roher JSON-Text)&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp || letzte Änderung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Vollständiger Quelltext ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/// Einfacher Zeitstempel ohne externe Crates: Unix-Zeit in Sekunden seit&lt;br /&gt;
/// 1970-01-01 UTC.&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]&lt;br /&gt;
pub struct Timestamp(pub i64);&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct Page {&lt;br /&gt;
    pub id: i32,&lt;br /&gt;
    pub path: String,&lt;br /&gt;
    pub hash: String,&lt;br /&gt;
    pub title: String,&lt;br /&gt;
    pub description: String,&lt;br /&gt;
    pub is_private: bool,&lt;br /&gt;
    pub is_published: bool,&lt;br /&gt;
    pub private_ns: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub publish_start_date: Option&amp;lt;Timestamp&amp;gt;,&lt;br /&gt;
    pub publish_end_date: Option&amp;lt;Timestamp&amp;gt;,&lt;br /&gt;
    pub content: String,&lt;br /&gt;
    pub content_type: ContentType,&lt;br /&gt;
    pub render: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub toc: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub extra: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub editor_key: String,&lt;br /&gt;
    pub locale_code: String,&lt;br /&gt;
    pub creator_id: i32,&lt;br /&gt;
    pub author_id: i32,&lt;br /&gt;
    pub owner_id: i32,&lt;br /&gt;
    pub css: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub script_css: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub script_js: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub created_at: Timestamp,&lt;br /&gt;
    pub updated_at: Timestamp,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]&lt;br /&gt;
pub enum ContentType {&lt;br /&gt;
    Markdown,&lt;br /&gt;
    Html,&lt;br /&gt;
    Asciidoc,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct PageHistory {&lt;br /&gt;
    pub id: i32,&lt;br /&gt;
    pub page_id: i32,&lt;br /&gt;
    pub path: String,&lt;br /&gt;
    pub hash: String,&lt;br /&gt;
    pub title: String,&lt;br /&gt;
    pub description: String,&lt;br /&gt;
    pub is_private: bool,&lt;br /&gt;
    pub content: String,&lt;br /&gt;
    pub content_type: ContentType,&lt;br /&gt;
    pub render: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub toc: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub editor_key: String,&lt;br /&gt;
    pub locale_code: String,&lt;br /&gt;
    pub action: PageHistoryAction,&lt;br /&gt;
    pub version_date: Timestamp,&lt;br /&gt;
    pub author_id: i32,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]&lt;br /&gt;
pub enum PageHistoryAction {&lt;br /&gt;
    Initial,&lt;br /&gt;
    Edit,&lt;br /&gt;
    Delete,&lt;br /&gt;
    Move,&lt;br /&gt;
    Restore,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct PageLink {&lt;br /&gt;
    pub id: i32,&lt;br /&gt;
    pub path: String,&lt;br /&gt;
    pub locale_code: String,&lt;br /&gt;
    pub page_id: i32,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct Tag {&lt;br /&gt;
    pub id: i32,&lt;br /&gt;
    pub tag: String,&lt;br /&gt;
    pub title: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub created_at: Timestamp,&lt;br /&gt;
    pub updated_at: Timestamp,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct PageTag {&lt;br /&gt;
    pub page_id: i32,&lt;br /&gt;
    pub tag_id: i32,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct User {&lt;br /&gt;
    pub id: i32,&lt;br /&gt;
    pub email: String,&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub provider: String,&lt;br /&gt;
    pub provider_id: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub provider_key: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub password: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub tfa_is_active: bool,&lt;br /&gt;
    pub tfa_secret: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub job_title: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub location: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub picture_url: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub timezone: String,&lt;br /&gt;
    pub date_format: String,&lt;br /&gt;
    pub appearance: String,&lt;br /&gt;
    pub is_system: bool,&lt;br /&gt;
    pub is_active: bool,&lt;br /&gt;
    pub is_verified: bool,&lt;br /&gt;
    pub meta: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub last_login_at: Option&amp;lt;Timestamp&amp;gt;,&lt;br /&gt;
    pub created_at: Timestamp,&lt;br /&gt;
    pub updated_at: Timestamp,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]&lt;br /&gt;
pub enum UserKeyKind {&lt;br /&gt;
    Validation,&lt;br /&gt;
    ResetPwd,&lt;br /&gt;
    ChangeEmail,&lt;br /&gt;
    Api,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct UserKey {&lt;br /&gt;
    pub id: i32,&lt;br /&gt;
    pub kind: UserKeyKind,&lt;br /&gt;
    pub token: String,&lt;br /&gt;
    pub user_id: i32,&lt;br /&gt;
    pub expiration: Timestamp,&lt;br /&gt;
    pub created_at: Timestamp,&lt;br /&gt;
    pub updated_at: Timestamp,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct Group {&lt;br /&gt;
    pub id: i32,&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub is_system: bool,&lt;br /&gt;
    pub permissions: Vec&amp;lt;Permission&amp;gt;,&lt;br /&gt;
    pub page_rules: Vec&amp;lt;PageRule&amp;gt;,&lt;br /&gt;
    pub created_at: Timestamp,&lt;br /&gt;
    pub updated_at: Timestamp,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct UserGroup {&lt;br /&gt;
    pub user_id: i32,&lt;br /&gt;
    pub group_id: i32,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]&lt;br /&gt;
pub enum Permission {&lt;br /&gt;
    ManageSystem,&lt;br /&gt;
    ManageGroups,&lt;br /&gt;
    ManageNavigation,&lt;br /&gt;
    ManageTheme,&lt;br /&gt;
    ManageApi,&lt;br /&gt;
    ManageUsers,&lt;br /&gt;
    ManagePages,&lt;br /&gt;
    ReadPages,&lt;br /&gt;
    ReadAssets,&lt;br /&gt;
    ReadComments,&lt;br /&gt;
    WritePages,&lt;br /&gt;
    WriteAssets,&lt;br /&gt;
    WriteComments,&lt;br /&gt;
    ManageComments,&lt;br /&gt;
    DeletePages,&lt;br /&gt;
    DeleteAssets,&lt;br /&gt;
    DeleteComments,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct PageRule {&lt;br /&gt;
    pub id: String,&lt;br /&gt;
    pub deny: bool,&lt;br /&gt;
    pub roles: Vec&amp;lt;Permission&amp;gt;,&lt;br /&gt;
    pub r#match: PageRuleMatch,&lt;br /&gt;
    pub path: String,&lt;br /&gt;
    pub locales: Vec&amp;lt;String&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]&lt;br /&gt;
pub enum PageRuleMatch {&lt;br /&gt;
    Start,&lt;br /&gt;
    End,&lt;br /&gt;
    Regex,&lt;br /&gt;
    Exact,&lt;br /&gt;
    Tag,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct Comment {&lt;br /&gt;
    pub id: i32,&lt;br /&gt;
    pub content: String,&lt;br /&gt;
    pub render: String,&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub email: String,&lt;br /&gt;
    pub ip: String,&lt;br /&gt;
    pub page_id: i32,&lt;br /&gt;
    pub author_id: i32,&lt;br /&gt;
    pub created_at: Timestamp,&lt;br /&gt;
    pub updated_at: Timestamp,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct Asset {&lt;br /&gt;
    pub id: i32,&lt;br /&gt;
    pub filename: String,&lt;br /&gt;
    pub ext: String,&lt;br /&gt;
    pub kind: AssetKind,&lt;br /&gt;
    pub mime: String,&lt;br /&gt;
    pub file_size: i64,&lt;br /&gt;
    pub metadata: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub folder_id: Option&amp;lt;i32&amp;gt;,&lt;br /&gt;
    pub author_id: i32,&lt;br /&gt;
    pub created_at: Timestamp,&lt;br /&gt;
    pub updated_at: Timestamp,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]&lt;br /&gt;
pub enum AssetKind {&lt;br /&gt;
    Image,&lt;br /&gt;
    Binary,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct AssetFolder {&lt;br /&gt;
    pub id: i32,&lt;br /&gt;
    pub slug: String,&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub parent_id: Option&amp;lt;i32&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct AssetData {&lt;br /&gt;
    pub id: i32,&lt;br /&gt;
    pub data: Vec&amp;lt;u8&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct StorageTarget {&lt;br /&gt;
    pub id: i32,&lt;br /&gt;
    pub key: String,&lt;br /&gt;
    pub is_enabled: bool,&lt;br /&gt;
    pub mode: StorageMode,&lt;br /&gt;
    pub config: String,&lt;br /&gt;
    pub state: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub sync_interval: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]&lt;br /&gt;
pub enum StorageMode {&lt;br /&gt;
    Push,&lt;br /&gt;
    Pull,&lt;br /&gt;
    Sync,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct NavigationTree {&lt;br /&gt;
    pub id: String,&lt;br /&gt;
    pub config: Vec&amp;lt;NavigationItem&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct NavigationItem {&lt;br /&gt;
    pub id: String,&lt;br /&gt;
    pub kind: NavigationItemKind,&lt;br /&gt;
    pub label: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub icon: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub target_type: Option&amp;lt;NavigationTargetType&amp;gt;,&lt;br /&gt;
    pub target: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub visibility_rules: Option&amp;lt;Vec&amp;lt;String&amp;gt;&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]&lt;br /&gt;
pub enum NavigationItemKind {&lt;br /&gt;
    Link,&lt;br /&gt;
    Header,&lt;br /&gt;
    Divider,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]&lt;br /&gt;
pub enum NavigationTargetType {&lt;br /&gt;
    Internal,&lt;br /&gt;
    External,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct Locale {&lt;br /&gt;
    pub code: String,&lt;br /&gt;
    pub strings: String,&lt;br /&gt;
    pub is_rtl: bool,&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub native_name: String,&lt;br /&gt;
    pub created_at: Timestamp,&lt;br /&gt;
    pub updated_at: Timestamp,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct ApiKey {&lt;br /&gt;
    pub id: i32,&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub key: String,&lt;br /&gt;
    pub expiration: Timestamp,&lt;br /&gt;
    pub is_revoked: bool,&lt;br /&gt;
    pub created_at: Timestamp,&lt;br /&gt;
    pub updated_at: Timestamp,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct Setting {&lt;br /&gt;
    pub key: String,&lt;br /&gt;
    pub value: String,&lt;br /&gt;
    pub updated_at: Timestamp,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Rust]]&lt;br /&gt;
[[Category:Wiki.js]]&lt;br /&gt;
[[Category:Datenmodell]]&lt;br /&gt;
==Hinweis==&lt;br /&gt;
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Speicherung&amp;diff=37</id>
		<title>Speicherung</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Speicherung&amp;diff=37"/>
		<updated>2026-08-12T14:38:17Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;br /&gt;
&lt;br /&gt;
== Wissensspeicherung ==&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel beschreibt zunächst das allgemeine Konzept der Wissensspeicherung und geht anschließend auf die konkrete technische Umsetzung in Rust ein.&lt;br /&gt;
&lt;br /&gt;
== Allgemeines Konzept der Wissensspeicherung ==&lt;br /&gt;
&lt;br /&gt;
Bevor man eine konkrete Technik wählt, lohnt sich der Blick auf das allgemeine Konzept: Wie wird aus rohen Daten überhaupt &amp;quot;Wissen&amp;quot;, und wie wird dieses Wissen in einem System organisiert und gespeichert?&lt;br /&gt;
&lt;br /&gt;
=== Von Daten zu Wissen: die DIKW-Hierarchie ===&lt;br /&gt;
&lt;br /&gt;
Ein verbreitetes Modell zur Einordnung ist die &#039;&#039;&#039;DIKW-Pyramide&#039;&#039;&#039; (Data – Information – Knowledge – Wisdom):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Stufe !! Beschreibung !! Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Daten&#039;&#039;&#039; (Data) || rohe, unverarbeitete Symbole/Werte ohne Kontext || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Information&#039;&#039;&#039; || Daten mit Kontext/Bedeutung || &amp;quot;Die Temperatur beträgt 23 °C&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Wissen&#039;&#039;&#039; (Knowledge) || Information verknüpft mit Erfahrung/Regeln, nutzbar für Entscheidungen || &amp;quot;Bei 23 °C sollte man nicht heizen&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Weisheit&#039;&#039;&#039; (Wisdom) || begründete Anwendung von Wissen im Kontext || &amp;quot;Wann sich Heizen trotzdem lohnt&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Wissensspeicher (Knowledge Store) zielt darauf ab, mindestens die Ebene &amp;quot;Wissen&amp;quot; abzubilden – also nicht nur Rohwerte, sondern auch deren Bedeutung, Kontext und Beziehungen untereinander.&lt;br /&gt;
&lt;br /&gt;
=== Explizites vs. implizites Wissen ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Explizites Wissen&#039;&#039;&#039; – lässt sich klar formulieren, dokumentieren und speichern (Texte, Regeln, Datenbankeinträge, Diagramme).&lt;br /&gt;
* &#039;&#039;&#039;Implizites/Tacit Wissen&#039;&#039;&#039; – erfahrungsbasiertes Wissen, das schwer zu formalisieren ist (Intuition, Handlungswissen).&lt;br /&gt;
&lt;br /&gt;
Wissenssysteme können nur explizites Wissen direkt speichern; implizites Wissen muss zuerst &amp;quot;externalisiert&amp;quot; werden (z. B. durch Dokumentation, Interviews, Modellierung), bevor es in ein System aufgenommen werden kann. Dieser Prozess wird oft mit dem &#039;&#039;&#039;SECI-Modell&#039;&#039;&#039; (Sozialisierung, Externalisierung, Kombination, Internalisierung) beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Formen der Wissensrepräsentation ===&lt;br /&gt;
&lt;br /&gt;
Damit Wissen maschinell gespeichert und verarbeitet werden kann, muss es in eine Repräsentationsform gebracht werden:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Repräsentationsform !! Prinzip !! Typische Systeme&lt;br /&gt;
|-&lt;br /&gt;
| Unstrukturierter Text || freier Text, Volltextsuche || Wikis, Dokumentenablagen, CMS&lt;br /&gt;
|-&lt;br /&gt;
| Strukturierte Datensätze || feste Felder/Schema || relationale Datenbanken, Tabellen&lt;br /&gt;
|-&lt;br /&gt;
| Schlüssel-Wert-Paare || einfache Zuordnung Key → Wert || Key-Value-Stores, Caches&lt;br /&gt;
|-&lt;br /&gt;
| Graphen/Netze || Entitäten + Beziehungen || Knowledge Graphs, Ontologien (RDF, OWL)&lt;br /&gt;
|-&lt;br /&gt;
| Regeln/Logik || Wenn-Dann-Regeln, Fakten || Expertensysteme, regelbasierte Systeme&lt;br /&gt;
|-&lt;br /&gt;
| Vektoren/Embeddings || semantische Nähe im Vektorraum || Vektordatenbanken, KI-/RAG-Systeme&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In der Praxis kombinieren viele Systeme mehrere Formen, z. B. ein Wiki (Text) mit Kategorien und Verlinkungen (graphartige Struktur) und einer Volltextsuche (Index).&lt;br /&gt;
&lt;br /&gt;
=== Aufbau eines Wissenssystems (Knowledge System) ===&lt;br /&gt;
&lt;br /&gt;
Ein typisches Wissenssystem durchläuft folgenden Lebenszyklus:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Erfassen&#039;&#039;&#039; (Capture) – Wissen aus Quellen (Personen, Dokumenten, Messwerten) aufnehmen&lt;br /&gt;
# &#039;&#039;&#039;Strukturieren&#039;&#039;&#039; (Organize) – Kategorisieren, Verschlagworten, in ein Schema/Modell bringen&lt;br /&gt;
# &#039;&#039;&#039;Speichern&#039;&#039;&#039; (Store) – dauerhafte Ablage in Datei, Datenbank oder Graph&lt;br /&gt;
# &#039;&#039;&#039;Abrufen&#039;&#039;&#039; (Retrieve) – Suche, Abfragen, Navigation, Vernetzung mit anderem Wissen&lt;br /&gt;
# &#039;&#039;&#039;Pflegen/Aktualisieren&#039;&#039;&#039; (Maintain) – Widersprüche auflösen, veraltetes Wissen korrigieren oder entfernen&lt;br /&gt;
# &#039;&#039;&#039;Weitergeben&#039;&#039;&#039; (Share) – Zugriff für andere Personen/Systeme ermöglichen&lt;br /&gt;
&lt;br /&gt;
Klassische Beispiele für Wissenssysteme sind Wikis (wie dieses hier), Knowledge Bases im Support-Kontext, Ontologien/Knowledge Graphs (z. B. Wikidata), Dokumentenmanagementsysteme sowie – im technischen Umfeld – Programme, die Wissen in Datenstrukturen abbilden und mittels der im Folgenden beschriebenen Techniken persistieren.&lt;br /&gt;
&lt;br /&gt;
=== Bezug zur technischen Umsetzung ===&lt;br /&gt;
&lt;br /&gt;
Die im nächsten Abschnitt beschriebenen Rust-Techniken (Structs, serde, Dateien, Key-Value-Stores, Datenbanken) sind die &#039;&#039;&#039;technische Speicherschicht&#039;&#039;&#039; für die oben genannte Stufe &amp;quot;Speichern&amp;quot;. Welche Repräsentationsform (Tabelle, Key-Value, Graph, Text) gewählt wird, bestimmt dabei maßgeblich, welche Rust-Bibliothek/Datenbank sinnvoll ist:&lt;br /&gt;
&lt;br /&gt;
* Strukturierte Datensätze mit Beziehungen → relationale Datenbank (rusqlite, sqlx, diesel)&lt;br /&gt;
* Einfache Schlüssel-Wert-Zuordnungen → Key-Value-Store (sled, redb)&lt;br /&gt;
* Einzelne Dokumente/Konfiguration → Datei + serde (JSON/TOML/YAML)&lt;br /&gt;
* Vernetztes Wissen (Graph) → Graphdatenbank-Anbindung oder eigene Graphstruktur mit Adjazenzlisten&lt;br /&gt;
&lt;br /&gt;
== Wissensspeicherung in Rust ==&lt;br /&gt;
&lt;br /&gt;
Dieser Abschnitt beschreibt die gängigen Methoden, um Daten (&amp;quot;Wissen&amp;quot;) in Rust-Programmen dauerhaft zu speichern und wieder zu laden – von einfachen Dateien bis zu vollwertigen Datenbanken.&lt;br /&gt;
&lt;br /&gt;
=== Überblick ===&lt;br /&gt;
&lt;br /&gt;
In Rust gibt es keine &amp;quot;eingebaute&amp;quot; Persistenzschicht wie in manchen anderen Sprachen. Stattdessen kombiniert man:&lt;br /&gt;
&lt;br /&gt;
# eine &#039;&#039;&#039;Datenstruktur&#039;&#039;&#039; im Speicher (&amp;lt;code&amp;gt;struct&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;enum&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;HashMap&amp;lt;/code&amp;gt;, …)&lt;br /&gt;
# eine &#039;&#039;&#039;Serialisierungsbibliothek&#039;&#039;&#039;, die diese Struktur in ein Speicherformat umwandelt (meist [https://serde.rs serde])&lt;br /&gt;
# ein &#039;&#039;&#039;Speicherziel&#039;&#039;&#039;: Datei, Key-Value-Store oder relationale/eingebettete Datenbank&lt;br /&gt;
&lt;br /&gt;
Die Wahl hängt davon ab, wie groß die Datenmenge ist, ob nebenläufiger Zugriff nötig ist und ob Abfragen (Queries) oder nur einfaches Laden/Speichern gebraucht werden.&lt;br /&gt;
&lt;br /&gt;
=== 1. Daten im Arbeitsspeicher modellieren ===&lt;br /&gt;
&lt;br /&gt;
Der erste Schritt ist immer, das &amp;quot;Wissen&amp;quot; als Rust-Typen zu modellieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Notiz {&lt;br /&gt;
    id: u32,&lt;br /&gt;
    titel: String,&lt;br /&gt;
    inhalt: String,&lt;br /&gt;
    tags: Vec&amp;lt;String&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Solche Structs sind die Grundlage für alle folgenden Speichermethoden.&lt;br /&gt;
&lt;br /&gt;
=== 2. Serialisierung mit serde ===&lt;br /&gt;
&lt;br /&gt;
Die Standardlösung in Rust ist die Crate &#039;&#039;&#039;serde&#039;&#039;&#039; (&amp;quot;SERialize/DEserialize&amp;quot;) zusammen mit einem Format wie &amp;lt;code&amp;gt;serde_json&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;serde_yaml&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;toml&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;bincode&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Cargo.toml:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[dependencies]&lt;br /&gt;
serde = { version = &amp;quot;1&amp;quot;, features = [&amp;quot;derive&amp;quot;] }&lt;br /&gt;
serde_json = &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Struct annotieren:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(serde::Serialize, serde::Deserialize)]&lt;br /&gt;
struct Notiz {&lt;br /&gt;
    id: u32,&lt;br /&gt;
    titel: String,&lt;br /&gt;
    inhalt: String,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Speichern (Serialisieren) in eine Datei:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use std::fs;&lt;br /&gt;
&lt;br /&gt;
fn speichern(notiz: &amp;amp;Notiz) -&amp;gt; std::io::Result&amp;lt;()&amp;gt; {&lt;br /&gt;
    let json = serde_json::to_string_pretty(notiz).unwrap();&lt;br /&gt;
    fs::write(&amp;quot;notiz.json&amp;quot;, json)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Laden (Deserialisieren):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fn laden() -&amp;gt; std::io::Result&amp;lt;Notiz&amp;gt; {&lt;br /&gt;
    let text = fs::read_to_string(&amp;quot;notiz.json&amp;quot;)?;&lt;br /&gt;
    let notiz: Notiz = serde_json::from_str(&amp;amp;text).unwrap();&lt;br /&gt;
    Ok(notiz)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Gängige Formate mit serde ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Format !! Crate !! Vorteil !! Einsatz&lt;br /&gt;
|-&lt;br /&gt;
| JSON || &amp;lt;code&amp;gt;serde_json&amp;lt;/code&amp;gt; || menschenlesbar, weit verbreitet || Konfiguration, APIs, Austauschformate&lt;br /&gt;
|-&lt;br /&gt;
| TOML || &amp;lt;code&amp;gt;toml&amp;lt;/code&amp;gt; || sehr gut lesbar, für Configs gedacht || Konfigurationsdateien&lt;br /&gt;
|-&lt;br /&gt;
| YAML || &amp;lt;code&amp;gt;serde_yaml&amp;lt;/code&amp;gt; || kompakt, lesbar || Konfiguration&lt;br /&gt;
|-&lt;br /&gt;
| Bincode || &amp;lt;code&amp;gt;bincode&amp;lt;/code&amp;gt; || binär, sehr schnell, kompakt || interne Persistenz, Caches&lt;br /&gt;
|-&lt;br /&gt;
| MessagePack || &amp;lt;code&amp;gt;rmp-serde&amp;lt;/code&amp;gt; || binär, kompakt, sprachübergreifend || Netzwerk, Interop&lt;br /&gt;
|-&lt;br /&gt;
| CSV || &amp;lt;code&amp;gt;csv&amp;lt;/code&amp;gt; (+ serde) || tabellarisch || Tabellen, Datenexport&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3. Reine Datei-I/O ohne serde ===&lt;br /&gt;
&lt;br /&gt;
Für sehr einfache Fälle genügt &amp;lt;code&amp;gt;std::fs&amp;lt;/code&amp;gt; direkt, z. B. um Text- oder Binärdaten zu schreiben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use std::fs::File;&lt;br /&gt;
use std::io::Write;&lt;br /&gt;
&lt;br /&gt;
fn schreiben() -&amp;gt; std::io::Result&amp;lt;()&amp;gt; {&lt;br /&gt;
    let mut datei = File::create(&amp;quot;wissen.txt&amp;quot;)?;&lt;br /&gt;
    datei.write_all(b&amp;quot;Wichtige Information&amp;quot;)?;&lt;br /&gt;
    Ok(())&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für strukturierte Binärdaten kann &amp;lt;code&amp;gt;std::io::Read&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Write&amp;lt;/code&amp;gt; zusammen mit Byte-Konvertierungen (&amp;lt;code&amp;gt;to_le_bytes&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;from_le_bytes&amp;lt;/code&amp;gt;) genutzt werden – das ist aber meist unnötig, da &amp;lt;code&amp;gt;bincode&amp;lt;/code&amp;gt; diese Arbeit übernimmt.&lt;br /&gt;
&lt;br /&gt;
=== 4. Eingebettete Key-Value-Datenbanken ===&lt;br /&gt;
&lt;br /&gt;
Wenn Daten häufig aktualisiert werden und nicht die ganze Datei neu geschrieben werden soll, eignen sich eingebettete Datenbanken:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;sled&#039;&#039;&#039; – reine Rust-Implementierung, transaktional, sehr einfache API&lt;br /&gt;
* &#039;&#039;&#039;rocksdb&#039;&#039;&#039; (Bindings zu Facebooks RocksDB) – sehr performant, C++-Unterbau&lt;br /&gt;
* &#039;&#039;&#039;redb&#039;&#039;&#039; – reine Rust-Implementierung, ACID, embedded&lt;br /&gt;
&lt;br /&gt;
Beispiel mit &#039;&#039;&#039;sled&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let db = sled::open(&amp;quot;meine_datenbank&amp;quot;)?;&lt;br /&gt;
db.insert(b&amp;quot;schluessel&amp;quot;, b&amp;quot;wert&amp;quot;)?;&lt;br /&gt;
let wert = db.get(b&amp;quot;schluessel&amp;quot;)?;&lt;br /&gt;
db.flush()?;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kombiniert man &amp;lt;code&amp;gt;sled&amp;lt;/code&amp;gt; mit &amp;lt;code&amp;gt;serde&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;bincode&amp;lt;/code&amp;gt;, lassen sich ganze Structs unter einem Schlüssel speichern:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let bytes = bincode::serialize(&amp;amp;notiz).unwrap();&lt;br /&gt;
db.insert(notiz.id.to_be_bytes(), bytes)?;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. Relationale Datenbanken ===&lt;br /&gt;
&lt;br /&gt;
Für komplexes &amp;quot;Wissen&amp;quot; mit Beziehungen, Abfragen und mehreren Nutzern bieten sich klassische SQL-Datenbanken an.&lt;br /&gt;
&lt;br /&gt;
==== SQLite (lokal, dateibasiert) ====&lt;br /&gt;
&lt;br /&gt;
Crate: &amp;lt;code&amp;gt;rusqlite&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let conn = rusqlite::Connection::open(&amp;quot;wissen.db&amp;quot;)?;&lt;br /&gt;
conn.execute(&lt;br /&gt;
    &amp;quot;CREATE TABLE IF NOT EXISTS notiz (&lt;br /&gt;
        id INTEGER PRIMARY KEY,&lt;br /&gt;
        titel TEXT NOT NULL,&lt;br /&gt;
        inhalt TEXT NOT NULL&lt;br /&gt;
    )&amp;quot;,&lt;br /&gt;
    [],&lt;br /&gt;
)?;&lt;br /&gt;
conn.execute(&lt;br /&gt;
    &amp;quot;INSERT INTO notiz (titel, inhalt) VALUES (?1, ?2)&amp;quot;,&lt;br /&gt;
    rusqlite::params![&amp;quot;Titel&amp;quot;, &amp;quot;Inhalt&amp;quot;],&lt;br /&gt;
)?;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== sqlx (async, mehrere Datenbanken) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sqlx&amp;lt;/code&amp;gt; unterstützt PostgreSQL, MySQL und SQLite mit asynchronem Zugriff und prüft SQL-Abfragen teils schon zur Kompilierzeit:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let pool = sqlx::SqlitePool::connect(&amp;quot;sqlite://wissen.db&amp;quot;).await?;&lt;br /&gt;
sqlx::query(&amp;quot;INSERT INTO notiz (titel, inhalt) VALUES (?, ?)&amp;quot;)&lt;br /&gt;
    .bind(&amp;quot;Titel&amp;quot;)&lt;br /&gt;
    .bind(&amp;quot;Inhalt&amp;quot;)&lt;br /&gt;
    .execute(&amp;amp;pool)&lt;br /&gt;
    .await?;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== diesel (ORM) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;diesel&amp;lt;/code&amp;gt; ist ein vollwertiges, synchrones ORM mit Migrationstooling und typsicheren Query-Buildern – geeignet für größere Anwendungen mit stabilem Schema.&lt;br /&gt;
&lt;br /&gt;
=== 6. Auswahlkriterien ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Anforderung !! Empfehlung&lt;br /&gt;
|-&lt;br /&gt;
| Einfache Konfiguration || TOML-Datei + serde&lt;br /&gt;
|-&lt;br /&gt;
| Ein einzelnes Objekt/Dokument || JSON-Datei + serde_json&lt;br /&gt;
|-&lt;br /&gt;
| Viele kleine Schreibzugriffe, kein SQL nötig || sled / redb (Key-Value)&lt;br /&gt;
|-&lt;br /&gt;
| Abfragen, Beziehungen, mehrere Tabellen || SQLite via rusqlite/sqlx, ggf. diesel&lt;br /&gt;
|-&lt;br /&gt;
| Netzwerk-Datenbank, mehrere Clients || PostgreSQL/MySQL via sqlx oder diesel&lt;br /&gt;
|-&lt;br /&gt;
| Maximale Geschwindigkeit, keine Lesbarkeit nötig || bincode + Datei oder Key-Value-Store&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 7. Fehlerbehandlung ===&lt;br /&gt;
&lt;br /&gt;
Alle I/O- und Datenbankoperationen in Rust liefern &amp;lt;code&amp;gt;Result&amp;lt;/code&amp;gt; zurück. Für Anwendungen empfiehlt sich eine zentrale Fehlerbehandlung, z. B. mit den Crates &#039;&#039;&#039;thiserror&#039;&#039;&#039; (für eigene Fehlertypen) oder &#039;&#039;&#039;anyhow&#039;&#039;&#039; (für einfache Fehlerweitergabe):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fn laden() -&amp;gt; anyhow::Result&amp;lt;Notiz&amp;gt; {&lt;br /&gt;
    let text = std::fs::read_to_string(&amp;quot;notiz.json&amp;quot;)?;&lt;br /&gt;
    let notiz = serde_json::from_str(&amp;amp;text)?;&lt;br /&gt;
    Ok(notiz)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8. Zusammenfassung ===&lt;br /&gt;
&lt;br /&gt;
* Datenstrukturen mit &amp;lt;code&amp;gt;struct&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;enum&amp;lt;/code&amp;gt; modellieren.&lt;br /&gt;
* Mit &#039;&#039;&#039;serde&#039;&#039;&#039; in ein passendes Format serialisieren (JSON/TOML/YAML für Lesbarkeit, bincode für Performance).&lt;br /&gt;
* Für einfache Fälle reichen Dateien (&amp;lt;code&amp;gt;std::fs&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Für häufige Änderungen: eingebettete Key-Value-Stores wie &#039;&#039;&#039;sled&#039;&#039;&#039; oder &#039;&#039;&#039;redb&#039;&#039;&#039;.&lt;br /&gt;
* Für komplexe Abfragen und Beziehungen: relationale Datenbanken über &#039;&#039;&#039;rusqlite&#039;&#039;&#039;, &#039;&#039;&#039;sqlx&#039;&#039;&#039; oder &#039;&#039;&#039;diesel&#039;&#039;&#039;.&lt;br /&gt;
* Fehlerbehandlung zentral mit &#039;&#039;&#039;anyhow&#039;&#039;&#039;/&#039;&#039;&#039;thiserror&#039;&#039;&#039; organisieren.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Rust]]&lt;br /&gt;
[[Kategorie:Datenspeicherung]]&lt;br /&gt;
==Hinweis==&lt;br /&gt;
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Wissensmodell&amp;diff=36</id>
		<title>Wissensmodell</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Wissensmodell&amp;diff=36"/>
		<updated>2026-08-12T14:37:06Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;br /&gt;
&lt;br /&gt;
Ein &#039;&#039;&#039;Wissensmodell&#039;&#039;&#039; (engl. &#039;&#039;knowledge model&#039;&#039;) ist eine strukturierte, formale Repräsentation von Wissen über einen bestimmten Bereich (Domäne). Es ermöglicht einem System, Wissen zu speichern, zu verknüpfen, abzufragen und daraus neue Schlüsse zu ziehen. Dieser Artikel beschreibt zunächst das Konzept allgemein und danach, wie man ein solches Modell konkret in der Programmiersprache &#039;&#039;&#039;Rust&#039;&#039;&#039; umsetzen kann.&lt;br /&gt;
&lt;br /&gt;
== Abgrenzung zum Datenmodell ==&lt;br /&gt;
&lt;br /&gt;
Ein Datenmodell beschreibt nur die &#039;&#039;&#039;Struktur&#039;&#039;&#039; von Daten (Tabellen, Felder, Typen). Ein Wissensmodell beschreibt zusätzlich die &#039;&#039;&#039;Bedeutung&#039;&#039;&#039; (Semantik) und die &#039;&#039;&#039;Beziehungen&#039;&#039;&#039; zwischen den Dingen – oft so, dass daraus automatisch neues Wissen abgeleitet werden kann (Inferenz).&lt;br /&gt;
&lt;br /&gt;
== Kernbausteine ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Entitäten (Konzepte)&#039;&#039;&#039; – die „Dinge“, über die Wissen existiert (z. B. Person, Ort, Ereignis)&lt;br /&gt;
* &#039;&#039;&#039;Attribute&#039;&#039;&#039; – Eigenschaften dieser Entitäten (z. B. Name, Datum, Farbe)&lt;br /&gt;
* &#039;&#039;&#039;Relationen&#039;&#039;&#039; – Beziehungen zwischen Entitäten (z. B. „ist Teil von“, „arbeitet bei“, „verursacht“)&lt;br /&gt;
* &#039;&#039;&#039;Axiome / Regeln&#039;&#039;&#039; – logische Aussagen, die festlegen, was aus vorhandenem Wissen gefolgert werden darf&lt;br /&gt;
* &#039;&#039;&#039;Taxonomie/Hierarchie&#039;&#039;&#039; – Ober-/Unterbegriffe, Klassifikation (Vererbung von Eigenschaften)&lt;br /&gt;
&lt;br /&gt;
== Typische Formen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Form !! Beschreibung !! Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| Ontologie || formale, oft logikbasierte Beschreibung eines Bereichs mit Klassen, Relationen, Regeln || OWL, RDF-Schema&lt;br /&gt;
|-&lt;br /&gt;
| Knowledge Graph || Netzwerk aus Knoten (Entitäten) und Kanten (Relationen) || Google Knowledge Graph, Wikidata&lt;br /&gt;
|-&lt;br /&gt;
| Semantisches Netz || ähnlich Knowledge Graph, meist einfacher, ohne strenge Logik || Begriffsnetze in NLP&lt;br /&gt;
|-&lt;br /&gt;
| Frame-Modell || Wissen in „Rahmen“ mit vordefinierten Slots/Attributen || KI-Systeme der 1980er&lt;br /&gt;
|-&lt;br /&gt;
| Regelbasiertes System || Wissen als Wenn-Dann-Regeln || Expertensysteme&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umsetzung in Rust ==&lt;br /&gt;
&lt;br /&gt;
Rust eignet sich wegen seines starken, statischen Typsystems, seiner Ownership-Regeln und seiner Performance besonders gut, um Wissensmodelle sowohl &#039;&#039;&#039;typsicher&#039;&#039;&#039; als auch &#039;&#039;&#039;effizient&#039;&#039;&#039; abzubilden. Es gibt grundsätzlich drei gängige Ansätze:&lt;br /&gt;
&lt;br /&gt;
=== 1. Eigene Struct/Enum-Modellierung ===&lt;br /&gt;
&lt;br /&gt;
Entitäten, Attribute und Relationen werden direkt als Rust-Typen abgebildet. Das ist einfach, sehr performant und vom Compiler geprüft, aber weniger flexibel bei sich ändernden Schemata.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use std::collections::HashMap;&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
struct Entity {&lt;br /&gt;
    id: u64,&lt;br /&gt;
    name: String,&lt;br /&gt;
    attributes: HashMap&amp;lt;String, String&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
enum Relation {&lt;br /&gt;
    IsA(u64, u64),        // Entität A ist ein B&lt;br /&gt;
    PartOf(u64, u64),     // Entität A ist Teil von B&lt;br /&gt;
    WorksAt(u64, u64),    // Entität A arbeitet bei B&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct KnowledgeModel {&lt;br /&gt;
    entities: HashMap&amp;lt;u64, Entity&amp;gt;,&lt;br /&gt;
    relations: Vec&amp;lt;Relation&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Graphbasiert mit einer Crate wie &amp;lt;code&amp;gt;petgraph&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Wissen wird als Graph aus Knoten (Entitäten) und Kanten (Relationen) gespeichert. Das passt sehr gut zum Konzept des Knowledge Graph und erlaubt Graphalgorithmen (kürzeste Wege, Traversierung, Zentralitätsmaße) direkt „out of the box“.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use petgraph::graph::DiGraph;&lt;br /&gt;
&lt;br /&gt;
let mut graph = DiGraph::&amp;lt;&amp;amp;str, &amp;amp;str&amp;gt;::new();&lt;br /&gt;
&lt;br /&gt;
let person = graph.add_node(&amp;quot;Person: Alice&amp;quot;);&lt;br /&gt;
let company = graph.add_node(&amp;quot;Firma: Acme&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
graph.add_edge(person, company, &amp;quot;arbeitet bei&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Semantisch/RDF-basiert mit einer Crate wie &amp;lt;code&amp;gt;oxigraph&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Für echte Ontologien nach W3C-Standards (RDF, RDFS, OWL) bietet sich &amp;lt;code&amp;gt;oxigraph&amp;lt;/code&amp;gt; an – eine in Rust geschriebene Graphdatenbank mit SPARQL-Unterstützung. Damit lassen sich Wissensmodelle abfragen, die auch mit Tools aus dem Semantic-Web-Umfeld kompatibel sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use oxigraph::store::Store;&lt;br /&gt;
use oxigraph::model::*;&lt;br /&gt;
&lt;br /&gt;
let store = Store::new().unwrap();&lt;br /&gt;
&lt;br /&gt;
let subject = NamedNode::new(&amp;quot;http://example.org/alice&amp;quot;).unwrap();&lt;br /&gt;
let predicate = NamedNode::new(&amp;quot;http://example.org/worksAt&amp;quot;).unwrap();&lt;br /&gt;
let object = NamedNode::new(&amp;quot;http://example.org/acme&amp;quot;).unwrap();&lt;br /&gt;
&lt;br /&gt;
store.insert(&amp;amp;Quad::new(subject, predicate, object, GraphName::DefaultGraph)).unwrap();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vergleich der Ansätze ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ansatz !! Typsicherheit !! Flexibilität !! Eignung&lt;br /&gt;
|-&lt;br /&gt;
| Struct/Enum || sehr hoch || niedrig || feste, bekannte Domänenmodelle&lt;br /&gt;
|-&lt;br /&gt;
| petgraph || hoch || mittel || Knowledge Graphs, Netzwerkanalysen&lt;br /&gt;
|-&lt;br /&gt;
| oxigraph (RDF/SPARQL) || mittel || sehr hoch || Ontologien, Interoperabilität mit Semantic-Web-Standards&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Einsatzzwecke ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Wissensrepräsentation&#039;&#039;&#039; in KI-Systemen (Expertensysteme, Reasoning-Engines)&lt;br /&gt;
* &#039;&#039;&#039;Semantische Suche&#039;&#039;&#039; – Bedeutung statt reiner Stichwortsuche&lt;br /&gt;
* &#039;&#039;&#039;Datenintegration&#039;&#039;&#039; – heterogene Quellen über gemeinsame Begriffe verbinden&lt;br /&gt;
* &#039;&#039;&#039;Inferenz&#039;&#039;&#039; – aus explizitem Wissen implizites Wissen automatisch ableiten&lt;br /&gt;
* Grundlage für &#039;&#039;&#039;RAG-Systeme&#039;&#039;&#039; (Retrieval-Augmented Generation) und Chatbots, die auf strukturiertem Wissen statt nur auf Freitext basieren&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Ein Wissensmodell ist im Grunde die formale „Landkarte“ eines Wissensgebiets: Was gibt es (Entitäten), wie hängt es zusammen (Relationen), und welche Regeln gelten (Logik) – sodass ein System damit nicht nur Daten ablegen, sondern tatsächlich schlussfolgern kann. In Rust lässt sich das je nach Anforderung entweder leichtgewichtig mit eigenen Structs/Enums, graphbasiert mit &amp;lt;code&amp;gt;petgraph&amp;lt;/code&amp;gt; oder standardkonform mit RDF/SPARQL über &amp;lt;code&amp;gt;oxigraph&amp;lt;/code&amp;gt; umsetzen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Wissensmodellierung]]&lt;br /&gt;
[[Kategorie:Rust]]&lt;br /&gt;
==Hinweis==&lt;br /&gt;
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Speicherung&amp;diff=35</id>
		<title>Speicherung</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Speicherung&amp;diff=35"/>
		<updated>2026-08-12T14:32:58Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: Die Seite wurde neu angelegt: „== Wissensspeicherung ==  Dieser Artikel beschreibt zunächst das allgemeine Konzept der Wissensspeicherung und geht anschließend auf die konkrete technische Umsetzung in Rust ein.  == Allgemeines Konzept der Wissensspeicherung ==  Bevor man eine konkrete Technik wählt, lohnt sich der Blick auf das allgemeine Konzept: Wie wird aus rohen Daten überhaupt &amp;quot;Wissen&amp;quot;, und wie wird dieses Wissen in einem System organisiert und gespeichert?  === Von Daten zu W…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Wissensspeicherung ==&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel beschreibt zunächst das allgemeine Konzept der Wissensspeicherung und geht anschließend auf die konkrete technische Umsetzung in Rust ein.&lt;br /&gt;
&lt;br /&gt;
== Allgemeines Konzept der Wissensspeicherung ==&lt;br /&gt;
&lt;br /&gt;
Bevor man eine konkrete Technik wählt, lohnt sich der Blick auf das allgemeine Konzept: Wie wird aus rohen Daten überhaupt &amp;quot;Wissen&amp;quot;, und wie wird dieses Wissen in einem System organisiert und gespeichert?&lt;br /&gt;
&lt;br /&gt;
=== Von Daten zu Wissen: die DIKW-Hierarchie ===&lt;br /&gt;
&lt;br /&gt;
Ein verbreitetes Modell zur Einordnung ist die &#039;&#039;&#039;DIKW-Pyramide&#039;&#039;&#039; (Data – Information – Knowledge – Wisdom):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Stufe !! Beschreibung !! Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Daten&#039;&#039;&#039; (Data) || rohe, unverarbeitete Symbole/Werte ohne Kontext || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Information&#039;&#039;&#039; || Daten mit Kontext/Bedeutung || &amp;quot;Die Temperatur beträgt 23 °C&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Wissen&#039;&#039;&#039; (Knowledge) || Information verknüpft mit Erfahrung/Regeln, nutzbar für Entscheidungen || &amp;quot;Bei 23 °C sollte man nicht heizen&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Weisheit&#039;&#039;&#039; (Wisdom) || begründete Anwendung von Wissen im Kontext || &amp;quot;Wann sich Heizen trotzdem lohnt&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ein Wissensspeicher (Knowledge Store) zielt darauf ab, mindestens die Ebene &amp;quot;Wissen&amp;quot; abzubilden – also nicht nur Rohwerte, sondern auch deren Bedeutung, Kontext und Beziehungen untereinander.&lt;br /&gt;
&lt;br /&gt;
=== Explizites vs. implizites Wissen ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Explizites Wissen&#039;&#039;&#039; – lässt sich klar formulieren, dokumentieren und speichern (Texte, Regeln, Datenbankeinträge, Diagramme).&lt;br /&gt;
* &#039;&#039;&#039;Implizites/Tacit Wissen&#039;&#039;&#039; – erfahrungsbasiertes Wissen, das schwer zu formalisieren ist (Intuition, Handlungswissen).&lt;br /&gt;
&lt;br /&gt;
Wissenssysteme können nur explizites Wissen direkt speichern; implizites Wissen muss zuerst &amp;quot;externalisiert&amp;quot; werden (z. B. durch Dokumentation, Interviews, Modellierung), bevor es in ein System aufgenommen werden kann. Dieser Prozess wird oft mit dem &#039;&#039;&#039;SECI-Modell&#039;&#039;&#039; (Sozialisierung, Externalisierung, Kombination, Internalisierung) beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Formen der Wissensrepräsentation ===&lt;br /&gt;
&lt;br /&gt;
Damit Wissen maschinell gespeichert und verarbeitet werden kann, muss es in eine Repräsentationsform gebracht werden:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Repräsentationsform !! Prinzip !! Typische Systeme&lt;br /&gt;
|-&lt;br /&gt;
| Unstrukturierter Text || freier Text, Volltextsuche || Wikis, Dokumentenablagen, CMS&lt;br /&gt;
|-&lt;br /&gt;
| Strukturierte Datensätze || feste Felder/Schema || relationale Datenbanken, Tabellen&lt;br /&gt;
|-&lt;br /&gt;
| Schlüssel-Wert-Paare || einfache Zuordnung Key → Wert || Key-Value-Stores, Caches&lt;br /&gt;
|-&lt;br /&gt;
| Graphen/Netze || Entitäten + Beziehungen || Knowledge Graphs, Ontologien (RDF, OWL)&lt;br /&gt;
|-&lt;br /&gt;
| Regeln/Logik || Wenn-Dann-Regeln, Fakten || Expertensysteme, regelbasierte Systeme&lt;br /&gt;
|-&lt;br /&gt;
| Vektoren/Embeddings || semantische Nähe im Vektorraum || Vektordatenbanken, KI-/RAG-Systeme&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In der Praxis kombinieren viele Systeme mehrere Formen, z. B. ein Wiki (Text) mit Kategorien und Verlinkungen (graphartige Struktur) und einer Volltextsuche (Index).&lt;br /&gt;
&lt;br /&gt;
=== Aufbau eines Wissenssystems (Knowledge System) ===&lt;br /&gt;
&lt;br /&gt;
Ein typisches Wissenssystem durchläuft folgenden Lebenszyklus:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Erfassen&#039;&#039;&#039; (Capture) – Wissen aus Quellen (Personen, Dokumenten, Messwerten) aufnehmen&lt;br /&gt;
# &#039;&#039;&#039;Strukturieren&#039;&#039;&#039; (Organize) – Kategorisieren, Verschlagworten, in ein Schema/Modell bringen&lt;br /&gt;
# &#039;&#039;&#039;Speichern&#039;&#039;&#039; (Store) – dauerhafte Ablage in Datei, Datenbank oder Graph&lt;br /&gt;
# &#039;&#039;&#039;Abrufen&#039;&#039;&#039; (Retrieve) – Suche, Abfragen, Navigation, Vernetzung mit anderem Wissen&lt;br /&gt;
# &#039;&#039;&#039;Pflegen/Aktualisieren&#039;&#039;&#039; (Maintain) – Widersprüche auflösen, veraltetes Wissen korrigieren oder entfernen&lt;br /&gt;
# &#039;&#039;&#039;Weitergeben&#039;&#039;&#039; (Share) – Zugriff für andere Personen/Systeme ermöglichen&lt;br /&gt;
&lt;br /&gt;
Klassische Beispiele für Wissenssysteme sind Wikis (wie dieses hier), Knowledge Bases im Support-Kontext, Ontologien/Knowledge Graphs (z. B. Wikidata), Dokumentenmanagementsysteme sowie – im technischen Umfeld – Programme, die Wissen in Datenstrukturen abbilden und mittels der im Folgenden beschriebenen Techniken persistieren.&lt;br /&gt;
&lt;br /&gt;
=== Bezug zur technischen Umsetzung ===&lt;br /&gt;
&lt;br /&gt;
Die im nächsten Abschnitt beschriebenen Rust-Techniken (Structs, serde, Dateien, Key-Value-Stores, Datenbanken) sind die &#039;&#039;&#039;technische Speicherschicht&#039;&#039;&#039; für die oben genannte Stufe &amp;quot;Speichern&amp;quot;. Welche Repräsentationsform (Tabelle, Key-Value, Graph, Text) gewählt wird, bestimmt dabei maßgeblich, welche Rust-Bibliothek/Datenbank sinnvoll ist:&lt;br /&gt;
&lt;br /&gt;
* Strukturierte Datensätze mit Beziehungen → relationale Datenbank (rusqlite, sqlx, diesel)&lt;br /&gt;
* Einfache Schlüssel-Wert-Zuordnungen → Key-Value-Store (sled, redb)&lt;br /&gt;
* Einzelne Dokumente/Konfiguration → Datei + serde (JSON/TOML/YAML)&lt;br /&gt;
* Vernetztes Wissen (Graph) → Graphdatenbank-Anbindung oder eigene Graphstruktur mit Adjazenzlisten&lt;br /&gt;
&lt;br /&gt;
== Wissensspeicherung in Rust ==&lt;br /&gt;
&lt;br /&gt;
Dieser Abschnitt beschreibt die gängigen Methoden, um Daten (&amp;quot;Wissen&amp;quot;) in Rust-Programmen dauerhaft zu speichern und wieder zu laden – von einfachen Dateien bis zu vollwertigen Datenbanken.&lt;br /&gt;
&lt;br /&gt;
=== Überblick ===&lt;br /&gt;
&lt;br /&gt;
In Rust gibt es keine &amp;quot;eingebaute&amp;quot; Persistenzschicht wie in manchen anderen Sprachen. Stattdessen kombiniert man:&lt;br /&gt;
&lt;br /&gt;
# eine &#039;&#039;&#039;Datenstruktur&#039;&#039;&#039; im Speicher (&amp;lt;code&amp;gt;struct&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;enum&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;HashMap&amp;lt;/code&amp;gt;, …)&lt;br /&gt;
# eine &#039;&#039;&#039;Serialisierungsbibliothek&#039;&#039;&#039;, die diese Struktur in ein Speicherformat umwandelt (meist [https://serde.rs serde])&lt;br /&gt;
# ein &#039;&#039;&#039;Speicherziel&#039;&#039;&#039;: Datei, Key-Value-Store oder relationale/eingebettete Datenbank&lt;br /&gt;
&lt;br /&gt;
Die Wahl hängt davon ab, wie groß die Datenmenge ist, ob nebenläufiger Zugriff nötig ist und ob Abfragen (Queries) oder nur einfaches Laden/Speichern gebraucht werden.&lt;br /&gt;
&lt;br /&gt;
=== 1. Daten im Arbeitsspeicher modellieren ===&lt;br /&gt;
&lt;br /&gt;
Der erste Schritt ist immer, das &amp;quot;Wissen&amp;quot; als Rust-Typen zu modellieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Notiz {&lt;br /&gt;
    id: u32,&lt;br /&gt;
    titel: String,&lt;br /&gt;
    inhalt: String,&lt;br /&gt;
    tags: Vec&amp;lt;String&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Solche Structs sind die Grundlage für alle folgenden Speichermethoden.&lt;br /&gt;
&lt;br /&gt;
=== 2. Serialisierung mit serde ===&lt;br /&gt;
&lt;br /&gt;
Die Standardlösung in Rust ist die Crate &#039;&#039;&#039;serde&#039;&#039;&#039; (&amp;quot;SERialize/DEserialize&amp;quot;) zusammen mit einem Format wie &amp;lt;code&amp;gt;serde_json&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;serde_yaml&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;toml&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;bincode&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Cargo.toml:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[dependencies]&lt;br /&gt;
serde = { version = &amp;quot;1&amp;quot;, features = [&amp;quot;derive&amp;quot;] }&lt;br /&gt;
serde_json = &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Struct annotieren:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(serde::Serialize, serde::Deserialize)]&lt;br /&gt;
struct Notiz {&lt;br /&gt;
    id: u32,&lt;br /&gt;
    titel: String,&lt;br /&gt;
    inhalt: String,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Speichern (Serialisieren) in eine Datei:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use std::fs;&lt;br /&gt;
&lt;br /&gt;
fn speichern(notiz: &amp;amp;Notiz) -&amp;gt; std::io::Result&amp;lt;()&amp;gt; {&lt;br /&gt;
    let json = serde_json::to_string_pretty(notiz).unwrap();&lt;br /&gt;
    fs::write(&amp;quot;notiz.json&amp;quot;, json)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Laden (Deserialisieren):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fn laden() -&amp;gt; std::io::Result&amp;lt;Notiz&amp;gt; {&lt;br /&gt;
    let text = fs::read_to_string(&amp;quot;notiz.json&amp;quot;)?;&lt;br /&gt;
    let notiz: Notiz = serde_json::from_str(&amp;amp;text).unwrap();&lt;br /&gt;
    Ok(notiz)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Gängige Formate mit serde ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Format !! Crate !! Vorteil !! Einsatz&lt;br /&gt;
|-&lt;br /&gt;
| JSON || &amp;lt;code&amp;gt;serde_json&amp;lt;/code&amp;gt; || menschenlesbar, weit verbreitet || Konfiguration, APIs, Austauschformate&lt;br /&gt;
|-&lt;br /&gt;
| TOML || &amp;lt;code&amp;gt;toml&amp;lt;/code&amp;gt; || sehr gut lesbar, für Configs gedacht || Konfigurationsdateien&lt;br /&gt;
|-&lt;br /&gt;
| YAML || &amp;lt;code&amp;gt;serde_yaml&amp;lt;/code&amp;gt; || kompakt, lesbar || Konfiguration&lt;br /&gt;
|-&lt;br /&gt;
| Bincode || &amp;lt;code&amp;gt;bincode&amp;lt;/code&amp;gt; || binär, sehr schnell, kompakt || interne Persistenz, Caches&lt;br /&gt;
|-&lt;br /&gt;
| MessagePack || &amp;lt;code&amp;gt;rmp-serde&amp;lt;/code&amp;gt; || binär, kompakt, sprachübergreifend || Netzwerk, Interop&lt;br /&gt;
|-&lt;br /&gt;
| CSV || &amp;lt;code&amp;gt;csv&amp;lt;/code&amp;gt; (+ serde) || tabellarisch || Tabellen, Datenexport&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3. Reine Datei-I/O ohne serde ===&lt;br /&gt;
&lt;br /&gt;
Für sehr einfache Fälle genügt &amp;lt;code&amp;gt;std::fs&amp;lt;/code&amp;gt; direkt, z. B. um Text- oder Binärdaten zu schreiben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use std::fs::File;&lt;br /&gt;
use std::io::Write;&lt;br /&gt;
&lt;br /&gt;
fn schreiben() -&amp;gt; std::io::Result&amp;lt;()&amp;gt; {&lt;br /&gt;
    let mut datei = File::create(&amp;quot;wissen.txt&amp;quot;)?;&lt;br /&gt;
    datei.write_all(b&amp;quot;Wichtige Information&amp;quot;)?;&lt;br /&gt;
    Ok(())&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für strukturierte Binärdaten kann &amp;lt;code&amp;gt;std::io::Read&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Write&amp;lt;/code&amp;gt; zusammen mit Byte-Konvertierungen (&amp;lt;code&amp;gt;to_le_bytes&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;from_le_bytes&amp;lt;/code&amp;gt;) genutzt werden – das ist aber meist unnötig, da &amp;lt;code&amp;gt;bincode&amp;lt;/code&amp;gt; diese Arbeit übernimmt.&lt;br /&gt;
&lt;br /&gt;
=== 4. Eingebettete Key-Value-Datenbanken ===&lt;br /&gt;
&lt;br /&gt;
Wenn Daten häufig aktualisiert werden und nicht die ganze Datei neu geschrieben werden soll, eignen sich eingebettete Datenbanken:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;sled&#039;&#039;&#039; – reine Rust-Implementierung, transaktional, sehr einfache API&lt;br /&gt;
* &#039;&#039;&#039;rocksdb&#039;&#039;&#039; (Bindings zu Facebooks RocksDB) – sehr performant, C++-Unterbau&lt;br /&gt;
* &#039;&#039;&#039;redb&#039;&#039;&#039; – reine Rust-Implementierung, ACID, embedded&lt;br /&gt;
&lt;br /&gt;
Beispiel mit &#039;&#039;&#039;sled&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let db = sled::open(&amp;quot;meine_datenbank&amp;quot;)?;&lt;br /&gt;
db.insert(b&amp;quot;schluessel&amp;quot;, b&amp;quot;wert&amp;quot;)?;&lt;br /&gt;
let wert = db.get(b&amp;quot;schluessel&amp;quot;)?;&lt;br /&gt;
db.flush()?;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kombiniert man &amp;lt;code&amp;gt;sled&amp;lt;/code&amp;gt; mit &amp;lt;code&amp;gt;serde&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;bincode&amp;lt;/code&amp;gt;, lassen sich ganze Structs unter einem Schlüssel speichern:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let bytes = bincode::serialize(&amp;amp;notiz).unwrap();&lt;br /&gt;
db.insert(notiz.id.to_be_bytes(), bytes)?;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. Relationale Datenbanken ===&lt;br /&gt;
&lt;br /&gt;
Für komplexes &amp;quot;Wissen&amp;quot; mit Beziehungen, Abfragen und mehreren Nutzern bieten sich klassische SQL-Datenbanken an.&lt;br /&gt;
&lt;br /&gt;
==== SQLite (lokal, dateibasiert) ====&lt;br /&gt;
&lt;br /&gt;
Crate: &amp;lt;code&amp;gt;rusqlite&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let conn = rusqlite::Connection::open(&amp;quot;wissen.db&amp;quot;)?;&lt;br /&gt;
conn.execute(&lt;br /&gt;
    &amp;quot;CREATE TABLE IF NOT EXISTS notiz (&lt;br /&gt;
        id INTEGER PRIMARY KEY,&lt;br /&gt;
        titel TEXT NOT NULL,&lt;br /&gt;
        inhalt TEXT NOT NULL&lt;br /&gt;
    )&amp;quot;,&lt;br /&gt;
    [],&lt;br /&gt;
)?;&lt;br /&gt;
conn.execute(&lt;br /&gt;
    &amp;quot;INSERT INTO notiz (titel, inhalt) VALUES (?1, ?2)&amp;quot;,&lt;br /&gt;
    rusqlite::params![&amp;quot;Titel&amp;quot;, &amp;quot;Inhalt&amp;quot;],&lt;br /&gt;
)?;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== sqlx (async, mehrere Datenbanken) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sqlx&amp;lt;/code&amp;gt; unterstützt PostgreSQL, MySQL und SQLite mit asynchronem Zugriff und prüft SQL-Abfragen teils schon zur Kompilierzeit:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let pool = sqlx::SqlitePool::connect(&amp;quot;sqlite://wissen.db&amp;quot;).await?;&lt;br /&gt;
sqlx::query(&amp;quot;INSERT INTO notiz (titel, inhalt) VALUES (?, ?)&amp;quot;)&lt;br /&gt;
    .bind(&amp;quot;Titel&amp;quot;)&lt;br /&gt;
    .bind(&amp;quot;Inhalt&amp;quot;)&lt;br /&gt;
    .execute(&amp;amp;pool)&lt;br /&gt;
    .await?;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== diesel (ORM) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;diesel&amp;lt;/code&amp;gt; ist ein vollwertiges, synchrones ORM mit Migrationstooling und typsicheren Query-Buildern – geeignet für größere Anwendungen mit stabilem Schema.&lt;br /&gt;
&lt;br /&gt;
=== 6. Auswahlkriterien ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Anforderung !! Empfehlung&lt;br /&gt;
|-&lt;br /&gt;
| Einfache Konfiguration || TOML-Datei + serde&lt;br /&gt;
|-&lt;br /&gt;
| Ein einzelnes Objekt/Dokument || JSON-Datei + serde_json&lt;br /&gt;
|-&lt;br /&gt;
| Viele kleine Schreibzugriffe, kein SQL nötig || sled / redb (Key-Value)&lt;br /&gt;
|-&lt;br /&gt;
| Abfragen, Beziehungen, mehrere Tabellen || SQLite via rusqlite/sqlx, ggf. diesel&lt;br /&gt;
|-&lt;br /&gt;
| Netzwerk-Datenbank, mehrere Clients || PostgreSQL/MySQL via sqlx oder diesel&lt;br /&gt;
|-&lt;br /&gt;
| Maximale Geschwindigkeit, keine Lesbarkeit nötig || bincode + Datei oder Key-Value-Store&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 7. Fehlerbehandlung ===&lt;br /&gt;
&lt;br /&gt;
Alle I/O- und Datenbankoperationen in Rust liefern &amp;lt;code&amp;gt;Result&amp;lt;/code&amp;gt; zurück. Für Anwendungen empfiehlt sich eine zentrale Fehlerbehandlung, z. B. mit den Crates &#039;&#039;&#039;thiserror&#039;&#039;&#039; (für eigene Fehlertypen) oder &#039;&#039;&#039;anyhow&#039;&#039;&#039; (für einfache Fehlerweitergabe):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fn laden() -&amp;gt; anyhow::Result&amp;lt;Notiz&amp;gt; {&lt;br /&gt;
    let text = std::fs::read_to_string(&amp;quot;notiz.json&amp;quot;)?;&lt;br /&gt;
    let notiz = serde_json::from_str(&amp;amp;text)?;&lt;br /&gt;
    Ok(notiz)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8. Zusammenfassung ===&lt;br /&gt;
&lt;br /&gt;
* Datenstrukturen mit &amp;lt;code&amp;gt;struct&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;enum&amp;lt;/code&amp;gt; modellieren.&lt;br /&gt;
* Mit &#039;&#039;&#039;serde&#039;&#039;&#039; in ein passendes Format serialisieren (JSON/TOML/YAML für Lesbarkeit, bincode für Performance).&lt;br /&gt;
* Für einfache Fälle reichen Dateien (&amp;lt;code&amp;gt;std::fs&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Für häufige Änderungen: eingebettete Key-Value-Stores wie &#039;&#039;&#039;sled&#039;&#039;&#039; oder &#039;&#039;&#039;redb&#039;&#039;&#039;.&lt;br /&gt;
* Für komplexe Abfragen und Beziehungen: relationale Datenbanken über &#039;&#039;&#039;rusqlite&#039;&#039;&#039;, &#039;&#039;&#039;sqlx&#039;&#039;&#039; oder &#039;&#039;&#039;diesel&#039;&#039;&#039;.&lt;br /&gt;
* Fehlerbehandlung zentral mit &#039;&#039;&#039;anyhow&#039;&#039;&#039;/&#039;&#039;&#039;thiserror&#039;&#039;&#039; organisieren.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Rust]]&lt;br /&gt;
[[Kategorie:Datenspeicherung]]&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Hauptseite&amp;diff=34</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Hauptseite&amp;diff=34"/>
		<updated>2026-08-12T14:32:47Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: /* Data Engine (Wissensmodell &amp;amp; Speicherung) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;br /&gt;
== Grundaufbau eines Wissensmanagement-Systems ==&lt;br /&gt;
Die folgenden Bausteine beschreiben kein klassisches CMS für Blog-Artikel, sondern ein &#039;&#039;&#039;Wissensmanagement-System (Wiki-artig)&#039;&#039;&#039;: Im Mittelpunkt steht nicht die einzelne Seite, sondern das Netz aus Wissensartikeln, ihren Verknüpfungen und ihrer Auffindbarkeit. Entsprechend rücken Taxonomie, Verlinkung und Suche stärker in den Vordergrund als bei einem reinen Content-Ausgabe-System.&lt;br /&gt;
&lt;br /&gt;
== Hauptbausteine im Detail ==&lt;br /&gt;
&lt;br /&gt;
=== [[Data Engine]] ([[Wissensmodell]] &amp;amp;  [[Speicherung]]) ===&lt;br /&gt;
Das Herzstück des Systems. Es definiert, wie Wissensartikel und ihre Beziehungen abgelegt werden:&lt;br /&gt;
* Entwickler-Entscheidung: Monolithisches Datenmodell (feste Tabellen für articles, categories, tags) oder flexibles Schema (JSONB / EAV-Muster für benutzerdefinierte Wissens-Typen wie Glossareinträge, How-Tos, FAQs).&lt;br /&gt;
* Taxonomie als Kernbestandteil: Eigene Tabellen für Kategorien, Tags und Artikel-Artikel-Relationen (Verlinkungen), nicht nur für den Inhalt selbst.&lt;br /&gt;
* Mandantenfähigkeit / Multi-Tenancy (optional): Trennung von Daten per tenant_id-Spalte oder separaten Datenbankschemas.&lt;br /&gt;
* Datenbank: Relationale Datenbanken wie PostgreSQL bieten mit JSON-Unterstützung volle Flexibilität bei hoher Integrität – wichtig, da Wissensartikel oft variable Zusatzfelder benötigen.&lt;br /&gt;
&lt;br /&gt;
=== Content &amp;amp; Routing Layer (Wissensartikel-Verwaltung &amp;amp; URLs) ===&lt;br /&gt;
Verantwortlich für das Laden und Rendern von Wissensartikeln für Nutzer:&lt;br /&gt;
* Slug-Mapping: Zuordnung von lesbaren Pfaden (/wiki/rust-cms-guide) zu Datenbank-Einträgen.&lt;br /&gt;
* Status &amp;amp; Versionierung: Artikel besitzen Zustände (draft, published, archived) sowie eine Revisions-Historie – bei einem Wissenssystem meist zentraler als bei einem Blog, da Artikel fortlaufend gepflegt statt einmalig veröffentlicht werden.&lt;br /&gt;
* Rendering:&lt;br /&gt;
** Server-Side Rendering (SSR): HTML wird direkt über eine Template-Engine (z. B. Askama, Tera) gerendert.&lt;br /&gt;
** Headless (API): Ausgabe von JSON für entkoppelte Frontends.&lt;br /&gt;
&lt;br /&gt;
=== Wissensverknüpfung &amp;amp; Taxonomie (Knowledge Graph) ===&lt;br /&gt;
Das eigentliche Unterscheidungsmerkmal eines Wissenssystems gegenüber einem reinen CMS – Wissen entsteht durch Verknüpfung, nicht nur durch einzelne Artikel:&lt;br /&gt;
* Wiki-Links &amp;amp; Backlinks: Erkennung von Verweisen zwischen Artikeln (z. B. &amp;lt;nowiki&amp;gt;[[Artikelname]]&amp;lt;/nowiki&amp;gt;-Syntax) sowie automatische Rückverfolgung, welche Artikel auf einen bestimmten Artikel verlinken.&lt;br /&gt;
* Kategorien &amp;amp; Tags: Hierarchische und flache Klassifizierung von Wissensartikeln zur Navigation und Filterung.&lt;br /&gt;
* Verwandte Artikel: Automatische oder manuelle Vorschläge thematisch ähnlicher Artikel (z. B. über gemeinsame Tags oder Verlinkungsdichte).&lt;br /&gt;
* Glossar &amp;amp; Begriffsdefinitionen: Zentrale Verwaltung wiederkehrender Fachbegriffe, die aus Artikeltexten heraus verlinkt werden können.&lt;br /&gt;
&lt;br /&gt;
=== Authentication &amp;amp; Authorization (Sicherheit) ===&lt;br /&gt;
Trennt den öffentlichen Bereich vom Verwaltungsbereich:&lt;br /&gt;
* Authentifizierung: Identitätsprüfung von Benutzern (z. B. Session-Cookies oder JWT-Tokens).&lt;br /&gt;
* Rechteverwaltung (RBAC): Rollenbasierte Zugriffskontrolle (z. B. Admin, Editor, Author), um festzulegen, wer welche Endpunkte oder Inhalte bearbeiten darf.&lt;br /&gt;
&lt;br /&gt;
=== Media Manager (Dateiverwaltung) ===&lt;br /&gt;
Verwaltet Bilder, PDFs und sonstige Uploads:&lt;br /&gt;
* Upload-Pipeline: Empfang von Dateien, Prüfung von MIME-Types und Dateigrößen.&lt;br /&gt;
* Verarbeitung: Automatische Skalierung oder Konvertierung von Bildern (z. B. Erzeugung von WebP-Thumbnails).&lt;br /&gt;
* Storage: Speicherung auf dem lokalen Dateisystem oder in einem Object-Storage (S3/MinIO).&lt;br /&gt;
&lt;br /&gt;
=== Admin Backend (Verwaltungsoberfläche) ===&lt;br /&gt;
Die Benutzeroberfläche für Redakteure:&lt;br /&gt;
* Rich-Text / Markdown Editor: Eingabeoberfläche für Inhalte.&lt;br /&gt;
* REST / gRPC / GraphQL API: Kommuniziert mit dem Backend, um Inhalte, Einstellungen, Benutzer und Medien zu verwalten.&lt;br /&gt;
&lt;br /&gt;
=== Caching &amp;amp; Performance Layer ===&lt;br /&gt;
Verhindert unnötige Datenbankabfragen bei hoher Last:&lt;br /&gt;
* HTTP-Caching: Passende Header (Cache-Control, ETag) für Nginx oder CDNs.&lt;br /&gt;
* In-Memory Caching: Zwischenspeichern von zusammengestellten Seiten oder Datenbank-Ergebnissen (z. B. über In-Memory-Stores oder Redis).&lt;br /&gt;
&lt;br /&gt;
=== Search &amp;amp; Discovery (Suche) ===&lt;br /&gt;
In einem Wissenssystem oft der wichtigste Einstiegspunkt überhaupt – Nutzer suchen gezielt nach Antworten statt zu stöbern:&lt;br /&gt;
* DB-native Suche: Volltextsuche über PostgreSQL tsvector/tsquery, ausreichend für kleinere bis mittlere Datenmengen.&lt;br /&gt;
* Externer Suchindex: Bei höheren Anforderungen an Relevanz und Performance Anbindung an Meilisearch, Typesense oder Elasticsearch.&lt;br /&gt;
* Facettierung &amp;amp; Filter: Eingrenzung nach Kategorie, Tag, Datum oder Autor.&lt;br /&gt;
&lt;br /&gt;
=== SEO &amp;amp; Metadata ===&lt;br /&gt;
Sorgt dafür, dass Inhalte von Suchmaschinen korrekt erfasst werden:&lt;br /&gt;
* Meta-Tags &amp;amp; Open Graph: Pro Inhalt konfigurierbare Title-, Description- und Social-Preview-Daten.&lt;br /&gt;
* Sitemap &amp;amp; Robots: Automatisch generierte sitemap.xml und robots.txt.&lt;br /&gt;
* Kanonische URLs &amp;amp; Redirects: Vermeidung von Duplicate Content, Verwaltung von 301-Weiterleitungen bei Slug-Änderungen.&lt;br /&gt;
&lt;br /&gt;
=== Plugin- &amp;amp; Extension-System ===&lt;br /&gt;
Erlaubt es, Funktionalität ohne Eingriff in den Core zu erweitern:&lt;br /&gt;
* Hooks &amp;amp; Events: Definierte Erweiterungspunkte (z. B. before_publish, after_upload), an denen Plugins andocken können.&lt;br /&gt;
* Middleware-Ketten: Zusätzliche Verarbeitungsschritte in Request/Response-Pipeline einschiebbar.&lt;br /&gt;
&lt;br /&gt;
=== Background Jobs / Task Queue ===&lt;br /&gt;
Verlagert zeitintensive Arbeiten aus dem Request-Zyklus:&lt;br /&gt;
* Queue-Anbindung: Asynchrone Verarbeitung über Redis-basierte Queues oder tokio-Task-Runner.&lt;br /&gt;
* Typische Jobs: Bildkonvertierung, E-Mail-Versand, Sitemap-Neubau, Webhook-Zustellung.&lt;br /&gt;
* Retry &amp;amp; Fehlerbehandlung: Wiederholungslogik und Dead-Letter-Handling bei fehlgeschlagenen Jobs.&lt;br /&gt;
&lt;br /&gt;
=== Internationalisierung (i18n / l10n) ===&lt;br /&gt;
Unterstützt mehrsprachige Inhalte und Oberflächen:&lt;br /&gt;
* Mehrsprachige Inhalte: Übersetzungsstatus pro Sprache und Content-Objekt.&lt;br /&gt;
* Locale-Routing: Sprachspezifische Pfade (/de/…, /en/…) oder Subdomains.&lt;br /&gt;
* UI-Übersetzung: Lokalisierte Texte im Admin Backend.&lt;br /&gt;
&lt;br /&gt;
=== Notifications &amp;amp; E-Mail ===&lt;br /&gt;
Kommuniziert Systemereignisse an Nutzer und Redakteure:&lt;br /&gt;
* Transaktionale Mails: Passwort-Reset, Einladungen, Kommentar-Benachrichtigungen.&lt;br /&gt;
* Workflow-Benachrichtigungen: Hinweise bei Freigabe-Anfragen oder Statuswechseln von Inhalten.&lt;br /&gt;
&lt;br /&gt;
=== Audit-Log &amp;amp; Monitoring ===&lt;br /&gt;
Schafft Nachvollziehbarkeit und Betriebssicherheit:&lt;br /&gt;
* Audit-Log: Protokollierung, wer wann welche Änderung vorgenommen hat (Compliance, Nachvollziehbarkeit).&lt;br /&gt;
* Monitoring &amp;amp; Tracing: Metriken, Logs und Fehlerreporting für den laufenden Betrieb (z. B. über OpenTelemetry).&lt;br /&gt;
&lt;br /&gt;
=== Konfigurationsmanagement ===&lt;br /&gt;
Zentrale Steuerung systemweiter Einstellungen:&lt;br /&gt;
* Site-Settings: Globale Konfiguration wie Seitenname, Standardsprache, Zeitzone.&lt;br /&gt;
* Feature-Flags: Kontrolliertes Ein-/Ausschalten einzelner Funktionen ohne Redeploy.&lt;br /&gt;
&lt;br /&gt;
=== Deployment &amp;amp; Infrastructure ===&lt;br /&gt;
Betrifft Betrieb und Wartbarkeit des Systems:&lt;br /&gt;
* Migrations-Tooling: Versionierte Datenbank-Migrationen (z. B. via sqlx oder refinery).&lt;br /&gt;
* CI/CD: Automatisierte Tests und Deployments.&lt;br /&gt;
* Backup-Strategie: Regelmäßige Sicherung von Datenbank und Medien-Storage.&lt;br /&gt;
==Hinweis==&lt;br /&gt;
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Data_Engine&amp;diff=33</id>
		<title>Data Engine</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Data_Engine&amp;diff=33"/>
		<updated>2026-08-12T14:20:31Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: /* Weiterführende Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;br /&gt;
== Was ist eine Data Engine? ==&lt;br /&gt;
&lt;br /&gt;
Eine &#039;&#039;&#039;Data Engine&#039;&#039;&#039; (auch &#039;&#039;Query Engine&#039;&#039; oder &#039;&#039;Data Processing Engine&#039;&#039; genannt) ist die Softwareschicht, die dafür zuständig ist, Daten effizient zu &#039;&#039;&#039;speichern, zu lesen, zu transformieren und abzufragen&#039;&#039;&#039;. Sie bildet das Herzstück von Datenbanken, Analytics-Tools und Big-Data-Frameworks – von klassischen SQL-Datenbanken (PostgreSQL, SQLite) über analytische Systeme (ClickHouse, DuckDB) bis hin zu verteilten Big-Data-Plattformen (Apache Spark).&lt;br /&gt;
&lt;br /&gt;
Typischerweise besteht eine Data Engine aus folgenden Bausteinen:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Storage Layer&#039;&#039;&#039; – wie Daten physisch abgelegt werden (Row-basiert vs. Columnar, Kompression, Indizes)&lt;br /&gt;
# &#039;&#039;&#039;Query Parser &amp;amp; Planner&#039;&#039;&#039; – wandelt eine Anfrage (z. B. SQL oder eine DataFrame-API) in einen Ausführungsplan um&lt;br /&gt;
# &#039;&#039;&#039;Optimizer&#039;&#039;&#039; – verbessert den Plan (Predicate Pushdown, Projection Pushdown, Join-Reihenfolge, etc.)&lt;br /&gt;
# &#039;&#039;&#039;Execution Engine&#039;&#039;&#039; – führt den Plan aus und liefert Ergebnisse, oft vektorisiert oder parallelisiert&lt;br /&gt;
# &#039;&#039;&#039;Memory Management&#039;&#039;&#039; – effiziente Nutzung von RAM, oft mit Zero-Copy-Techniken&lt;br /&gt;
&lt;br /&gt;
== Warum eignet sich Rust besonders gut für Data Engines? ==&lt;br /&gt;
&lt;br /&gt;
In den letzten Jahren hat sich Rust als bevorzugte Sprache für neue Data-Engine-Projekte etabliert (Polars, Apache DataFusion, InfluxDB IOx, Qdrant, Meilisearch u. v. m.). Die Gründe dafür:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Performance auf C/C++-Niveau&#039;&#039;&#039;: Kein Garbage Collector, keine Laufzeit-Overheads – wichtig, wenn Millionen von Zeilen pro Sekunde verarbeitet werden.&lt;br /&gt;
* &#039;&#039;&#039;Speichersicherheit ohne GC&#039;&#039;&#039;: Das Ownership- und Borrow-Checker-Modell verhindert Data Races und Speicherfehler zur Compile-Zeit – entscheidend bei hochgradig parallelem Code.&lt;br /&gt;
* &#039;&#039;&#039;Fearless Concurrency&#039;&#039;&#039;: Multi-Threading (z. B. über [https://docs.rs/rayon rayon]) lässt sich sicher und ohne Angst vor Race Conditions umsetzen – essenziell für parallele Query-Ausführung.&lt;br /&gt;
* &#039;&#039;&#039;Exzellentes FFI (Foreign Function Interface)&#039;&#039;&#039;: Rust-Bibliotheken lassen sich leicht aus Python, Java, C++ etc. aufrufen (z. B. Polars als Python-Paket via PyO3), was die Integration in bestehende Data-Science-Stacks erleichtert.&lt;br /&gt;
* &#039;&#039;&#039;Starkes Ökosystem für Datenformate&#039;&#039;&#039;: Mit dem [https://arrow.apache.org/ Apache Arrow]-Ökosystem (&amp;lt;code&amp;gt;arrow-rs&amp;lt;/code&amp;gt;) existiert eine gemeinsame, spaltenorientierte In-Memory-Repräsentation, auf der viele Rust-Data-Engines aufbauen.&lt;br /&gt;
* &#039;&#039;&#039;Zero-Cost Abstractions&#039;&#039;&#039;: Hochlevel-Code (Iteratoren, Traits, Generics) wird zu genauso schnellem Maschinencode kompiliert wie handgeschriebenes Low-Level-C.&lt;br /&gt;
&lt;br /&gt;
== Apache Arrow: Das gemeinsame Fundament ==&lt;br /&gt;
&lt;br /&gt;
Viele Rust-Data-Engines nutzen &#039;&#039;&#039;Apache Arrow&#039;&#039;&#039; als In-Memory-Format. Arrow definiert ein spaltenorientiertes (&#039;&#039;columnar&#039;&#039;) Speicherlayout, das:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Cache-freundlich&#039;&#039;&#039; ist, da gleichartige Werte hintereinander im Speicher liegen&lt;br /&gt;
* &#039;&#039;&#039;SIMD-Vektorisierung&#039;&#039;&#039; ermöglicht (moderne CPUs können mehrere Werte gleichzeitig verarbeiten)&lt;br /&gt;
* &#039;&#039;&#039;Zero-Copy-Datenaustausch&#039;&#039;&#039; zwischen Prozessen/Sprachen erlaubt (z. B. zwischen Rust und Python ohne Serialisierung)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Row-basiert (klassisch):        Columnar (Arrow):&lt;br /&gt;
┌─────┬─────┬─────┐             ┌───────────────┐&lt;br /&gt;
│ id  │name │price│             │ id: [1,2,3]   │&lt;br /&gt;
├─────┼─────┼─────┤             ├───────────────┤&lt;br /&gt;
│  1  │ A   │ 9.9 │             │ name:[A,B,C]  │&lt;br /&gt;
│  2  │ B   │ 4.5 │             ├───────────────┤&lt;br /&gt;
│  3  │ C   │ 7.2 │             │ price:        │&lt;br /&gt;
└─────┴─────┴─────┘             │  [9.9,4.5,7.2]│&lt;br /&gt;
                                 └───────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für analytische Abfragen (z. B. &amp;lt;code&amp;gt;SUM(price) WHERE id &amp;gt; 1&amp;lt;/code&amp;gt;) ist das columnar-Layout deutlich effizienter, weil nur die relevanten Spalten aus dem Speicher gelesen werden müssen.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Data Engines in Rust ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Projekt !! Zweck !! Kurzbeschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[https://pola.rs/ Polars]&#039;&#039;&#039; || DataFrame-Engine || Pandas-ähnliche API, extrem schnell dank Lazy Evaluation, Query-Optimizer und Multi-Threading. Nutzt Arrow als Backend.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[https://datafusion.apache.org/ Apache DataFusion]&#039;&#039;&#039; || SQL-Query-Engine || Erweiterbares SQL-Framework, das als Baustein für eigene Datenbanken/Analytics-Tools genutzt werden kann.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[https://github.com/influxdata/influxdb_iox InfluxDB IOx]&#039;&#039;&#039; || Zeitreihen-Datenbank || Neue Storage-Engine von InfluxDB, komplett in Rust, basiert auf Arrow &amp;amp; DataFusion.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[https://duckdb.org/ DuckDB (Rust-Bindings)]&#039;&#039;&#039; || Embedded Analytics-DB || DuckDB selbst ist in C++, hat aber exzellente Rust-Bindings; oft als „SQLite für Analytics&amp;quot; bezeichnet.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[https://qdrant.tech/ Qdrant]&#039;&#039;&#039; || Vektor-Datenbank || Data Engine spezialisiert auf Vektor-Suche/Embeddings, z. B. für KI/RAG-Anwendungen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Architektur einer einfachen Data Engine (Konzept) ==&lt;br /&gt;
&lt;br /&gt;
Um das Zusammenspiel der Komponenten zu verstehen, hier ein vereinfachter Ablauf, wie eine Query verarbeitet wird – exemplarisch angelehnt an DataFusion/Polars:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   SQL / DataFrame-API&lt;br /&gt;
          │&lt;br /&gt;
          ▼&lt;br /&gt;
   ┌─────────────┐&lt;br /&gt;
   │   Parser    │  → erzeugt einen logischen Plan (AST)&lt;br /&gt;
   └─────────────┘&lt;br /&gt;
          │&lt;br /&gt;
          ▼&lt;br /&gt;
   ┌─────────────┐&lt;br /&gt;
   │  Optimizer  │  → Predicate/Projection Pushdown,&lt;br /&gt;
   └─────────────┘     Constant Folding, Join-Reordering&lt;br /&gt;
          │&lt;br /&gt;
          ▼&lt;br /&gt;
   ┌─────────────┐&lt;br /&gt;
   │  Physical   │  → wählt konkrete Ausführungsoperatoren&lt;br /&gt;
   │   Planner   │     (Hash-Join, Sort-Merge-Join, ...)&lt;br /&gt;
   └─────────────┘&lt;br /&gt;
          │&lt;br /&gt;
          ▼&lt;br /&gt;
   ┌─────────────┐&lt;br /&gt;
   │  Execution  │  → vektorisierte, parallele Ausführung&lt;br /&gt;
   │   Engine    │     über Arrow-RecordBatches&lt;br /&gt;
   └─────────────┘&lt;br /&gt;
          │&lt;br /&gt;
          ▼&lt;br /&gt;
       Ergebnis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Minimalbeispiel mit Polars ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
use polars::prelude::*;&lt;br /&gt;
&lt;br /&gt;
fn main() -&amp;gt; PolarsResult&amp;lt;()&amp;gt; {&lt;br /&gt;
    // Lazy Query: wird erst beim .collect() tatsächlich ausgeführt&lt;br /&gt;
    let df = LazyCsvReader::new(&amp;quot;daten.csv&amp;quot;)&lt;br /&gt;
        .finish()?&lt;br /&gt;
        .filter(col(&amp;quot;price&amp;quot;).gt(lit(5.0)))&lt;br /&gt;
        .group_by([col(&amp;quot;category&amp;quot;)])&lt;br /&gt;
        .agg([col(&amp;quot;price&amp;quot;).sum().alias(&amp;quot;gesamt_umsatz&amp;quot;)])&lt;br /&gt;
        .sort(&amp;quot;gesamt_umsatz&amp;quot;, Default::default())&lt;br /&gt;
        .collect()?; // Optimizer plant &amp;amp; führt hier erst aus&lt;br /&gt;
&lt;br /&gt;
    println!(&amp;quot;{df}&amp;quot;);&lt;br /&gt;
    Ok(())&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist hier das Prinzip der &#039;&#039;&#039;Lazy Evaluation&#039;&#039;&#039;: Statt jeden Schritt sofort auszuführen, baut Polars zunächst einen logischen Plan auf. Erst beim Aufruf von &amp;lt;code&amp;gt;.collect()&amp;lt;/code&amp;gt; wird dieser optimiert (z. B. wird der Filter so früh wie möglich angewendet, um weniger Daten zu verarbeiten) und dann parallel ausgeführt.&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung ==&lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;&#039;Data Engine&#039;&#039;&#039; verarbeitet Anfragen über Storage-, Planungs- und Ausführungsschichten hinweg.&lt;br /&gt;
* &#039;&#039;&#039;Rust&#039;&#039;&#039; bietet durch Speichersicherheit ohne GC, sichere Nebenläufigkeit und Zero-Cost-Abstraktionen ideale Voraussetzungen für performante, robuste Data Engines.&lt;br /&gt;
* &#039;&#039;&#039;Apache Arrow&#039;&#039;&#039; ist das gemeinsame columnar In-Memory-Format, auf dem viele moderne Rust-Data-Engines (Polars, DataFusion, InfluxDB IOx) aufbauen.&lt;br /&gt;
* Wer selbst experimentieren möchte, findet mit &#039;&#039;&#039;DataFusion&#039;&#039;&#039; einen guten Baukasten für eigene SQL-Engines und mit &#039;&#039;&#039;Polars&#039;&#039;&#039; eine ausgereifte, sofort nutzbare DataFrame-Engine.&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://arrow.apache.org/ Apache Arrow]&lt;br /&gt;
* [https://docs.pola.rs/ Polars Dokumentation]&lt;br /&gt;
* [https://datafusion.apache.org/ Apache DataFusion]&lt;br /&gt;
* [https://doc.rust-lang.org/book/ The Rust Programming Language Book]&lt;br /&gt;
&lt;br /&gt;
* [[XWiki Datenmodell (Rust) ]]&lt;br /&gt;
* [[MediaWiki – Datenmodell (Rust)]]&lt;br /&gt;
&lt;br /&gt;
==Hinweis==&lt;br /&gt;
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=MediaWiki_%E2%80%93_Datenmodell_(Rust)&amp;diff=32</id>
		<title>MediaWiki – Datenmodell (Rust)</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=MediaWiki_%E2%80%93_Datenmodell_(Rust)&amp;diff=32"/>
		<updated>2026-08-12T14:19:24Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act). &lt;br /&gt;
Dieses Dokument bildet das Kern-Datenmodell von &#039;&#039;&#039;MediaWiki&#039;&#039;&#039; (wie es z. B. Wikipedia zugrunde liegt) als Rust &amp;lt;code&amp;gt;struct&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;enum&amp;lt;/code&amp;gt; ab. Orientiert an den zentralen MediaWiki-DB-Tabellen (&amp;lt;code&amp;gt;page&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;revision&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;category&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pagelinks&amp;lt;/code&amp;gt;, …). Es ist nur das Modell – keine Business-Logik.&lt;br /&gt;
&lt;br /&gt;
== Namespace ==&lt;br /&gt;
&lt;br /&gt;
MediaWiki organisiert Seiten über feste, nummerierte Namespaces (&amp;lt;code&amp;gt;page_namespace&amp;lt;/code&amp;gt; in der DB).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub enum Namespace {&lt;br /&gt;
    Media = -2,&lt;br /&gt;
    Special = -1,&lt;br /&gt;
    Main = 0,&lt;br /&gt;
    Talk = 1,&lt;br /&gt;
    User = 2,&lt;br /&gt;
    UserTalk = 3,&lt;br /&gt;
    Project = 4,&lt;br /&gt;
    ProjectTalk = 5,&lt;br /&gt;
    File = 6,&lt;br /&gt;
    FileTalk = 7,&lt;br /&gt;
    MediaWiki = 8,&lt;br /&gt;
    MediaWikiTalk = 9,&lt;br /&gt;
    Template = 10,&lt;br /&gt;
    TemplateTalk = 11,&lt;br /&gt;
    Help = 12,&lt;br /&gt;
    HelpTalk = 13,&lt;br /&gt;
    Category = 14,&lt;br /&gt;
    CategoryTalk = 15,&lt;br /&gt;
    Custom(i32),&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Page ==&lt;br /&gt;
&lt;br /&gt;
Entspricht der &amp;lt;code&amp;gt;page&amp;lt;/code&amp;gt;-Tabelle. Hält keinen Inhalt, sondern verweist auf die aktuellste Revision.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use chrono::{DateTime, Utc};&lt;br /&gt;
&lt;br /&gt;
pub type PageId = u64;&lt;br /&gt;
pub type RevisionId = u64;&lt;br /&gt;
pub type UserId = u64;&lt;br /&gt;
pub type TextId = u64;&lt;br /&gt;
&lt;br /&gt;
pub struct Page {&lt;br /&gt;
    pub page_id: PageId,&lt;br /&gt;
    pub namespace: Namespace,&lt;br /&gt;
    pub title: String,&lt;br /&gt;
    pub is_redirect: bool,&lt;br /&gt;
    pub is_new: bool,&lt;br /&gt;
    pub latest: RevisionId,&lt;br /&gt;
    pub len: u64,&lt;br /&gt;
    pub content_model: ContentModel,&lt;br /&gt;
    pub touched: DateTime&amp;lt;Utc&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub enum ContentModel {&lt;br /&gt;
    Wikitext,&lt;br /&gt;
    JsonContent,&lt;br /&gt;
    JavaScript,&lt;br /&gt;
    Css,&lt;br /&gt;
    Text,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Revision ==&lt;br /&gt;
&lt;br /&gt;
Entspricht der &amp;lt;code&amp;gt;revision&amp;lt;/code&amp;gt;-Tabelle. Jede Bearbeitung erzeugt eine neue, unveränderliche Revision; der eigentliche Text liegt separat in &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;slot&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub struct Revision {&lt;br /&gt;
    pub rev_id: RevisionId,&lt;br /&gt;
    pub page_id: PageId,&lt;br /&gt;
    pub parent_id: Option&amp;lt;RevisionId&amp;gt;,&lt;br /&gt;
    pub text_id: TextId,&lt;br /&gt;
    pub user: RevisionUser,&lt;br /&gt;
    pub comment: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub timestamp: DateTime&amp;lt;Utc&amp;gt;,&lt;br /&gt;
    pub minor_edit: bool,&lt;br /&gt;
    pub sha1: String,&lt;br /&gt;
    pub len: u64,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Angemeldeter User oder anonyme Bearbeitung per IP (wie in MediaWiki üblich).&lt;br /&gt;
pub enum RevisionUser {&lt;br /&gt;
    Registered(UserId),&lt;br /&gt;
    Anonymous { ip: String },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Text (Content) ==&lt;br /&gt;
&lt;br /&gt;
Entspricht der &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;-Tabelle bzw. modernem &amp;lt;code&amp;gt;content&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;slots&amp;lt;/code&amp;gt;-Schema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub struct Text {&lt;br /&gt;
    pub old_id: TextId,&lt;br /&gt;
    pub content: String,&lt;br /&gt;
    pub flags: Vec&amp;lt;TextFlag&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub enum TextFlag {&lt;br /&gt;
    Gzip,&lt;br /&gt;
    Utf8,&lt;br /&gt;
    External,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== User ==&lt;br /&gt;
&lt;br /&gt;
Entspricht der &amp;lt;code&amp;gt;user&amp;lt;/code&amp;gt;-Tabelle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub struct User {&lt;br /&gt;
    pub user_id: UserId,&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub real_name: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub email: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub registration: DateTime&amp;lt;Utc&amp;gt;,&lt;br /&gt;
    pub edit_count: u64,&lt;br /&gt;
    pub groups: Vec&amp;lt;UserGroup&amp;gt;,&lt;br /&gt;
    pub blocked: Option&amp;lt;Block&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub enum UserGroup {&lt;br /&gt;
    User,&lt;br /&gt;
    Autoconfirmed,&lt;br /&gt;
    Bot,&lt;br /&gt;
    Sysop,&lt;br /&gt;
    Bureaucrat,&lt;br /&gt;
    Custom(String),&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub struct Block {&lt;br /&gt;
    pub reason: String,&lt;br /&gt;
    pub expiry: Option&amp;lt;DateTime&amp;lt;Utc&amp;gt;&amp;gt;,&lt;br /&gt;
    pub blocked_by: UserId,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Category ==&lt;br /&gt;
&lt;br /&gt;
Entspricht &amp;lt;code&amp;gt;category&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;categorylinks&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub struct Category {&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub page_count: u64,&lt;br /&gt;
    pub subcat_count: u64,&lt;br /&gt;
    pub file_count: u64,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub struct CategoryLink {&lt;br /&gt;
    pub page_id: PageId,&lt;br /&gt;
    pub category: String,&lt;br /&gt;
    pub sort_key: String,&lt;br /&gt;
    pub kind: CategoryLinkType,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub enum CategoryLinkType {&lt;br /&gt;
    Page,&lt;br /&gt;
    Subcat,&lt;br /&gt;
    File,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links (interne Verlinkung) ==&lt;br /&gt;
&lt;br /&gt;
Entspricht den Link-Tabellen &amp;lt;code&amp;gt;pagelinks&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;templatelinks&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;imagelinks&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;externallinks&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;langlinks&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;redirect&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub struct PageLink {&lt;br /&gt;
    pub from: PageId,&lt;br /&gt;
    pub to_namespace: Namespace,&lt;br /&gt;
    pub to_title: String,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub struct TemplateLink {&lt;br /&gt;
    pub from: PageId,&lt;br /&gt;
    pub template_namespace: Namespace,&lt;br /&gt;
    pub template_title: String,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub struct ImageLink {&lt;br /&gt;
    pub from: PageId,&lt;br /&gt;
    pub file_name: String,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub struct ExternalLink {&lt;br /&gt;
    pub from: PageId,&lt;br /&gt;
    pub url: String,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub struct LangLink {&lt;br /&gt;
    pub from: PageId,&lt;br /&gt;
    pub lang: String,&lt;br /&gt;
    pub title: String,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub struct Redirect {&lt;br /&gt;
    pub from: PageId,&lt;br /&gt;
    pub to_namespace: Namespace,&lt;br /&gt;
    pub to_title: String,&lt;br /&gt;
    pub fragment: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RecentChanges ==&lt;br /&gt;
&lt;br /&gt;
Entspricht &amp;lt;code&amp;gt;recentchanges&amp;lt;/code&amp;gt; – Ereignis-Log für Edits, Neuanlagen, Log-Aktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub struct RecentChange {&lt;br /&gt;
    pub rc_id: u64,&lt;br /&gt;
    pub timestamp: DateTime&amp;lt;Utc&amp;gt;,&lt;br /&gt;
    pub page_id: PageId,&lt;br /&gt;
    pub rev_id: Option&amp;lt;RevisionId&amp;gt;,&lt;br /&gt;
    pub user: RevisionUser,&lt;br /&gt;
    pub kind: RecentChangeType,&lt;br /&gt;
    pub comment: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub bot: bool,&lt;br /&gt;
    pub patrolled: bool,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub enum RecentChangeType {&lt;br /&gt;
    Edit,&lt;br /&gt;
    New,&lt;br /&gt;
    Log(LogAction),&lt;br /&gt;
    Categorize,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub enum LogAction {&lt;br /&gt;
    Delete,&lt;br /&gt;
    Move,&lt;br /&gt;
    Block,&lt;br /&gt;
    Protect,&lt;br /&gt;
    Upload,&lt;br /&gt;
    Merge,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Watchlist ==&lt;br /&gt;
&lt;br /&gt;
Entspricht &amp;lt;code&amp;gt;watchlist&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub struct WatchlistEntry {&lt;br /&gt;
    pub user_id: UserId,&lt;br /&gt;
    pub namespace: Namespace,&lt;br /&gt;
    pub title: String,&lt;br /&gt;
    pub notification_timestamp: Option&amp;lt;DateTime&amp;lt;Utc&amp;gt;&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beziehungen (Übersicht) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
User ──authors──▶ Revision ──belongs to──▶ Page ──in──▶ Namespace&lt;br /&gt;
  │                    │                       │&lt;br /&gt;
  │                    └──points to──▶ Text     ├──has many──▶ CategoryLink ──▶ Category&lt;br /&gt;
  │                                              ├──has many──▶ PageLink / TemplateLink / ImageLink&lt;br /&gt;
  └──has──▶ WatchlistEntry                       ├──may be──▶ Redirect&lt;br /&gt;
                                                  └──generates──▶ RecentChange&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hinweis==&lt;br /&gt;
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;br /&gt;
&lt;br /&gt;
[[Category:Rust]]&lt;br /&gt;
[[Category:MediaWiki]]&lt;br /&gt;
[[Category:Datenmodell]]&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=XWiki_Datenmodell_(Rust)&amp;diff=31</id>
		<title>XWiki Datenmodell (Rust)</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=XWiki_Datenmodell_(Rust)&amp;diff=31"/>
		<updated>2026-08-12T14:17:09Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;br /&gt;
&lt;br /&gt;
Dieses Datenmodell bildet den typischen Aufbau von &#039;&#039;&#039;XWiki&#039;&#039;&#039; in Rust ab, nur als &amp;lt;code&amp;gt;struct&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;enum&amp;lt;/code&amp;gt; (keine Logik):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wiki → Space → Document → Objects/Attachments/Revisions&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Grundstruktur: Wiki, Space, Document ==&lt;br /&gt;
&lt;br /&gt;
Eine XWiki-Instanz kann mehrere (Sub-)Wikis enthalten (Wiki-Farm).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Wiki {&lt;br /&gt;
    id: String,              // z.B. &amp;quot;xwiki&amp;quot;&lt;br /&gt;
    name: String,&lt;br /&gt;
    description: String,&lt;br /&gt;
    spaces: Vec&amp;lt;Space&amp;gt;,&lt;br /&gt;
    is_main_wiki: bool,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Spaces sind hierarchisch (können verschachtelt sein).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Space {&lt;br /&gt;
    name: String,&lt;br /&gt;
    parent: Option&amp;lt;Box&amp;lt;Space&amp;gt;&amp;gt;,&lt;br /&gt;
    documents: Vec&amp;lt;Document&amp;gt;,&lt;br /&gt;
    subspaces: Vec&amp;lt;Space&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Dokument (Page) ist die zentrale Content-Einheit in XWiki.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Document {&lt;br /&gt;
    id: DocumentReference,&lt;br /&gt;
    title: String,&lt;br /&gt;
    content: String,&lt;br /&gt;
    syntax: Syntax,&lt;br /&gt;
    version: String,          // z.B. &amp;quot;1.3&amp;quot;&lt;br /&gt;
    revisions: Vec&amp;lt;Revision&amp;gt;,&lt;br /&gt;
    objects: Vec&amp;lt;XObject&amp;gt;,&lt;br /&gt;
    attachments: Vec&amp;lt;Attachment&amp;gt;,&lt;br /&gt;
    author: String,&lt;br /&gt;
    creator: String,&lt;br /&gt;
    creation_date: String,    // ggf. chrono::DateTime&amp;lt;Utc&amp;gt;&lt;br /&gt;
    last_modified: String,&lt;br /&gt;
    locale: String,&lt;br /&gt;
    parent: Option&amp;lt;DocumentReference&amp;gt;,&lt;br /&gt;
    tags: Vec&amp;lt;String&amp;gt;,&lt;br /&gt;
    hidden: bool,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eindeutige Referenz auf ein Dokument: &amp;lt;code&amp;gt;wiki:space.page&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct DocumentReference {&lt;br /&gt;
    wiki: String,&lt;br /&gt;
    spaces: Vec&amp;lt;String&amp;gt;,      // verschachtelte Space-Pfade&lt;br /&gt;
    page: String,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versionierung ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Revision {&lt;br /&gt;
    version: String,&lt;br /&gt;
    author: String,&lt;br /&gt;
    date: String,&lt;br /&gt;
    comment: String,&lt;br /&gt;
    minor_edit: bool,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Syntax / Rendering ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enum Syntax {&lt;br /&gt;
    XWiki20,&lt;br /&gt;
    XWiki21,&lt;br /&gt;
    Markdown11,&lt;br /&gt;
    Html5,&lt;br /&gt;
    Plain,&lt;br /&gt;
    Velocity,&lt;br /&gt;
    Other(String),&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== XClass / XObject / XProperty (das &amp;quot;strukturierte Daten&amp;quot;-System) ==&lt;br /&gt;
&lt;br /&gt;
Eine XClass definiert ein wiederverwendbares Datenschema (wie eine Klasse).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct XClass {&lt;br /&gt;
    reference: DocumentReference,&lt;br /&gt;
    properties: Vec&amp;lt;XProperty&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct XProperty {&lt;br /&gt;
    name: String,&lt;br /&gt;
    prop_type: PropertyType,&lt;br /&gt;
    pretty_name: String,&lt;br /&gt;
    mandatory: bool,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
enum PropertyType {&lt;br /&gt;
    StringProperty,&lt;br /&gt;
    TextAreaProperty,&lt;br /&gt;
    NumberProperty(NumberKind),&lt;br /&gt;
    BooleanProperty,&lt;br /&gt;
    DateProperty,&lt;br /&gt;
    ListProperty { values: Vec&amp;lt;String&amp;gt;, multi_select: bool },&lt;br /&gt;
    DBListProperty { query: String },&lt;br /&gt;
    PasswordProperty,&lt;br /&gt;
    EmailProperty,&lt;br /&gt;
    UsersProperty,&lt;br /&gt;
    GroupsProperty,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
enum NumberKind {&lt;br /&gt;
    Integer,&lt;br /&gt;
    Long,&lt;br /&gt;
    Float,&lt;br /&gt;
    Double,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein XObject ist eine Instanz einer XClass, an ein Dokument angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct XObject {&lt;br /&gt;
    class_reference: DocumentReference,&lt;br /&gt;
    number: u32,               // Index, falls mehrere Objects gleicher Klasse&lt;br /&gt;
    properties: Vec&amp;lt;PropertyValue&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct PropertyValue {&lt;br /&gt;
    name: String,&lt;br /&gt;
    value: FieldValue,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
enum FieldValue {&lt;br /&gt;
    Text(String),&lt;br /&gt;
    Number(f64),&lt;br /&gt;
    Boolean(bool),&lt;br /&gt;
    Date(String),&lt;br /&gt;
    List(Vec&amp;lt;String&amp;gt;),&lt;br /&gt;
    Empty,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Attachments ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Attachment {&lt;br /&gt;
    filename: String,&lt;br /&gt;
    mime_type: String,&lt;br /&gt;
    size_bytes: u64,&lt;br /&gt;
    author: String,&lt;br /&gt;
    date: String,&lt;br /&gt;
    version: String,&lt;br /&gt;
    content_ref: String,       // Pfad/Handle zum Binärinhalt&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rechte / Sicherheit ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Right {&lt;br /&gt;
    level: RightLevel,&lt;br /&gt;
    entity: RightEntity,&lt;br /&gt;
    scope: RightScope,&lt;br /&gt;
    allow: bool,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
enum RightLevel {&lt;br /&gt;
    View,&lt;br /&gt;
    Edit,&lt;br /&gt;
    Comment,&lt;br /&gt;
    Delete,&lt;br /&gt;
    Admin,&lt;br /&gt;
    Register,&lt;br /&gt;
    ProgrammingRight,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
enum RightEntity {&lt;br /&gt;
    User(String),&lt;br /&gt;
    Group(String),&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
enum RightScope {&lt;br /&gt;
    Wiki(String),&lt;br /&gt;
    Space(String),&lt;br /&gt;
    Document(DocumentReference),&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Benutzer / Gruppen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct User {&lt;br /&gt;
    reference: DocumentReference,   // Users sind selbst Dokumente in XWiki.XWikiUsers&lt;br /&gt;
    username: String,&lt;br /&gt;
    email: String,&lt;br /&gt;
    groups: Vec&amp;lt;String&amp;gt;,&lt;br /&gt;
    active: bool,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct Group {&lt;br /&gt;
    reference: DocumentReference,&lt;br /&gt;
    members: Vec&amp;lt;String&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Wiki&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;Space&amp;lt;/code&amp;gt; (verschachtelbar) → &amp;lt;code&amp;gt;Document&amp;lt;/code&amp;gt; als Basis-Hierarchie&lt;br /&gt;
* &amp;lt;code&amp;gt;Document&amp;lt;/code&amp;gt; trägt Content (in einer &amp;lt;code&amp;gt;Syntax&amp;lt;/code&amp;gt;) &#039;&#039;&#039;und&#039;&#039;&#039; strukturierte Daten via &amp;lt;code&amp;gt;XObject&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;XClass&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;XProperty&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Attachment&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;Revision&amp;lt;/code&amp;gt; hängen am Dokument&lt;br /&gt;
* Rechte (&amp;lt;code&amp;gt;Right&amp;lt;/code&amp;gt;) sind granular auf Wiki/Space/Document-Ebene vergebbar&lt;br /&gt;
&lt;br /&gt;
[[Category:Rust]]&lt;br /&gt;
[[Category:XWiki]]&lt;br /&gt;
&lt;br /&gt;
==Hinweis==&lt;br /&gt;
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Rust-Datenmodell_f%C3%BCr_Typo3&amp;diff=30</id>
		<title>Rust-Datenmodell für Typo3</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Rust-Datenmodell_f%C3%BCr_Typo3&amp;diff=30"/>
		<updated>2026-08-12T14:14:03Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;br /&gt;
== Überblick ==&lt;br /&gt;
&lt;br /&gt;
Dieses Datenmodell bildet zentrale &#039;&#039;&#039;TYPO3&#039;&#039;&#039;-Konzepte als reine Rust-&#039;&#039;structs&#039;&#039; und &#039;&#039;enums&#039;&#039; ab: Seiten (&amp;lt;code&amp;gt;pages&amp;lt;/code&amp;gt;), Inhaltselemente (&amp;lt;code&amp;gt;tt_content&amp;lt;/code&amp;gt;), Sprachen, Workspaces, Benutzer und Datei-Referenzen. Es enthält &#039;&#039;&#039;keine&#039;&#039;&#039; Datenbank- oder API-Logik, sondern nur die Datenstrukturen selbst.&lt;br /&gt;
&lt;br /&gt;
Der vollständige Quellcode liegt in der Datei &amp;lt;code&amp;gt;typo3_model.rs&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Basistypen ==&lt;br /&gt;
&lt;br /&gt;
Kleine Alias-Typen für lesbarere Signaturen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Typ !! Rust-Definition !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Uid&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;u64&amp;lt;/code&amp;gt; || Eindeutige Datensatz-ID (TYPO3: immer positiv)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Pid&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;i64&amp;lt;/code&amp;gt; || Seiten-/Storage-ID; 0 = Root&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LanguageUid&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;i32&amp;lt;/code&amp;gt; || Sprach-UID; -1 = alle Sprachen, 0 = Standardsprache&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ColPos&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;i32&amp;lt;/code&amp;gt; || Spaltenposition im Backend-Layout (0 = Main, 1 = Sidebar, …)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Enums ==&lt;br /&gt;
&lt;br /&gt;
=== Doktype ===&lt;br /&gt;
&lt;br /&gt;
Seitentyp (&amp;lt;code&amp;gt;doktype&amp;lt;/code&amp;gt;-Feld der Tabelle &amp;lt;code&amp;gt;pages&amp;lt;/code&amp;gt;), bestimmt das Frontend-Verhalten einer Seite.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub enum Doktype {&lt;br /&gt;
    Standard = 1,&lt;br /&gt;
    Link = 3,&lt;br /&gt;
    Shortcut = 4,&lt;br /&gt;
    BackendUserSection = 6,&lt;br /&gt;
    MountPoint = 7,&lt;br /&gt;
    Spacer = 199,&lt;br /&gt;
    Sysfolder = 254,&lt;br /&gt;
    Recycler = 255,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CType ===&lt;br /&gt;
&lt;br /&gt;
Inhaltstyp (&amp;lt;code&amp;gt;CType&amp;lt;/code&amp;gt;-Feld der Tabelle &amp;lt;code&amp;gt;tt_content&amp;lt;/code&amp;gt;). Deckt die Core-Typen ab; &amp;lt;code&amp;gt;Plugin&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;Other&amp;lt;/code&amp;gt; fangen Extension-/Plugin-Inhalte auf.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub enum CType {&lt;br /&gt;
    Header,&lt;br /&gt;
    Text,&lt;br /&gt;
    Textmedia,&lt;br /&gt;
    Image,&lt;br /&gt;
    Bullets,&lt;br /&gt;
    Table,&lt;br /&gt;
    Uploads,&lt;br /&gt;
    Html,&lt;br /&gt;
    Plugin { list_type: String },&lt;br /&gt;
    Other(String),&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== WorkspaceStage ===&lt;br /&gt;
&lt;br /&gt;
Freigabestatus eines Datensatzes innerhalb eines Workspace.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub enum WorkspaceStage {&lt;br /&gt;
    Editing,&lt;br /&gt;
    ReadyToPublish,&lt;br /&gt;
    ReadyToPreview,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Record ===&lt;br /&gt;
&lt;br /&gt;
Getaggter Wrapper, um Datensätze unterschiedlichen Typs (z. B. in Suchergebnislisten) einheitlich zu behandeln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub enum Record {&lt;br /&gt;
    Page(Page),&lt;br /&gt;
    Content(ContentElement),&lt;br /&gt;
    File(FileReference),&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Structs ==&lt;br /&gt;
&lt;br /&gt;
=== Visibility ===&lt;br /&gt;
&lt;br /&gt;
Wiederverwendbare Sichtbarkeits-/Zeitsteuerung, wie sie in TYPO3 auf fast jedem Datensatz-Typ vorkommt.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;hidden&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt; || Datensatz manuell ausgeblendet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;deleted&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt; || Datensatz (soft-)gelöscht&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;starttime&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;i64&amp;lt;/code&amp;gt; || Unix-Timestamp ab Sichtbarkeit (0 = sofort)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;endtime&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;i64&amp;lt;/code&amp;gt; || Unix-Timestamp bis Sichtbarkeit (0 = unbegrenzt)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;fe_groups&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Vec&amp;lt;Uid&amp;gt;&amp;lt;/code&amp;gt; || Frontend-Gruppen mit Zugriff (leer = öffentlich)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Localization ===&lt;br /&gt;
&lt;br /&gt;
Lokalisierungs-Beziehung eines Datensatzes (Connected Mode).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sys_language_uid&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;LanguageUid&amp;lt;/code&amp;gt; || Sprache dieses Datensatzes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;l10n_parent&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Option&amp;lt;Uid&amp;gt;&amp;lt;/code&amp;gt; || uid des Originals in der Standardsprache&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Page ===&lt;br /&gt;
&lt;br /&gt;
Eine TYPO3-Seite (Tabelle &amp;lt;code&amp;gt;pages&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub struct Page {&lt;br /&gt;
    pub uid: Uid,&lt;br /&gt;
    pub pid: Pid,&lt;br /&gt;
    pub doktype: Doktype,&lt;br /&gt;
    pub title: String,&lt;br /&gt;
    pub slug: String,&lt;br /&gt;
    pub sorting: i64,&lt;br /&gt;
    pub nav_title: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub is_siteroot: bool,&lt;br /&gt;
    pub visibility: Visibility,&lt;br /&gt;
    pub localization: Localization,&lt;br /&gt;
    pub content_elements: Vec&amp;lt;ContentElement&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ContentElement ===&lt;br /&gt;
&lt;br /&gt;
Ein Inhaltselement (Tabelle &amp;lt;code&amp;gt;tt_content&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub struct ContentElement {&lt;br /&gt;
    pub uid: Uid,&lt;br /&gt;
    pub pid: Pid,&lt;br /&gt;
    pub ctype: CType,&lt;br /&gt;
    pub col_pos: ColPos,&lt;br /&gt;
    pub sorting: i64,&lt;br /&gt;
    pub header: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub bodytext: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub visibility: Visibility,&lt;br /&gt;
    pub localization: Localization,&lt;br /&gt;
    pub media: Vec&amp;lt;FileReference&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FileReference ===&lt;br /&gt;
&lt;br /&gt;
Datei-Referenz (Tabelle &amp;lt;code&amp;gt;sys_file_reference&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub struct FileReference {&lt;br /&gt;
    pub uid: Uid,&lt;br /&gt;
    pub file_uid: Uid,&lt;br /&gt;
    pub title: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub alternative: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub description: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub sorting: i64,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SysLanguage ===&lt;br /&gt;
&lt;br /&gt;
Sprachdefinition (Tabelle &amp;lt;code&amp;gt;sys_language&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub struct SysLanguage {&lt;br /&gt;
    pub uid: LanguageUid,&lt;br /&gt;
    pub title: String,&lt;br /&gt;
    pub language_iso_code: String,&lt;br /&gt;
    pub flag_identifier: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Workspace ===&lt;br /&gt;
&lt;br /&gt;
Ein Workspace (Tabelle &amp;lt;code&amp;gt;sys_workspace&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub struct Workspace {&lt;br /&gt;
    pub uid: Uid,&lt;br /&gt;
    pub title: String,&lt;br /&gt;
    pub stage: WorkspaceStage,&lt;br /&gt;
    pub members: Vec&amp;lt;Uid&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BackendUser / FrontendUser ===&lt;br /&gt;
&lt;br /&gt;
Benutzerkonten aus &amp;lt;code&amp;gt;be_users&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;fe_users&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub struct BackendUser {&lt;br /&gt;
    pub uid: Uid,&lt;br /&gt;
    pub username: String,&lt;br /&gt;
    pub is_admin: bool,&lt;br /&gt;
    pub usergroups: Vec&amp;lt;Uid&amp;gt;,&lt;br /&gt;
    pub disable: bool,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub struct FrontendUser {&lt;br /&gt;
    pub uid: Uid,&lt;br /&gt;
    pub username: String,&lt;br /&gt;
    pub usergroups: Vec&amp;lt;Uid&amp;gt;,&lt;br /&gt;
    pub visibility: Visibility,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beziehungen zwischen den Typen ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Page&#039;&#039;&#039; enthält mehrere &#039;&#039;&#039;ContentElement&#039;&#039;&#039;s (&amp;lt;code&amp;gt;content_elements&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &#039;&#039;&#039;ContentElement&#039;&#039;&#039; enthält mehrere &#039;&#039;&#039;FileReference&#039;&#039;&#039;s (&amp;lt;code&amp;gt;media&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &#039;&#039;&#039;Page&#039;&#039;&#039; und &#039;&#039;&#039;ContentElement&#039;&#039;&#039; nutzen beide &#039;&#039;&#039;Visibility&#039;&#039;&#039; und &#039;&#039;&#039;Localization&#039;&#039;&#039; als eingebettete structs&lt;br /&gt;
* &#039;&#039;&#039;Record&#039;&#039;&#039; fasst &#039;&#039;&#039;Page&#039;&#039;&#039;, &#039;&#039;&#039;ContentElement&#039;&#039;&#039; und &#039;&#039;&#039;FileReference&#039;&#039;&#039; als Summentyp zusammen&lt;br /&gt;
* &#039;&#039;&#039;Workspace&#039;&#039;&#039; referenziert &#039;&#039;&#039;BackendUser&#039;&#039;&#039;s über &amp;lt;code&amp;gt;members&amp;lt;/code&amp;gt; (nur als &amp;lt;code&amp;gt;Uid&amp;lt;/code&amp;gt;, keine Einbettung)&lt;br /&gt;
==Hinweis==&lt;br /&gt;
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[MCP-Server]]&lt;br /&gt;
* [[TYPO3]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Rust]]&lt;br /&gt;
[[Kategorie:TYPO3]]&lt;br /&gt;
[[Kategorie:Datenmodell]]&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Rust-Datenmodell_f%C3%BCr_Drupal-Entities&amp;diff=29</id>
		<title>Rust-Datenmodell für Drupal-Entities</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Rust-Datenmodell_f%C3%BCr_Drupal-Entities&amp;diff=29"/>
		<updated>2026-08-12T10:40:29Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel dokumentiert ein Rust-Datenmodell, das die zentralen&lt;br /&gt;
Entity-Konzepte von Drupal (Node, User, Taxonomy Term, Media, Paragraph)&lt;br /&gt;
als &amp;lt;pre&amp;gt;struct&amp;lt;/pre&amp;gt;/&amp;lt;pre&amp;gt;enum&amp;lt;/pre&amp;gt;-Typen abbildet. Das Modell enthält bewusst &#039;&#039;&#039;keine&lt;br /&gt;
Logik&#039;&#039;&#039; (keine &amp;lt;pre&amp;gt;impl&amp;lt;/pre&amp;gt;-Methoden) – es dient als reine Datenrepräsentation.&lt;br /&gt;
Eine (De-)Serialisierung (z. B. mit [https://serde.rs/ serde] für&lt;br /&gt;
Drupal-JSON:API-Antworten) ist bewusst noch nicht Teil dieses Modells&lt;br /&gt;
und folgt in einem späteren Schritt.&lt;br /&gt;
&lt;br /&gt;
== Motivation ==&lt;br /&gt;
&lt;br /&gt;
Drupal modelliert Inhalte über ein generisches Entity-System:&lt;br /&gt;
* &#039;&#039;&#039;Entity-Typen&#039;&#039;&#039; (&amp;lt;pre&amp;gt;node&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;user&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;taxonomy_term&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;media&amp;lt;/pre&amp;gt;, …) definieren die grundlegende Art eines Objekts.&lt;br /&gt;
* &#039;&#039;&#039;Bundles&#039;&#039;&#039; (bei Nodes „Content Types&amp;quot; genannt, z. B. &amp;lt;pre&amp;gt;article&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;page&amp;lt;/pre&amp;gt;) spezialisieren einen Entity-Typ.&lt;br /&gt;
* &#039;&#039;&#039;Felder&#039;&#039;&#039; (&amp;lt;pre&amp;gt;field_*&amp;lt;/pre&amp;gt;) sind pro Bundle konfigurierbar, typisiert und können einfach- oder mehrwertig (Kardinalität) sein.&lt;br /&gt;
&lt;br /&gt;
Um mit einem Drupal-Backend aus Rust heraus zu arbeiten, braucht man&lt;br /&gt;
typisierte Gegenstücke zu diesen Konzepten. Das hier beschriebene&lt;br /&gt;
Modell bildet diese Struktur 1:1 in Rust ab.&lt;br /&gt;
&lt;br /&gt;
== Grundtypen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone, PartialEq, Eq)]&lt;br /&gt;
pub enum EntityType {&lt;br /&gt;
    Node,&lt;br /&gt;
    User,&lt;br /&gt;
    TaxonomyTerm,&lt;br /&gt;
    Media,&lt;br /&gt;
    Paragraph,&lt;br /&gt;
    File,&lt;br /&gt;
    Menu,&lt;br /&gt;
    Block,&lt;br /&gt;
    Custom(String),&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]&lt;br /&gt;
pub enum PublishStatus {&lt;br /&gt;
    Published,&lt;br /&gt;
    Unpublished,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub type LangCode = String;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EntityType&amp;lt;/pre&amp;gt; bildet die von Drupal vordefinierten Entity-Typen ab; der&lt;br /&gt;
&amp;lt;pre&amp;gt;Custom&amp;lt;/pre&amp;gt;-Zweig deckt eigene, per Modul definierte Entity-Typen ab, ohne&lt;br /&gt;
das Enum ändern zu müssen.&lt;br /&gt;
&lt;br /&gt;
== Feldwerte: &amp;lt;pre&amp;gt;FieldValue&amp;lt;/pre&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Drupal-Felder sind stark typisiert (Text, Zahl, Datum, Referenz, Bild, …).&lt;br /&gt;
Dies wird über ein Enum mit Payload pro Variante abgebildet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub enum FieldValue {&lt;br /&gt;
    Text(String),&lt;br /&gt;
    TextLong { value: String, format: Option&amp;lt;String&amp;gt; },&lt;br /&gt;
    Integer(i64),&lt;br /&gt;
    Decimal(f64),&lt;br /&gt;
    Boolean(bool),&lt;br /&gt;
    DateTime(DateTime&amp;lt;Utc&amp;gt;),&lt;br /&gt;
    Email(String),&lt;br /&gt;
    Link { uri: String, title: Option&amp;lt;String&amp;gt; },&lt;br /&gt;
    EntityReference { target_id: u64, target_type: EntityType },&lt;br /&gt;
    Image {&lt;br /&gt;
        target_id: u64,&lt;br /&gt;
        alt: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
        title: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
        width: Option&amp;lt;u32&amp;gt;,&lt;br /&gt;
        height: Option&amp;lt;u32&amp;gt;,&lt;br /&gt;
    },&lt;br /&gt;
    List(Vec&amp;lt;FieldValue&amp;gt;),&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub type FieldMap = HashMap&amp;lt;String, FieldValue&amp;gt;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;pre&amp;gt;List(Vec&amp;lt;FieldValue&amp;gt;)&amp;lt;/pre&amp;gt; bildet mehrwertige Felder ab (Kardinalität &amp;gt; 1).&lt;br /&gt;
* &amp;lt;pre&amp;gt;FieldMap&amp;lt;/pre&amp;gt; ist die generische Ablage für alle &amp;lt;pre&amp;gt;field_*&amp;lt;/pre&amp;gt;-Werte eines Bundles, adressiert über den Feldmaschinennamen (z. B. &amp;lt;pre&amp;gt;field_tags&amp;lt;/pre&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Entity-Typen im Detail ==&lt;br /&gt;
&lt;br /&gt;
=== Gemeinsame Basis ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct EntityBase {&lt;br /&gt;
    pub id: u64,&lt;br /&gt;
    pub uuid: Uuid,&lt;br /&gt;
    pub entity_type: EntityType,&lt;br /&gt;
    pub bundle: String,&lt;br /&gt;
    pub langcode: LangCode,&lt;br /&gt;
    pub created: DateTime&amp;lt;Utc&amp;gt;,&lt;br /&gt;
    pub changed: DateTime&amp;lt;Utc&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EntityBase&amp;lt;/pre&amp;gt; fasst Eigenschaften zusammen, die praktisch jede&lt;br /&gt;
Content-Entity in Drupal besitzt, und wird per Komposition in konkrete&lt;br /&gt;
Entity-Structs eingebettet (siehe &amp;lt;pre&amp;gt;Node&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;Media&amp;lt;/pre&amp;gt;). Beim späteren&lt;br /&gt;
Ergänzen von serde bietet sich dafür &amp;lt;pre&amp;gt;#[serde(flatten)]&amp;lt;/pre&amp;gt; an, damit die&lt;br /&gt;
Felder von &amp;lt;pre&amp;gt;EntityBase&amp;lt;/pre&amp;gt; beim (De-)Serialisieren auf derselben Ebene&lt;br /&gt;
wie die restlichen Felder erscheinen.&lt;br /&gt;
&lt;br /&gt;
=== Node ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct Node {&lt;br /&gt;
    pub base: EntityBase,&lt;br /&gt;
    pub title: String,&lt;br /&gt;
    pub status: PublishStatus,&lt;br /&gt;
    pub author_id: u64,&lt;br /&gt;
    pub fields: FieldMap,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== User ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct User {&lt;br /&gt;
    pub id: u64,&lt;br /&gt;
    pub uuid: Uuid,&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub mail: String,&lt;br /&gt;
    pub status: bool,&lt;br /&gt;
    pub roles: Vec&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub created: DateTime&amp;lt;Utc&amp;gt;,&lt;br /&gt;
    pub fields: FieldMap,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;User&amp;lt;/pre&amp;gt; nutzt bewusst kein &amp;lt;pre&amp;gt;EntityBase&amp;lt;/pre&amp;gt;, da User-Entities in Drupal kein&lt;br /&gt;
&amp;lt;pre&amp;gt;bundle&amp;lt;/pre&amp;gt;/&amp;lt;pre&amp;gt;langcode&amp;lt;/pre&amp;gt; im klassischen Sinn besitzen und stattdessen&lt;br /&gt;
&amp;lt;pre&amp;gt;roles&amp;lt;/pre&amp;gt; und einen einfachen &amp;lt;pre&amp;gt;status: bool&amp;lt;/pre&amp;gt; (aktiv/blockiert) haben.&lt;br /&gt;
&lt;br /&gt;
=== TaxonomyTerm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct TaxonomyTerm {&lt;br /&gt;
    pub id: u64,&lt;br /&gt;
    pub uuid: Uuid,&lt;br /&gt;
    pub vocabulary: String,&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub description: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub parent_id: Option&amp;lt;u64&amp;gt;,&lt;br /&gt;
    pub weight: i32,&lt;br /&gt;
    pub fields: FieldMap,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bildet Taxonomiebegriffe inkl. hierarchischer Eltern-Referenz&lt;br /&gt;
(&amp;lt;pre&amp;gt;parent_id&amp;lt;/pre&amp;gt;) und Sortiergewicht (&amp;lt;pre&amp;gt;weight&amp;lt;/pre&amp;gt;) ab.&lt;br /&gt;
&lt;br /&gt;
=== Media &amp;amp; Paragraph ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct Media {&lt;br /&gt;
    pub base: EntityBase,&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub fields: FieldMap,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct Paragraph {&lt;br /&gt;
    pub id: u64,&lt;br /&gt;
    pub uuid: Uuid,&lt;br /&gt;
    pub bundle: String,&lt;br /&gt;
    pub fields: FieldMap,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Paragraph&amp;lt;/pre&amp;gt; ist bewusst schlank gehalten, da Paragraphs in Drupal keine&lt;br /&gt;
eigenständigen, direkt aufrufbaren Entities mit URL/Alias sind, sondern&lt;br /&gt;
stets über eine Host-Entity referenziert werden.&lt;br /&gt;
&lt;br /&gt;
== Schema-Introspektion (optional) ==&lt;br /&gt;
&lt;br /&gt;
Für Anwendungsfälle, in denen Feld- und Bundle-Definitionen selbst&lt;br /&gt;
(nicht nur Werte) abgebildet werden müssen – etwa um ein Drupal-Schema&lt;br /&gt;
zu spiegeln oder Formulare dynamisch zu generieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]&lt;br /&gt;
pub enum Cardinality {&lt;br /&gt;
    Single,&lt;br /&gt;
    Multiple,&lt;br /&gt;
    Unlimited,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct FieldDefinition {&lt;br /&gt;
    pub field_name: String,&lt;br /&gt;
    pub field_type: String,&lt;br /&gt;
    pub cardinality: Cardinality,&lt;br /&gt;
    pub required: bool,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct BundleDefinition {&lt;br /&gt;
    pub entity_type: EntityType,&lt;br /&gt;
    pub bundle: String,&lt;br /&gt;
    pub label: String,&lt;br /&gt;
    pub fields: Vec&amp;lt;FieldDefinition&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Design-Entscheidungen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Entscheidung !! Begründung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;pre&amp;gt;FieldValue&amp;lt;/pre&amp;gt; als Enum mit Payload pro Variante || Bildet Drupals starke Feldtypisierung typsicher ab, statt alles als &amp;lt;pre&amp;gt;String&amp;lt;/pre&amp;gt; zu behandeln.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;pre&amp;gt;FieldMap = HashMap&amp;lt;String, FieldValue&amp;gt;&amp;lt;/pre&amp;gt; || Bundles sind zur Compile-Zeit nicht bekannt; generische Map bleibt flexibel für beliebige &amp;lt;pre&amp;gt;field_*&amp;lt;/pre&amp;gt;-Namen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;pre&amp;gt;EntityBase&amp;lt;/pre&amp;gt; als Kompositionsfeld || Vermeidet Duplikation gemeinsamer Properties zwischen Node/Media, ohne Vererbung (die es in Rust nicht gibt).&lt;br /&gt;
|-&lt;br /&gt;
| Kein &amp;lt;pre&amp;gt;impl&amp;lt;/pre&amp;gt;-Block || Modell bleibt reine Datenschicht; Geschäftslogik (Validierung, API-Calls) gehört in separate Module.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;pre&amp;gt;EntityType::Custom(String)&amp;lt;/pre&amp;gt; || Deckt durch Contrib-/Custom-Module definierte Entity-Typen ab, ohne das Enum erweitern zu müssen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Offene Erweiterungspunkte ==&lt;br /&gt;
&lt;br /&gt;
* Weitere &amp;lt;pre&amp;gt;FieldValue&amp;lt;/pre&amp;gt;-Varianten je nach genutzten Feldtypen (z. B. &amp;lt;pre&amp;gt;Geolocation&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;Address&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;File&amp;lt;/pre&amp;gt; losgelöst von &amp;lt;pre&amp;gt;Image&amp;lt;/pre&amp;gt;).&lt;br /&gt;
* Übersetzungen (&amp;lt;pre&amp;gt;translations: HashMap&amp;lt;LangCode, FieldMap&amp;gt;&amp;lt;/pre&amp;gt;), falls Drupal-Mehrsprachigkeit (Content Translation) abgebildet werden soll.&lt;br /&gt;
* Konkretes Mapping auf die JSON:API-Hüllstruktur (&amp;lt;pre&amp;gt;data&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;attributes&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;relationships&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;included&amp;lt;/pre&amp;gt;), falls direkt gegen die Drupal-JSON:API deserialisiert werden soll, statt ein eigenes flaches Modell zu pflegen.&lt;br /&gt;
&lt;br /&gt;
== Verwendete Crates ==&lt;br /&gt;
&lt;br /&gt;
* [https://crates.io/crates/chrono chrono] – Zeitstempel (&amp;lt;pre&amp;gt;created&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;changed&amp;lt;/pre&amp;gt;)&lt;br /&gt;
* [https://crates.io/crates/uuid uuid] – Entity-UUIDs&lt;br /&gt;
&lt;br /&gt;
Hinweis: [https://serde.rs/ serde] (für die (De-)Serialisierung) ist&lt;br /&gt;
bewusst noch nicht Teil dieses Modells und wird in einem späteren&lt;br /&gt;
Schritt ergänzt.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* Drupal-Dokumentation: [https://www.drupal.org/docs/drupal-apis/entity-api Entity API]&lt;br /&gt;
* Drupal-Dokumentation: [https://www.drupal.org/docs/core-modules-and-themes/core-modules/jsonapi-module JSON:API-Modul]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Rust]]&lt;br /&gt;
[[Kategorie:Drupal]]&lt;br /&gt;
&lt;br /&gt;
==Hinweis==&lt;br /&gt;
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Data_Engine&amp;diff=28</id>
		<title>Data Engine</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Data_Engine&amp;diff=28"/>
		<updated>2026-08-12T10:33:37Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;br /&gt;
== Was ist eine Data Engine? ==&lt;br /&gt;
&lt;br /&gt;
Eine &#039;&#039;&#039;Data Engine&#039;&#039;&#039; (auch &#039;&#039;Query Engine&#039;&#039; oder &#039;&#039;Data Processing Engine&#039;&#039; genannt) ist die Softwareschicht, die dafür zuständig ist, Daten effizient zu &#039;&#039;&#039;speichern, zu lesen, zu transformieren und abzufragen&#039;&#039;&#039;. Sie bildet das Herzstück von Datenbanken, Analytics-Tools und Big-Data-Frameworks – von klassischen SQL-Datenbanken (PostgreSQL, SQLite) über analytische Systeme (ClickHouse, DuckDB) bis hin zu verteilten Big-Data-Plattformen (Apache Spark).&lt;br /&gt;
&lt;br /&gt;
Typischerweise besteht eine Data Engine aus folgenden Bausteinen:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Storage Layer&#039;&#039;&#039; – wie Daten physisch abgelegt werden (Row-basiert vs. Columnar, Kompression, Indizes)&lt;br /&gt;
# &#039;&#039;&#039;Query Parser &amp;amp; Planner&#039;&#039;&#039; – wandelt eine Anfrage (z. B. SQL oder eine DataFrame-API) in einen Ausführungsplan um&lt;br /&gt;
# &#039;&#039;&#039;Optimizer&#039;&#039;&#039; – verbessert den Plan (Predicate Pushdown, Projection Pushdown, Join-Reihenfolge, etc.)&lt;br /&gt;
# &#039;&#039;&#039;Execution Engine&#039;&#039;&#039; – führt den Plan aus und liefert Ergebnisse, oft vektorisiert oder parallelisiert&lt;br /&gt;
# &#039;&#039;&#039;Memory Management&#039;&#039;&#039; – effiziente Nutzung von RAM, oft mit Zero-Copy-Techniken&lt;br /&gt;
&lt;br /&gt;
== Warum eignet sich Rust besonders gut für Data Engines? ==&lt;br /&gt;
&lt;br /&gt;
In den letzten Jahren hat sich Rust als bevorzugte Sprache für neue Data-Engine-Projekte etabliert (Polars, Apache DataFusion, InfluxDB IOx, Qdrant, Meilisearch u. v. m.). Die Gründe dafür:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Performance auf C/C++-Niveau&#039;&#039;&#039;: Kein Garbage Collector, keine Laufzeit-Overheads – wichtig, wenn Millionen von Zeilen pro Sekunde verarbeitet werden.&lt;br /&gt;
* &#039;&#039;&#039;Speichersicherheit ohne GC&#039;&#039;&#039;: Das Ownership- und Borrow-Checker-Modell verhindert Data Races und Speicherfehler zur Compile-Zeit – entscheidend bei hochgradig parallelem Code.&lt;br /&gt;
* &#039;&#039;&#039;Fearless Concurrency&#039;&#039;&#039;: Multi-Threading (z. B. über [https://docs.rs/rayon rayon]) lässt sich sicher und ohne Angst vor Race Conditions umsetzen – essenziell für parallele Query-Ausführung.&lt;br /&gt;
* &#039;&#039;&#039;Exzellentes FFI (Foreign Function Interface)&#039;&#039;&#039;: Rust-Bibliotheken lassen sich leicht aus Python, Java, C++ etc. aufrufen (z. B. Polars als Python-Paket via PyO3), was die Integration in bestehende Data-Science-Stacks erleichtert.&lt;br /&gt;
* &#039;&#039;&#039;Starkes Ökosystem für Datenformate&#039;&#039;&#039;: Mit dem [https://arrow.apache.org/ Apache Arrow]-Ökosystem (&amp;lt;code&amp;gt;arrow-rs&amp;lt;/code&amp;gt;) existiert eine gemeinsame, spaltenorientierte In-Memory-Repräsentation, auf der viele Rust-Data-Engines aufbauen.&lt;br /&gt;
* &#039;&#039;&#039;Zero-Cost Abstractions&#039;&#039;&#039;: Hochlevel-Code (Iteratoren, Traits, Generics) wird zu genauso schnellem Maschinencode kompiliert wie handgeschriebenes Low-Level-C.&lt;br /&gt;
&lt;br /&gt;
== Apache Arrow: Das gemeinsame Fundament ==&lt;br /&gt;
&lt;br /&gt;
Viele Rust-Data-Engines nutzen &#039;&#039;&#039;Apache Arrow&#039;&#039;&#039; als In-Memory-Format. Arrow definiert ein spaltenorientiertes (&#039;&#039;columnar&#039;&#039;) Speicherlayout, das:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Cache-freundlich&#039;&#039;&#039; ist, da gleichartige Werte hintereinander im Speicher liegen&lt;br /&gt;
* &#039;&#039;&#039;SIMD-Vektorisierung&#039;&#039;&#039; ermöglicht (moderne CPUs können mehrere Werte gleichzeitig verarbeiten)&lt;br /&gt;
* &#039;&#039;&#039;Zero-Copy-Datenaustausch&#039;&#039;&#039; zwischen Prozessen/Sprachen erlaubt (z. B. zwischen Rust und Python ohne Serialisierung)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Row-basiert (klassisch):        Columnar (Arrow):&lt;br /&gt;
┌─────┬─────┬─────┐             ┌───────────────┐&lt;br /&gt;
│ id  │name │price│             │ id: [1,2,3]   │&lt;br /&gt;
├─────┼─────┼─────┤             ├───────────────┤&lt;br /&gt;
│  1  │ A   │ 9.9 │             │ name:[A,B,C]  │&lt;br /&gt;
│  2  │ B   │ 4.5 │             ├───────────────┤&lt;br /&gt;
│  3  │ C   │ 7.2 │             │ price:        │&lt;br /&gt;
└─────┴─────┴─────┘             │  [9.9,4.5,7.2]│&lt;br /&gt;
                                 └───────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für analytische Abfragen (z. B. &amp;lt;code&amp;gt;SUM(price) WHERE id &amp;gt; 1&amp;lt;/code&amp;gt;) ist das columnar-Layout deutlich effizienter, weil nur die relevanten Spalten aus dem Speicher gelesen werden müssen.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Data Engines in Rust ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Projekt !! Zweck !! Kurzbeschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[https://pola.rs/ Polars]&#039;&#039;&#039; || DataFrame-Engine || Pandas-ähnliche API, extrem schnell dank Lazy Evaluation, Query-Optimizer und Multi-Threading. Nutzt Arrow als Backend.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[https://datafusion.apache.org/ Apache DataFusion]&#039;&#039;&#039; || SQL-Query-Engine || Erweiterbares SQL-Framework, das als Baustein für eigene Datenbanken/Analytics-Tools genutzt werden kann.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[https://github.com/influxdata/influxdb_iox InfluxDB IOx]&#039;&#039;&#039; || Zeitreihen-Datenbank || Neue Storage-Engine von InfluxDB, komplett in Rust, basiert auf Arrow &amp;amp; DataFusion.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[https://duckdb.org/ DuckDB (Rust-Bindings)]&#039;&#039;&#039; || Embedded Analytics-DB || DuckDB selbst ist in C++, hat aber exzellente Rust-Bindings; oft als „SQLite für Analytics&amp;quot; bezeichnet.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[https://qdrant.tech/ Qdrant]&#039;&#039;&#039; || Vektor-Datenbank || Data Engine spezialisiert auf Vektor-Suche/Embeddings, z. B. für KI/RAG-Anwendungen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Architektur einer einfachen Data Engine (Konzept) ==&lt;br /&gt;
&lt;br /&gt;
Um das Zusammenspiel der Komponenten zu verstehen, hier ein vereinfachter Ablauf, wie eine Query verarbeitet wird – exemplarisch angelehnt an DataFusion/Polars:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   SQL / DataFrame-API&lt;br /&gt;
          │&lt;br /&gt;
          ▼&lt;br /&gt;
   ┌─────────────┐&lt;br /&gt;
   │   Parser    │  → erzeugt einen logischen Plan (AST)&lt;br /&gt;
   └─────────────┘&lt;br /&gt;
          │&lt;br /&gt;
          ▼&lt;br /&gt;
   ┌─────────────┐&lt;br /&gt;
   │  Optimizer  │  → Predicate/Projection Pushdown,&lt;br /&gt;
   └─────────────┘     Constant Folding, Join-Reordering&lt;br /&gt;
          │&lt;br /&gt;
          ▼&lt;br /&gt;
   ┌─────────────┐&lt;br /&gt;
   │  Physical   │  → wählt konkrete Ausführungsoperatoren&lt;br /&gt;
   │   Planner   │     (Hash-Join, Sort-Merge-Join, ...)&lt;br /&gt;
   └─────────────┘&lt;br /&gt;
          │&lt;br /&gt;
          ▼&lt;br /&gt;
   ┌─────────────┐&lt;br /&gt;
   │  Execution  │  → vektorisierte, parallele Ausführung&lt;br /&gt;
   │   Engine    │     über Arrow-RecordBatches&lt;br /&gt;
   └─────────────┘&lt;br /&gt;
          │&lt;br /&gt;
          ▼&lt;br /&gt;
       Ergebnis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Minimalbeispiel mit Polars ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
use polars::prelude::*;&lt;br /&gt;
&lt;br /&gt;
fn main() -&amp;gt; PolarsResult&amp;lt;()&amp;gt; {&lt;br /&gt;
    // Lazy Query: wird erst beim .collect() tatsächlich ausgeführt&lt;br /&gt;
    let df = LazyCsvReader::new(&amp;quot;daten.csv&amp;quot;)&lt;br /&gt;
        .finish()?&lt;br /&gt;
        .filter(col(&amp;quot;price&amp;quot;).gt(lit(5.0)))&lt;br /&gt;
        .group_by([col(&amp;quot;category&amp;quot;)])&lt;br /&gt;
        .agg([col(&amp;quot;price&amp;quot;).sum().alias(&amp;quot;gesamt_umsatz&amp;quot;)])&lt;br /&gt;
        .sort(&amp;quot;gesamt_umsatz&amp;quot;, Default::default())&lt;br /&gt;
        .collect()?; // Optimizer plant &amp;amp; führt hier erst aus&lt;br /&gt;
&lt;br /&gt;
    println!(&amp;quot;{df}&amp;quot;);&lt;br /&gt;
    Ok(())&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist hier das Prinzip der &#039;&#039;&#039;Lazy Evaluation&#039;&#039;&#039;: Statt jeden Schritt sofort auszuführen, baut Polars zunächst einen logischen Plan auf. Erst beim Aufruf von &amp;lt;code&amp;gt;.collect()&amp;lt;/code&amp;gt; wird dieser optimiert (z. B. wird der Filter so früh wie möglich angewendet, um weniger Daten zu verarbeiten) und dann parallel ausgeführt.&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung ==&lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;&#039;Data Engine&#039;&#039;&#039; verarbeitet Anfragen über Storage-, Planungs- und Ausführungsschichten hinweg.&lt;br /&gt;
* &#039;&#039;&#039;Rust&#039;&#039;&#039; bietet durch Speichersicherheit ohne GC, sichere Nebenläufigkeit und Zero-Cost-Abstraktionen ideale Voraussetzungen für performante, robuste Data Engines.&lt;br /&gt;
* &#039;&#039;&#039;Apache Arrow&#039;&#039;&#039; ist das gemeinsame columnar In-Memory-Format, auf dem viele moderne Rust-Data-Engines (Polars, DataFusion, InfluxDB IOx) aufbauen.&lt;br /&gt;
* Wer selbst experimentieren möchte, findet mit &#039;&#039;&#039;DataFusion&#039;&#039;&#039; einen guten Baukasten für eigene SQL-Engines und mit &#039;&#039;&#039;Polars&#039;&#039;&#039; eine ausgereifte, sofort nutzbare DataFrame-Engine.&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://arrow.apache.org/ Apache Arrow]&lt;br /&gt;
* [https://docs.pola.rs/ Polars Dokumentation]&lt;br /&gt;
* [https://datafusion.apache.org/ Apache DataFusion]&lt;br /&gt;
* [https://doc.rust-lang.org/book/ The Rust Programming Language Book]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Rust-Datenmodell für Drupal-Entities]]&lt;br /&gt;
* [[Rust-Datenmodell für Typo3]]&lt;br /&gt;
* [[XWiki Datenmodell (Rust) ]]&lt;br /&gt;
* [[MediaWiki – Datenmodell (Rust)]]&lt;br /&gt;
&lt;br /&gt;
==Hinweis==&lt;br /&gt;
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Hauptseite&amp;diff=27</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Hauptseite&amp;diff=27"/>
		<updated>2026-08-12T10:32:11Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;br /&gt;
== Grundaufbau eines Wissensmanagement-Systems ==&lt;br /&gt;
Die folgenden Bausteine beschreiben kein klassisches CMS für Blog-Artikel, sondern ein &#039;&#039;&#039;Wissensmanagement-System (Wiki-artig)&#039;&#039;&#039;: Im Mittelpunkt steht nicht die einzelne Seite, sondern das Netz aus Wissensartikeln, ihren Verknüpfungen und ihrer Auffindbarkeit. Entsprechend rücken Taxonomie, Verlinkung und Suche stärker in den Vordergrund als bei einem reinen Content-Ausgabe-System.&lt;br /&gt;
&lt;br /&gt;
== Hauptbausteine im Detail ==&lt;br /&gt;
&lt;br /&gt;
=== [[Data Engine]] ([[Wissensmodell]] &amp;amp; Speicherung) ===&lt;br /&gt;
Das Herzstück des Systems. Es definiert, wie Wissensartikel und ihre Beziehungen abgelegt werden:&lt;br /&gt;
* Entwickler-Entscheidung: Monolithisches Datenmodell (feste Tabellen für articles, categories, tags) oder flexibles Schema (JSONB / EAV-Muster für benutzerdefinierte Wissens-Typen wie Glossareinträge, How-Tos, FAQs).&lt;br /&gt;
* Taxonomie als Kernbestandteil: Eigene Tabellen für Kategorien, Tags und Artikel-Artikel-Relationen (Verlinkungen), nicht nur für den Inhalt selbst.&lt;br /&gt;
* Mandantenfähigkeit / Multi-Tenancy (optional): Trennung von Daten per tenant_id-Spalte oder separaten Datenbankschemas.&lt;br /&gt;
* Datenbank: Relationale Datenbanken wie PostgreSQL bieten mit JSON-Unterstützung volle Flexibilität bei hoher Integrität – wichtig, da Wissensartikel oft variable Zusatzfelder benötigen.&lt;br /&gt;
&lt;br /&gt;
=== Content &amp;amp; Routing Layer (Wissensartikel-Verwaltung &amp;amp; URLs) ===&lt;br /&gt;
Verantwortlich für das Laden und Rendern von Wissensartikeln für Nutzer:&lt;br /&gt;
* Slug-Mapping: Zuordnung von lesbaren Pfaden (/wiki/rust-cms-guide) zu Datenbank-Einträgen.&lt;br /&gt;
* Status &amp;amp; Versionierung: Artikel besitzen Zustände (draft, published, archived) sowie eine Revisions-Historie – bei einem Wissenssystem meist zentraler als bei einem Blog, da Artikel fortlaufend gepflegt statt einmalig veröffentlicht werden.&lt;br /&gt;
* Rendering:&lt;br /&gt;
** Server-Side Rendering (SSR): HTML wird direkt über eine Template-Engine (z. B. Askama, Tera) gerendert.&lt;br /&gt;
** Headless (API): Ausgabe von JSON für entkoppelte Frontends.&lt;br /&gt;
&lt;br /&gt;
=== Wissensverknüpfung &amp;amp; Taxonomie (Knowledge Graph) ===&lt;br /&gt;
Das eigentliche Unterscheidungsmerkmal eines Wissenssystems gegenüber einem reinen CMS – Wissen entsteht durch Verknüpfung, nicht nur durch einzelne Artikel:&lt;br /&gt;
* Wiki-Links &amp;amp; Backlinks: Erkennung von Verweisen zwischen Artikeln (z. B. &amp;lt;nowiki&amp;gt;[[Artikelname]]&amp;lt;/nowiki&amp;gt;-Syntax) sowie automatische Rückverfolgung, welche Artikel auf einen bestimmten Artikel verlinken.&lt;br /&gt;
* Kategorien &amp;amp; Tags: Hierarchische und flache Klassifizierung von Wissensartikeln zur Navigation und Filterung.&lt;br /&gt;
* Verwandte Artikel: Automatische oder manuelle Vorschläge thematisch ähnlicher Artikel (z. B. über gemeinsame Tags oder Verlinkungsdichte).&lt;br /&gt;
* Glossar &amp;amp; Begriffsdefinitionen: Zentrale Verwaltung wiederkehrender Fachbegriffe, die aus Artikeltexten heraus verlinkt werden können.&lt;br /&gt;
&lt;br /&gt;
=== Authentication &amp;amp; Authorization (Sicherheit) ===&lt;br /&gt;
Trennt den öffentlichen Bereich vom Verwaltungsbereich:&lt;br /&gt;
* Authentifizierung: Identitätsprüfung von Benutzern (z. B. Session-Cookies oder JWT-Tokens).&lt;br /&gt;
* Rechteverwaltung (RBAC): Rollenbasierte Zugriffskontrolle (z. B. Admin, Editor, Author), um festzulegen, wer welche Endpunkte oder Inhalte bearbeiten darf.&lt;br /&gt;
&lt;br /&gt;
=== Media Manager (Dateiverwaltung) ===&lt;br /&gt;
Verwaltet Bilder, PDFs und sonstige Uploads:&lt;br /&gt;
* Upload-Pipeline: Empfang von Dateien, Prüfung von MIME-Types und Dateigrößen.&lt;br /&gt;
* Verarbeitung: Automatische Skalierung oder Konvertierung von Bildern (z. B. Erzeugung von WebP-Thumbnails).&lt;br /&gt;
* Storage: Speicherung auf dem lokalen Dateisystem oder in einem Object-Storage (S3/MinIO).&lt;br /&gt;
&lt;br /&gt;
=== Admin Backend (Verwaltungsoberfläche) ===&lt;br /&gt;
Die Benutzeroberfläche für Redakteure:&lt;br /&gt;
* Rich-Text / Markdown Editor: Eingabeoberfläche für Inhalte.&lt;br /&gt;
* REST / gRPC / GraphQL API: Kommuniziert mit dem Backend, um Inhalte, Einstellungen, Benutzer und Medien zu verwalten.&lt;br /&gt;
&lt;br /&gt;
=== Caching &amp;amp; Performance Layer ===&lt;br /&gt;
Verhindert unnötige Datenbankabfragen bei hoher Last:&lt;br /&gt;
* HTTP-Caching: Passende Header (Cache-Control, ETag) für Nginx oder CDNs.&lt;br /&gt;
* In-Memory Caching: Zwischenspeichern von zusammengestellten Seiten oder Datenbank-Ergebnissen (z. B. über In-Memory-Stores oder Redis).&lt;br /&gt;
&lt;br /&gt;
=== Search &amp;amp; Discovery (Suche) ===&lt;br /&gt;
In einem Wissenssystem oft der wichtigste Einstiegspunkt überhaupt – Nutzer suchen gezielt nach Antworten statt zu stöbern:&lt;br /&gt;
* DB-native Suche: Volltextsuche über PostgreSQL tsvector/tsquery, ausreichend für kleinere bis mittlere Datenmengen.&lt;br /&gt;
* Externer Suchindex: Bei höheren Anforderungen an Relevanz und Performance Anbindung an Meilisearch, Typesense oder Elasticsearch.&lt;br /&gt;
* Facettierung &amp;amp; Filter: Eingrenzung nach Kategorie, Tag, Datum oder Autor.&lt;br /&gt;
&lt;br /&gt;
=== SEO &amp;amp; Metadata ===&lt;br /&gt;
Sorgt dafür, dass Inhalte von Suchmaschinen korrekt erfasst werden:&lt;br /&gt;
* Meta-Tags &amp;amp; Open Graph: Pro Inhalt konfigurierbare Title-, Description- und Social-Preview-Daten.&lt;br /&gt;
* Sitemap &amp;amp; Robots: Automatisch generierte sitemap.xml und robots.txt.&lt;br /&gt;
* Kanonische URLs &amp;amp; Redirects: Vermeidung von Duplicate Content, Verwaltung von 301-Weiterleitungen bei Slug-Änderungen.&lt;br /&gt;
&lt;br /&gt;
=== Plugin- &amp;amp; Extension-System ===&lt;br /&gt;
Erlaubt es, Funktionalität ohne Eingriff in den Core zu erweitern:&lt;br /&gt;
* Hooks &amp;amp; Events: Definierte Erweiterungspunkte (z. B. before_publish, after_upload), an denen Plugins andocken können.&lt;br /&gt;
* Middleware-Ketten: Zusätzliche Verarbeitungsschritte in Request/Response-Pipeline einschiebbar.&lt;br /&gt;
&lt;br /&gt;
=== Background Jobs / Task Queue ===&lt;br /&gt;
Verlagert zeitintensive Arbeiten aus dem Request-Zyklus:&lt;br /&gt;
* Queue-Anbindung: Asynchrone Verarbeitung über Redis-basierte Queues oder tokio-Task-Runner.&lt;br /&gt;
* Typische Jobs: Bildkonvertierung, E-Mail-Versand, Sitemap-Neubau, Webhook-Zustellung.&lt;br /&gt;
* Retry &amp;amp; Fehlerbehandlung: Wiederholungslogik und Dead-Letter-Handling bei fehlgeschlagenen Jobs.&lt;br /&gt;
&lt;br /&gt;
=== Internationalisierung (i18n / l10n) ===&lt;br /&gt;
Unterstützt mehrsprachige Inhalte und Oberflächen:&lt;br /&gt;
* Mehrsprachige Inhalte: Übersetzungsstatus pro Sprache und Content-Objekt.&lt;br /&gt;
* Locale-Routing: Sprachspezifische Pfade (/de/…, /en/…) oder Subdomains.&lt;br /&gt;
* UI-Übersetzung: Lokalisierte Texte im Admin Backend.&lt;br /&gt;
&lt;br /&gt;
=== Notifications &amp;amp; E-Mail ===&lt;br /&gt;
Kommuniziert Systemereignisse an Nutzer und Redakteure:&lt;br /&gt;
* Transaktionale Mails: Passwort-Reset, Einladungen, Kommentar-Benachrichtigungen.&lt;br /&gt;
* Workflow-Benachrichtigungen: Hinweise bei Freigabe-Anfragen oder Statuswechseln von Inhalten.&lt;br /&gt;
&lt;br /&gt;
=== Audit-Log &amp;amp; Monitoring ===&lt;br /&gt;
Schafft Nachvollziehbarkeit und Betriebssicherheit:&lt;br /&gt;
* Audit-Log: Protokollierung, wer wann welche Änderung vorgenommen hat (Compliance, Nachvollziehbarkeit).&lt;br /&gt;
* Monitoring &amp;amp; Tracing: Metriken, Logs und Fehlerreporting für den laufenden Betrieb (z. B. über OpenTelemetry).&lt;br /&gt;
&lt;br /&gt;
=== Konfigurationsmanagement ===&lt;br /&gt;
Zentrale Steuerung systemweiter Einstellungen:&lt;br /&gt;
* Site-Settings: Globale Konfiguration wie Seitenname, Standardsprache, Zeitzone.&lt;br /&gt;
* Feature-Flags: Kontrolliertes Ein-/Ausschalten einzelner Funktionen ohne Redeploy.&lt;br /&gt;
&lt;br /&gt;
=== Deployment &amp;amp; Infrastructure ===&lt;br /&gt;
Betrifft Betrieb und Wartbarkeit des Systems:&lt;br /&gt;
* Migrations-Tooling: Versionierte Datenbank-Migrationen (z. B. via sqlx oder refinery).&lt;br /&gt;
* CI/CD: Automatisierte Tests und Deployments.&lt;br /&gt;
* Backup-Strategie: Regelmäßige Sicherung von Datenbank und Medien-Storage.&lt;br /&gt;
==Hinweis==&lt;br /&gt;
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Wissensmodell&amp;diff=26</id>
		<title>Wissensmodell</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Wissensmodell&amp;diff=26"/>
		<updated>2026-08-12T04:09:02Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: Die Seite wurde neu angelegt: „ Ein &amp;#039;&amp;#039;&amp;#039;Wissensmodell&amp;#039;&amp;#039;&amp;#039; (engl. &amp;#039;&amp;#039;knowledge model&amp;#039;&amp;#039;) ist eine strukturierte, formale Repräsentation von Wissen über einen bestimmten Bereich (Domäne). Es ermöglicht einem System, Wissen zu speichern, zu verknüpfen, abzufragen und daraus neue Schlüsse zu ziehen. Dieser Artikel beschreibt zunächst das Konzept allgemein und danach, wie man ein solches Modell konkret in der Programmiersprache &amp;#039;&amp;#039;&amp;#039;Rust&amp;#039;&amp;#039;&amp;#039; umsetzen kann.  == Abgrenzung zum Datenmodell ==…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Ein &#039;&#039;&#039;Wissensmodell&#039;&#039;&#039; (engl. &#039;&#039;knowledge model&#039;&#039;) ist eine strukturierte, formale Repräsentation von Wissen über einen bestimmten Bereich (Domäne). Es ermöglicht einem System, Wissen zu speichern, zu verknüpfen, abzufragen und daraus neue Schlüsse zu ziehen. Dieser Artikel beschreibt zunächst das Konzept allgemein und danach, wie man ein solches Modell konkret in der Programmiersprache &#039;&#039;&#039;Rust&#039;&#039;&#039; umsetzen kann.&lt;br /&gt;
&lt;br /&gt;
== Abgrenzung zum Datenmodell ==&lt;br /&gt;
&lt;br /&gt;
Ein Datenmodell beschreibt nur die &#039;&#039;&#039;Struktur&#039;&#039;&#039; von Daten (Tabellen, Felder, Typen). Ein Wissensmodell beschreibt zusätzlich die &#039;&#039;&#039;Bedeutung&#039;&#039;&#039; (Semantik) und die &#039;&#039;&#039;Beziehungen&#039;&#039;&#039; zwischen den Dingen – oft so, dass daraus automatisch neues Wissen abgeleitet werden kann (Inferenz).&lt;br /&gt;
&lt;br /&gt;
== Kernbausteine ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Entitäten (Konzepte)&#039;&#039;&#039; – die „Dinge“, über die Wissen existiert (z. B. Person, Ort, Ereignis)&lt;br /&gt;
* &#039;&#039;&#039;Attribute&#039;&#039;&#039; – Eigenschaften dieser Entitäten (z. B. Name, Datum, Farbe)&lt;br /&gt;
* &#039;&#039;&#039;Relationen&#039;&#039;&#039; – Beziehungen zwischen Entitäten (z. B. „ist Teil von“, „arbeitet bei“, „verursacht“)&lt;br /&gt;
* &#039;&#039;&#039;Axiome / Regeln&#039;&#039;&#039; – logische Aussagen, die festlegen, was aus vorhandenem Wissen gefolgert werden darf&lt;br /&gt;
* &#039;&#039;&#039;Taxonomie/Hierarchie&#039;&#039;&#039; – Ober-/Unterbegriffe, Klassifikation (Vererbung von Eigenschaften)&lt;br /&gt;
&lt;br /&gt;
== Typische Formen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Form !! Beschreibung !! Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| Ontologie || formale, oft logikbasierte Beschreibung eines Bereichs mit Klassen, Relationen, Regeln || OWL, RDF-Schema&lt;br /&gt;
|-&lt;br /&gt;
| Knowledge Graph || Netzwerk aus Knoten (Entitäten) und Kanten (Relationen) || Google Knowledge Graph, Wikidata&lt;br /&gt;
|-&lt;br /&gt;
| Semantisches Netz || ähnlich Knowledge Graph, meist einfacher, ohne strenge Logik || Begriffsnetze in NLP&lt;br /&gt;
|-&lt;br /&gt;
| Frame-Modell || Wissen in „Rahmen“ mit vordefinierten Slots/Attributen || KI-Systeme der 1980er&lt;br /&gt;
|-&lt;br /&gt;
| Regelbasiertes System || Wissen als Wenn-Dann-Regeln || Expertensysteme&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umsetzung in Rust ==&lt;br /&gt;
&lt;br /&gt;
Rust eignet sich wegen seines starken, statischen Typsystems, seiner Ownership-Regeln und seiner Performance besonders gut, um Wissensmodelle sowohl &#039;&#039;&#039;typsicher&#039;&#039;&#039; als auch &#039;&#039;&#039;effizient&#039;&#039;&#039; abzubilden. Es gibt grundsätzlich drei gängige Ansätze:&lt;br /&gt;
&lt;br /&gt;
=== 1. Eigene Struct/Enum-Modellierung ===&lt;br /&gt;
&lt;br /&gt;
Entitäten, Attribute und Relationen werden direkt als Rust-Typen abgebildet. Das ist einfach, sehr performant und vom Compiler geprüft, aber weniger flexibel bei sich ändernden Schemata.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use std::collections::HashMap;&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
struct Entity {&lt;br /&gt;
    id: u64,&lt;br /&gt;
    name: String,&lt;br /&gt;
    attributes: HashMap&amp;lt;String, String&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
enum Relation {&lt;br /&gt;
    IsA(u64, u64),        // Entität A ist ein B&lt;br /&gt;
    PartOf(u64, u64),     // Entität A ist Teil von B&lt;br /&gt;
    WorksAt(u64, u64),    // Entität A arbeitet bei B&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct KnowledgeModel {&lt;br /&gt;
    entities: HashMap&amp;lt;u64, Entity&amp;gt;,&lt;br /&gt;
    relations: Vec&amp;lt;Relation&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Graphbasiert mit einer Crate wie &amp;lt;code&amp;gt;petgraph&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Wissen wird als Graph aus Knoten (Entitäten) und Kanten (Relationen) gespeichert. Das passt sehr gut zum Konzept des Knowledge Graph und erlaubt Graphalgorithmen (kürzeste Wege, Traversierung, Zentralitätsmaße) direkt „out of the box“.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use petgraph::graph::DiGraph;&lt;br /&gt;
&lt;br /&gt;
let mut graph = DiGraph::&amp;lt;&amp;amp;str, &amp;amp;str&amp;gt;::new();&lt;br /&gt;
&lt;br /&gt;
let person = graph.add_node(&amp;quot;Person: Alice&amp;quot;);&lt;br /&gt;
let company = graph.add_node(&amp;quot;Firma: Acme&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
graph.add_edge(person, company, &amp;quot;arbeitet bei&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Semantisch/RDF-basiert mit einer Crate wie &amp;lt;code&amp;gt;oxigraph&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Für echte Ontologien nach W3C-Standards (RDF, RDFS, OWL) bietet sich &amp;lt;code&amp;gt;oxigraph&amp;lt;/code&amp;gt; an – eine in Rust geschriebene Graphdatenbank mit SPARQL-Unterstützung. Damit lassen sich Wissensmodelle abfragen, die auch mit Tools aus dem Semantic-Web-Umfeld kompatibel sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use oxigraph::store::Store;&lt;br /&gt;
use oxigraph::model::*;&lt;br /&gt;
&lt;br /&gt;
let store = Store::new().unwrap();&lt;br /&gt;
&lt;br /&gt;
let subject = NamedNode::new(&amp;quot;http://example.org/alice&amp;quot;).unwrap();&lt;br /&gt;
let predicate = NamedNode::new(&amp;quot;http://example.org/worksAt&amp;quot;).unwrap();&lt;br /&gt;
let object = NamedNode::new(&amp;quot;http://example.org/acme&amp;quot;).unwrap();&lt;br /&gt;
&lt;br /&gt;
store.insert(&amp;amp;Quad::new(subject, predicate, object, GraphName::DefaultGraph)).unwrap();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vergleich der Ansätze ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ansatz !! Typsicherheit !! Flexibilität !! Eignung&lt;br /&gt;
|-&lt;br /&gt;
| Struct/Enum || sehr hoch || niedrig || feste, bekannte Domänenmodelle&lt;br /&gt;
|-&lt;br /&gt;
| petgraph || hoch || mittel || Knowledge Graphs, Netzwerkanalysen&lt;br /&gt;
|-&lt;br /&gt;
| oxigraph (RDF/SPARQL) || mittel || sehr hoch || Ontologien, Interoperabilität mit Semantic-Web-Standards&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Einsatzzwecke ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Wissensrepräsentation&#039;&#039;&#039; in KI-Systemen (Expertensysteme, Reasoning-Engines)&lt;br /&gt;
* &#039;&#039;&#039;Semantische Suche&#039;&#039;&#039; – Bedeutung statt reiner Stichwortsuche&lt;br /&gt;
* &#039;&#039;&#039;Datenintegration&#039;&#039;&#039; – heterogene Quellen über gemeinsame Begriffe verbinden&lt;br /&gt;
* &#039;&#039;&#039;Inferenz&#039;&#039;&#039; – aus explizitem Wissen implizites Wissen automatisch ableiten&lt;br /&gt;
* Grundlage für &#039;&#039;&#039;RAG-Systeme&#039;&#039;&#039; (Retrieval-Augmented Generation) und Chatbots, die auf strukturiertem Wissen statt nur auf Freitext basieren&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
&lt;br /&gt;
Ein Wissensmodell ist im Grunde die formale „Landkarte“ eines Wissensgebiets: Was gibt es (Entitäten), wie hängt es zusammen (Relationen), und welche Regeln gelten (Logik) – sodass ein System damit nicht nur Daten ablegen, sondern tatsächlich schlussfolgern kann. In Rust lässt sich das je nach Anforderung entweder leichtgewichtig mit eigenen Structs/Enums, graphbasiert mit &amp;lt;code&amp;gt;petgraph&amp;lt;/code&amp;gt; oder standardkonform mit RDF/SPARQL über &amp;lt;code&amp;gt;oxigraph&amp;lt;/code&amp;gt; umsetzen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Wissensmodellierung]]&lt;br /&gt;
[[Kategorie:Rust]]&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Hauptseite&amp;diff=25</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Hauptseite&amp;diff=25"/>
		<updated>2026-08-12T04:08:29Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: /* Data Engine (Wissensmodell &amp;amp; Speicherung) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Grundaufbau eines Wissensmanagement-Systems ==&lt;br /&gt;
Die folgenden Bausteine beschreiben kein klassisches CMS für Blog-Artikel, sondern ein &#039;&#039;&#039;Wissensmanagement-System (Wiki-artig)&#039;&#039;&#039;: Im Mittelpunkt steht nicht die einzelne Seite, sondern das Netz aus Wissensartikeln, ihren Verknüpfungen und ihrer Auffindbarkeit. Entsprechend rücken Taxonomie, Verlinkung und Suche stärker in den Vordergrund als bei einem reinen Content-Ausgabe-System.&lt;br /&gt;
&lt;br /&gt;
== Hauptbausteine im Detail ==&lt;br /&gt;
&lt;br /&gt;
=== [[Data Engine]] ([[Wissensmodell]] &amp;amp; Speicherung) ===&lt;br /&gt;
Das Herzstück des Systems. Es definiert, wie Wissensartikel und ihre Beziehungen abgelegt werden:&lt;br /&gt;
* Entwickler-Entscheidung: Monolithisches Datenmodell (feste Tabellen für articles, categories, tags) oder flexibles Schema (JSONB / EAV-Muster für benutzerdefinierte Wissens-Typen wie Glossareinträge, How-Tos, FAQs).&lt;br /&gt;
* Taxonomie als Kernbestandteil: Eigene Tabellen für Kategorien, Tags und Artikel-Artikel-Relationen (Verlinkungen), nicht nur für den Inhalt selbst.&lt;br /&gt;
* Mandantenfähigkeit / Multi-Tenancy (optional): Trennung von Daten per tenant_id-Spalte oder separaten Datenbankschemas.&lt;br /&gt;
* Datenbank: Relationale Datenbanken wie PostgreSQL bieten mit JSON-Unterstützung volle Flexibilität bei hoher Integrität – wichtig, da Wissensartikel oft variable Zusatzfelder benötigen.&lt;br /&gt;
&lt;br /&gt;
=== Content &amp;amp; Routing Layer (Wissensartikel-Verwaltung &amp;amp; URLs) ===&lt;br /&gt;
Verantwortlich für das Laden und Rendern von Wissensartikeln für Nutzer:&lt;br /&gt;
* Slug-Mapping: Zuordnung von lesbaren Pfaden (/wiki/rust-cms-guide) zu Datenbank-Einträgen.&lt;br /&gt;
* Status &amp;amp; Versionierung: Artikel besitzen Zustände (draft, published, archived) sowie eine Revisions-Historie – bei einem Wissenssystem meist zentraler als bei einem Blog, da Artikel fortlaufend gepflegt statt einmalig veröffentlicht werden.&lt;br /&gt;
* Rendering:&lt;br /&gt;
** Server-Side Rendering (SSR): HTML wird direkt über eine Template-Engine (z. B. Askama, Tera) gerendert.&lt;br /&gt;
** Headless (API): Ausgabe von JSON für entkoppelte Frontends.&lt;br /&gt;
&lt;br /&gt;
=== Wissensverknüpfung &amp;amp; Taxonomie (Knowledge Graph) ===&lt;br /&gt;
Das eigentliche Unterscheidungsmerkmal eines Wissenssystems gegenüber einem reinen CMS – Wissen entsteht durch Verknüpfung, nicht nur durch einzelne Artikel:&lt;br /&gt;
* Wiki-Links &amp;amp; Backlinks: Erkennung von Verweisen zwischen Artikeln (z. B. &amp;lt;nowiki&amp;gt;[[Artikelname]]&amp;lt;/nowiki&amp;gt;-Syntax) sowie automatische Rückverfolgung, welche Artikel auf einen bestimmten Artikel verlinken.&lt;br /&gt;
* Kategorien &amp;amp; Tags: Hierarchische und flache Klassifizierung von Wissensartikeln zur Navigation und Filterung.&lt;br /&gt;
* Verwandte Artikel: Automatische oder manuelle Vorschläge thematisch ähnlicher Artikel (z. B. über gemeinsame Tags oder Verlinkungsdichte).&lt;br /&gt;
* Glossar &amp;amp; Begriffsdefinitionen: Zentrale Verwaltung wiederkehrender Fachbegriffe, die aus Artikeltexten heraus verlinkt werden können.&lt;br /&gt;
&lt;br /&gt;
=== Authentication &amp;amp; Authorization (Sicherheit) ===&lt;br /&gt;
Trennt den öffentlichen Bereich vom Verwaltungsbereich:&lt;br /&gt;
* Authentifizierung: Identitätsprüfung von Benutzern (z. B. Session-Cookies oder JWT-Tokens).&lt;br /&gt;
* Rechteverwaltung (RBAC): Rollenbasierte Zugriffskontrolle (z. B. Admin, Editor, Author), um festzulegen, wer welche Endpunkte oder Inhalte bearbeiten darf.&lt;br /&gt;
&lt;br /&gt;
=== Media Manager (Dateiverwaltung) ===&lt;br /&gt;
Verwaltet Bilder, PDFs und sonstige Uploads:&lt;br /&gt;
* Upload-Pipeline: Empfang von Dateien, Prüfung von MIME-Types und Dateigrößen.&lt;br /&gt;
* Verarbeitung: Automatische Skalierung oder Konvertierung von Bildern (z. B. Erzeugung von WebP-Thumbnails).&lt;br /&gt;
* Storage: Speicherung auf dem lokalen Dateisystem oder in einem Object-Storage (S3/MinIO).&lt;br /&gt;
&lt;br /&gt;
=== Admin Backend (Verwaltungsoberfläche) ===&lt;br /&gt;
Die Benutzeroberfläche für Redakteure:&lt;br /&gt;
* Rich-Text / Markdown Editor: Eingabeoberfläche für Inhalte.&lt;br /&gt;
* REST / gRPC / GraphQL API: Kommuniziert mit dem Backend, um Inhalte, Einstellungen, Benutzer und Medien zu verwalten.&lt;br /&gt;
&lt;br /&gt;
=== Caching &amp;amp; Performance Layer ===&lt;br /&gt;
Verhindert unnötige Datenbankabfragen bei hoher Last:&lt;br /&gt;
* HTTP-Caching: Passende Header (Cache-Control, ETag) für Nginx oder CDNs.&lt;br /&gt;
* In-Memory Caching: Zwischenspeichern von zusammengestellten Seiten oder Datenbank-Ergebnissen (z. B. über In-Memory-Stores oder Redis).&lt;br /&gt;
&lt;br /&gt;
=== Search &amp;amp; Discovery (Suche) ===&lt;br /&gt;
In einem Wissenssystem oft der wichtigste Einstiegspunkt überhaupt – Nutzer suchen gezielt nach Antworten statt zu stöbern:&lt;br /&gt;
* DB-native Suche: Volltextsuche über PostgreSQL tsvector/tsquery, ausreichend für kleinere bis mittlere Datenmengen.&lt;br /&gt;
* Externer Suchindex: Bei höheren Anforderungen an Relevanz und Performance Anbindung an Meilisearch, Typesense oder Elasticsearch.&lt;br /&gt;
* Facettierung &amp;amp; Filter: Eingrenzung nach Kategorie, Tag, Datum oder Autor.&lt;br /&gt;
&lt;br /&gt;
=== SEO &amp;amp; Metadata ===&lt;br /&gt;
Sorgt dafür, dass Inhalte von Suchmaschinen korrekt erfasst werden:&lt;br /&gt;
* Meta-Tags &amp;amp; Open Graph: Pro Inhalt konfigurierbare Title-, Description- und Social-Preview-Daten.&lt;br /&gt;
* Sitemap &amp;amp; Robots: Automatisch generierte sitemap.xml und robots.txt.&lt;br /&gt;
* Kanonische URLs &amp;amp; Redirects: Vermeidung von Duplicate Content, Verwaltung von 301-Weiterleitungen bei Slug-Änderungen.&lt;br /&gt;
&lt;br /&gt;
=== Plugin- &amp;amp; Extension-System ===&lt;br /&gt;
Erlaubt es, Funktionalität ohne Eingriff in den Core zu erweitern:&lt;br /&gt;
* Hooks &amp;amp; Events: Definierte Erweiterungspunkte (z. B. before_publish, after_upload), an denen Plugins andocken können.&lt;br /&gt;
* Middleware-Ketten: Zusätzliche Verarbeitungsschritte in Request/Response-Pipeline einschiebbar.&lt;br /&gt;
&lt;br /&gt;
=== Background Jobs / Task Queue ===&lt;br /&gt;
Verlagert zeitintensive Arbeiten aus dem Request-Zyklus:&lt;br /&gt;
* Queue-Anbindung: Asynchrone Verarbeitung über Redis-basierte Queues oder tokio-Task-Runner.&lt;br /&gt;
* Typische Jobs: Bildkonvertierung, E-Mail-Versand, Sitemap-Neubau, Webhook-Zustellung.&lt;br /&gt;
* Retry &amp;amp; Fehlerbehandlung: Wiederholungslogik und Dead-Letter-Handling bei fehlgeschlagenen Jobs.&lt;br /&gt;
&lt;br /&gt;
=== Internationalisierung (i18n / l10n) ===&lt;br /&gt;
Unterstützt mehrsprachige Inhalte und Oberflächen:&lt;br /&gt;
* Mehrsprachige Inhalte: Übersetzungsstatus pro Sprache und Content-Objekt.&lt;br /&gt;
* Locale-Routing: Sprachspezifische Pfade (/de/…, /en/…) oder Subdomains.&lt;br /&gt;
* UI-Übersetzung: Lokalisierte Texte im Admin Backend.&lt;br /&gt;
&lt;br /&gt;
=== Notifications &amp;amp; E-Mail ===&lt;br /&gt;
Kommuniziert Systemereignisse an Nutzer und Redakteure:&lt;br /&gt;
* Transaktionale Mails: Passwort-Reset, Einladungen, Kommentar-Benachrichtigungen.&lt;br /&gt;
* Workflow-Benachrichtigungen: Hinweise bei Freigabe-Anfragen oder Statuswechseln von Inhalten.&lt;br /&gt;
&lt;br /&gt;
=== Audit-Log &amp;amp; Monitoring ===&lt;br /&gt;
Schafft Nachvollziehbarkeit und Betriebssicherheit:&lt;br /&gt;
* Audit-Log: Protokollierung, wer wann welche Änderung vorgenommen hat (Compliance, Nachvollziehbarkeit).&lt;br /&gt;
* Monitoring &amp;amp; Tracing: Metriken, Logs und Fehlerreporting für den laufenden Betrieb (z. B. über OpenTelemetry).&lt;br /&gt;
&lt;br /&gt;
=== Konfigurationsmanagement ===&lt;br /&gt;
Zentrale Steuerung systemweiter Einstellungen:&lt;br /&gt;
* Site-Settings: Globale Konfiguration wie Seitenname, Standardsprache, Zeitzone.&lt;br /&gt;
* Feature-Flags: Kontrolliertes Ein-/Ausschalten einzelner Funktionen ohne Redeploy.&lt;br /&gt;
&lt;br /&gt;
=== Deployment &amp;amp; Infrastructure ===&lt;br /&gt;
Betrifft Betrieb und Wartbarkeit des Systems:&lt;br /&gt;
* Migrations-Tooling: Versionierte Datenbank-Migrationen (z. B. via sqlx oder refinery).&lt;br /&gt;
* CI/CD: Automatisierte Tests und Deployments.&lt;br /&gt;
* Backup-Strategie: Regelmäßige Sicherung von Datenbank und Medien-Storage.&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Data_Engine&amp;diff=24</id>
		<title>Data Engine</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Data_Engine&amp;diff=24"/>
		<updated>2026-08-12T03:52:52Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Was ist eine Data Engine? ==&lt;br /&gt;
&lt;br /&gt;
Eine &#039;&#039;&#039;Data Engine&#039;&#039;&#039; (auch &#039;&#039;Query Engine&#039;&#039; oder &#039;&#039;Data Processing Engine&#039;&#039; genannt) ist die Softwareschicht, die dafür zuständig ist, Daten effizient zu &#039;&#039;&#039;speichern, zu lesen, zu transformieren und abzufragen&#039;&#039;&#039;. Sie bildet das Herzstück von Datenbanken, Analytics-Tools und Big-Data-Frameworks – von klassischen SQL-Datenbanken (PostgreSQL, SQLite) über analytische Systeme (ClickHouse, DuckDB) bis hin zu verteilten Big-Data-Plattformen (Apache Spark).&lt;br /&gt;
&lt;br /&gt;
Typischerweise besteht eine Data Engine aus folgenden Bausteinen:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Storage Layer&#039;&#039;&#039; – wie Daten physisch abgelegt werden (Row-basiert vs. Columnar, Kompression, Indizes)&lt;br /&gt;
# &#039;&#039;&#039;Query Parser &amp;amp; Planner&#039;&#039;&#039; – wandelt eine Anfrage (z. B. SQL oder eine DataFrame-API) in einen Ausführungsplan um&lt;br /&gt;
# &#039;&#039;&#039;Optimizer&#039;&#039;&#039; – verbessert den Plan (Predicate Pushdown, Projection Pushdown, Join-Reihenfolge, etc.)&lt;br /&gt;
# &#039;&#039;&#039;Execution Engine&#039;&#039;&#039; – führt den Plan aus und liefert Ergebnisse, oft vektorisiert oder parallelisiert&lt;br /&gt;
# &#039;&#039;&#039;Memory Management&#039;&#039;&#039; – effiziente Nutzung von RAM, oft mit Zero-Copy-Techniken&lt;br /&gt;
&lt;br /&gt;
== Warum eignet sich Rust besonders gut für Data Engines? ==&lt;br /&gt;
&lt;br /&gt;
In den letzten Jahren hat sich Rust als bevorzugte Sprache für neue Data-Engine-Projekte etabliert (Polars, Apache DataFusion, InfluxDB IOx, Qdrant, Meilisearch u. v. m.). Die Gründe dafür:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Performance auf C/C++-Niveau&#039;&#039;&#039;: Kein Garbage Collector, keine Laufzeit-Overheads – wichtig, wenn Millionen von Zeilen pro Sekunde verarbeitet werden.&lt;br /&gt;
* &#039;&#039;&#039;Speichersicherheit ohne GC&#039;&#039;&#039;: Das Ownership- und Borrow-Checker-Modell verhindert Data Races und Speicherfehler zur Compile-Zeit – entscheidend bei hochgradig parallelem Code.&lt;br /&gt;
* &#039;&#039;&#039;Fearless Concurrency&#039;&#039;&#039;: Multi-Threading (z. B. über [https://docs.rs/rayon rayon]) lässt sich sicher und ohne Angst vor Race Conditions umsetzen – essenziell für parallele Query-Ausführung.&lt;br /&gt;
* &#039;&#039;&#039;Exzellentes FFI (Foreign Function Interface)&#039;&#039;&#039;: Rust-Bibliotheken lassen sich leicht aus Python, Java, C++ etc. aufrufen (z. B. Polars als Python-Paket via PyO3), was die Integration in bestehende Data-Science-Stacks erleichtert.&lt;br /&gt;
* &#039;&#039;&#039;Starkes Ökosystem für Datenformate&#039;&#039;&#039;: Mit dem [https://arrow.apache.org/ Apache Arrow]-Ökosystem (&amp;lt;code&amp;gt;arrow-rs&amp;lt;/code&amp;gt;) existiert eine gemeinsame, spaltenorientierte In-Memory-Repräsentation, auf der viele Rust-Data-Engines aufbauen.&lt;br /&gt;
* &#039;&#039;&#039;Zero-Cost Abstractions&#039;&#039;&#039;: Hochlevel-Code (Iteratoren, Traits, Generics) wird zu genauso schnellem Maschinencode kompiliert wie handgeschriebenes Low-Level-C.&lt;br /&gt;
&lt;br /&gt;
== Apache Arrow: Das gemeinsame Fundament ==&lt;br /&gt;
&lt;br /&gt;
Viele Rust-Data-Engines nutzen &#039;&#039;&#039;Apache Arrow&#039;&#039;&#039; als In-Memory-Format. Arrow definiert ein spaltenorientiertes (&#039;&#039;columnar&#039;&#039;) Speicherlayout, das:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Cache-freundlich&#039;&#039;&#039; ist, da gleichartige Werte hintereinander im Speicher liegen&lt;br /&gt;
* &#039;&#039;&#039;SIMD-Vektorisierung&#039;&#039;&#039; ermöglicht (moderne CPUs können mehrere Werte gleichzeitig verarbeiten)&lt;br /&gt;
* &#039;&#039;&#039;Zero-Copy-Datenaustausch&#039;&#039;&#039; zwischen Prozessen/Sprachen erlaubt (z. B. zwischen Rust und Python ohne Serialisierung)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Row-basiert (klassisch):        Columnar (Arrow):&lt;br /&gt;
┌─────┬─────┬─────┐             ┌───────────────┐&lt;br /&gt;
│ id  │name │price│             │ id: [1,2,3]   │&lt;br /&gt;
├─────┼─────┼─────┤             ├───────────────┤&lt;br /&gt;
│  1  │ A   │ 9.9 │             │ name:[A,B,C]  │&lt;br /&gt;
│  2  │ B   │ 4.5 │             ├───────────────┤&lt;br /&gt;
│  3  │ C   │ 7.2 │             │ price:        │&lt;br /&gt;
└─────┴─────┴─────┘             │  [9.9,4.5,7.2]│&lt;br /&gt;
                                 └───────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für analytische Abfragen (z. B. &amp;lt;code&amp;gt;SUM(price) WHERE id &amp;gt; 1&amp;lt;/code&amp;gt;) ist das columnar-Layout deutlich effizienter, weil nur die relevanten Spalten aus dem Speicher gelesen werden müssen.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Data Engines in Rust ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Projekt !! Zweck !! Kurzbeschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[https://pola.rs/ Polars]&#039;&#039;&#039; || DataFrame-Engine || Pandas-ähnliche API, extrem schnell dank Lazy Evaluation, Query-Optimizer und Multi-Threading. Nutzt Arrow als Backend.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[https://datafusion.apache.org/ Apache DataFusion]&#039;&#039;&#039; || SQL-Query-Engine || Erweiterbares SQL-Framework, das als Baustein für eigene Datenbanken/Analytics-Tools genutzt werden kann.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[https://github.com/influxdata/influxdb_iox InfluxDB IOx]&#039;&#039;&#039; || Zeitreihen-Datenbank || Neue Storage-Engine von InfluxDB, komplett in Rust, basiert auf Arrow &amp;amp; DataFusion.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[https://duckdb.org/ DuckDB (Rust-Bindings)]&#039;&#039;&#039; || Embedded Analytics-DB || DuckDB selbst ist in C++, hat aber exzellente Rust-Bindings; oft als „SQLite für Analytics&amp;quot; bezeichnet.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[https://qdrant.tech/ Qdrant]&#039;&#039;&#039; || Vektor-Datenbank || Data Engine spezialisiert auf Vektor-Suche/Embeddings, z. B. für KI/RAG-Anwendungen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Architektur einer einfachen Data Engine (Konzept) ==&lt;br /&gt;
&lt;br /&gt;
Um das Zusammenspiel der Komponenten zu verstehen, hier ein vereinfachter Ablauf, wie eine Query verarbeitet wird – exemplarisch angelehnt an DataFusion/Polars:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   SQL / DataFrame-API&lt;br /&gt;
          │&lt;br /&gt;
          ▼&lt;br /&gt;
   ┌─────────────┐&lt;br /&gt;
   │   Parser    │  → erzeugt einen logischen Plan (AST)&lt;br /&gt;
   └─────────────┘&lt;br /&gt;
          │&lt;br /&gt;
          ▼&lt;br /&gt;
   ┌─────────────┐&lt;br /&gt;
   │  Optimizer  │  → Predicate/Projection Pushdown,&lt;br /&gt;
   └─────────────┘     Constant Folding, Join-Reordering&lt;br /&gt;
          │&lt;br /&gt;
          ▼&lt;br /&gt;
   ┌─────────────┐&lt;br /&gt;
   │  Physical   │  → wählt konkrete Ausführungsoperatoren&lt;br /&gt;
   │   Planner   │     (Hash-Join, Sort-Merge-Join, ...)&lt;br /&gt;
   └─────────────┘&lt;br /&gt;
          │&lt;br /&gt;
          ▼&lt;br /&gt;
   ┌─────────────┐&lt;br /&gt;
   │  Execution  │  → vektorisierte, parallele Ausführung&lt;br /&gt;
   │   Engine    │     über Arrow-RecordBatches&lt;br /&gt;
   └─────────────┘&lt;br /&gt;
          │&lt;br /&gt;
          ▼&lt;br /&gt;
       Ergebnis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Minimalbeispiel mit Polars ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;rust&amp;quot;&amp;gt;&lt;br /&gt;
use polars::prelude::*;&lt;br /&gt;
&lt;br /&gt;
fn main() -&amp;gt; PolarsResult&amp;lt;()&amp;gt; {&lt;br /&gt;
    // Lazy Query: wird erst beim .collect() tatsächlich ausgeführt&lt;br /&gt;
    let df = LazyCsvReader::new(&amp;quot;daten.csv&amp;quot;)&lt;br /&gt;
        .finish()?&lt;br /&gt;
        .filter(col(&amp;quot;price&amp;quot;).gt(lit(5.0)))&lt;br /&gt;
        .group_by([col(&amp;quot;category&amp;quot;)])&lt;br /&gt;
        .agg([col(&amp;quot;price&amp;quot;).sum().alias(&amp;quot;gesamt_umsatz&amp;quot;)])&lt;br /&gt;
        .sort(&amp;quot;gesamt_umsatz&amp;quot;, Default::default())&lt;br /&gt;
        .collect()?; // Optimizer plant &amp;amp; führt hier erst aus&lt;br /&gt;
&lt;br /&gt;
    println!(&amp;quot;{df}&amp;quot;);&lt;br /&gt;
    Ok(())&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtig ist hier das Prinzip der &#039;&#039;&#039;Lazy Evaluation&#039;&#039;&#039;: Statt jeden Schritt sofort auszuführen, baut Polars zunächst einen logischen Plan auf. Erst beim Aufruf von &amp;lt;code&amp;gt;.collect()&amp;lt;/code&amp;gt; wird dieser optimiert (z. B. wird der Filter so früh wie möglich angewendet, um weniger Daten zu verarbeiten) und dann parallel ausgeführt.&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung ==&lt;br /&gt;
&lt;br /&gt;
* Eine &#039;&#039;&#039;Data Engine&#039;&#039;&#039; verarbeitet Anfragen über Storage-, Planungs- und Ausführungsschichten hinweg.&lt;br /&gt;
* &#039;&#039;&#039;Rust&#039;&#039;&#039; bietet durch Speichersicherheit ohne GC, sichere Nebenläufigkeit und Zero-Cost-Abstraktionen ideale Voraussetzungen für performante, robuste Data Engines.&lt;br /&gt;
* &#039;&#039;&#039;Apache Arrow&#039;&#039;&#039; ist das gemeinsame columnar In-Memory-Format, auf dem viele moderne Rust-Data-Engines (Polars, DataFusion, InfluxDB IOx) aufbauen.&lt;br /&gt;
* Wer selbst experimentieren möchte, findet mit &#039;&#039;&#039;DataFusion&#039;&#039;&#039; einen guten Baukasten für eigene SQL-Engines und mit &#039;&#039;&#039;Polars&#039;&#039;&#039; eine ausgereifte, sofort nutzbare DataFrame-Engine.&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://arrow.apache.org/ Apache Arrow]&lt;br /&gt;
* [https://docs.pola.rs/ Polars Dokumentation]&lt;br /&gt;
* [https://datafusion.apache.org/ Apache DataFusion]&lt;br /&gt;
* [https://doc.rust-lang.org/book/ The Rust Programming Language Book]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Rust-Datenmodell für Drupal-Entities]]&lt;br /&gt;
* [[Rust-Datenmodell für Typo3]]&lt;br /&gt;
* [[XWiki Datenmodell (Rust) ]]&lt;br /&gt;
* [[MediaWiki – Datenmodell (Rust)]]&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=MediaWiki_%E2%80%93_Datenmodell_(Rust)&amp;diff=23</id>
		<title>MediaWiki – Datenmodell (Rust)</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=MediaWiki_%E2%80%93_Datenmodell_(Rust)&amp;diff=23"/>
		<updated>2026-08-12T03:40:04Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: Die Seite wurde neu angelegt: „ Dieses Dokument bildet das Kern-Datenmodell von &amp;#039;&amp;#039;&amp;#039;MediaWiki&amp;#039;&amp;#039;&amp;#039; (wie es z. B. Wikipedia zugrunde liegt) als Rust &amp;lt;code&amp;gt;struct&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;enum&amp;lt;/code&amp;gt; ab. Orientiert an den zentralen MediaWiki-DB-Tabellen (&amp;lt;code&amp;gt;page&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;revision&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;category&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pagelinks&amp;lt;/code&amp;gt;, …). Es ist nur das Modell – keine Business-Logik.  == Namespace ==  MediaWiki organisiert Seiten über feste, nummerierte…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Dieses Dokument bildet das Kern-Datenmodell von &#039;&#039;&#039;MediaWiki&#039;&#039;&#039; (wie es z. B. Wikipedia zugrunde liegt) als Rust &amp;lt;code&amp;gt;struct&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;enum&amp;lt;/code&amp;gt; ab. Orientiert an den zentralen MediaWiki-DB-Tabellen (&amp;lt;code&amp;gt;page&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;revision&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;category&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pagelinks&amp;lt;/code&amp;gt;, …). Es ist nur das Modell – keine Business-Logik.&lt;br /&gt;
&lt;br /&gt;
== Namespace ==&lt;br /&gt;
&lt;br /&gt;
MediaWiki organisiert Seiten über feste, nummerierte Namespaces (&amp;lt;code&amp;gt;page_namespace&amp;lt;/code&amp;gt; in der DB).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub enum Namespace {&lt;br /&gt;
    Media = -2,&lt;br /&gt;
    Special = -1,&lt;br /&gt;
    Main = 0,&lt;br /&gt;
    Talk = 1,&lt;br /&gt;
    User = 2,&lt;br /&gt;
    UserTalk = 3,&lt;br /&gt;
    Project = 4,&lt;br /&gt;
    ProjectTalk = 5,&lt;br /&gt;
    File = 6,&lt;br /&gt;
    FileTalk = 7,&lt;br /&gt;
    MediaWiki = 8,&lt;br /&gt;
    MediaWikiTalk = 9,&lt;br /&gt;
    Template = 10,&lt;br /&gt;
    TemplateTalk = 11,&lt;br /&gt;
    Help = 12,&lt;br /&gt;
    HelpTalk = 13,&lt;br /&gt;
    Category = 14,&lt;br /&gt;
    CategoryTalk = 15,&lt;br /&gt;
    Custom(i32),&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Page ==&lt;br /&gt;
&lt;br /&gt;
Entspricht der &amp;lt;code&amp;gt;page&amp;lt;/code&amp;gt;-Tabelle. Hält keinen Inhalt, sondern verweist auf die aktuellste Revision.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use chrono::{DateTime, Utc};&lt;br /&gt;
&lt;br /&gt;
pub type PageId = u64;&lt;br /&gt;
pub type RevisionId = u64;&lt;br /&gt;
pub type UserId = u64;&lt;br /&gt;
pub type TextId = u64;&lt;br /&gt;
&lt;br /&gt;
pub struct Page {&lt;br /&gt;
    pub page_id: PageId,&lt;br /&gt;
    pub namespace: Namespace,&lt;br /&gt;
    pub title: String,&lt;br /&gt;
    pub is_redirect: bool,&lt;br /&gt;
    pub is_new: bool,&lt;br /&gt;
    pub latest: RevisionId,&lt;br /&gt;
    pub len: u64,&lt;br /&gt;
    pub content_model: ContentModel,&lt;br /&gt;
    pub touched: DateTime&amp;lt;Utc&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub enum ContentModel {&lt;br /&gt;
    Wikitext,&lt;br /&gt;
    JsonContent,&lt;br /&gt;
    JavaScript,&lt;br /&gt;
    Css,&lt;br /&gt;
    Text,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Revision ==&lt;br /&gt;
&lt;br /&gt;
Entspricht der &amp;lt;code&amp;gt;revision&amp;lt;/code&amp;gt;-Tabelle. Jede Bearbeitung erzeugt eine neue, unveränderliche Revision; der eigentliche Text liegt separat in &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;slot&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub struct Revision {&lt;br /&gt;
    pub rev_id: RevisionId,&lt;br /&gt;
    pub page_id: PageId,&lt;br /&gt;
    pub parent_id: Option&amp;lt;RevisionId&amp;gt;,&lt;br /&gt;
    pub text_id: TextId,&lt;br /&gt;
    pub user: RevisionUser,&lt;br /&gt;
    pub comment: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub timestamp: DateTime&amp;lt;Utc&amp;gt;,&lt;br /&gt;
    pub minor_edit: bool,&lt;br /&gt;
    pub sha1: String,&lt;br /&gt;
    pub len: u64,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Angemeldeter User oder anonyme Bearbeitung per IP (wie in MediaWiki üblich).&lt;br /&gt;
pub enum RevisionUser {&lt;br /&gt;
    Registered(UserId),&lt;br /&gt;
    Anonymous { ip: String },&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Text (Content) ==&lt;br /&gt;
&lt;br /&gt;
Entspricht der &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt;-Tabelle bzw. modernem &amp;lt;code&amp;gt;content&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;slots&amp;lt;/code&amp;gt;-Schema.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub struct Text {&lt;br /&gt;
    pub old_id: TextId,&lt;br /&gt;
    pub content: String,&lt;br /&gt;
    pub flags: Vec&amp;lt;TextFlag&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub enum TextFlag {&lt;br /&gt;
    Gzip,&lt;br /&gt;
    Utf8,&lt;br /&gt;
    External,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== User ==&lt;br /&gt;
&lt;br /&gt;
Entspricht der &amp;lt;code&amp;gt;user&amp;lt;/code&amp;gt;-Tabelle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub struct User {&lt;br /&gt;
    pub user_id: UserId,&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub real_name: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub email: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub registration: DateTime&amp;lt;Utc&amp;gt;,&lt;br /&gt;
    pub edit_count: u64,&lt;br /&gt;
    pub groups: Vec&amp;lt;UserGroup&amp;gt;,&lt;br /&gt;
    pub blocked: Option&amp;lt;Block&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub enum UserGroup {&lt;br /&gt;
    User,&lt;br /&gt;
    Autoconfirmed,&lt;br /&gt;
    Bot,&lt;br /&gt;
    Sysop,&lt;br /&gt;
    Bureaucrat,&lt;br /&gt;
    Custom(String),&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub struct Block {&lt;br /&gt;
    pub reason: String,&lt;br /&gt;
    pub expiry: Option&amp;lt;DateTime&amp;lt;Utc&amp;gt;&amp;gt;,&lt;br /&gt;
    pub blocked_by: UserId,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Category ==&lt;br /&gt;
&lt;br /&gt;
Entspricht &amp;lt;code&amp;gt;category&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;categorylinks&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub struct Category {&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub page_count: u64,&lt;br /&gt;
    pub subcat_count: u64,&lt;br /&gt;
    pub file_count: u64,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub struct CategoryLink {&lt;br /&gt;
    pub page_id: PageId,&lt;br /&gt;
    pub category: String,&lt;br /&gt;
    pub sort_key: String,&lt;br /&gt;
    pub kind: CategoryLinkType,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub enum CategoryLinkType {&lt;br /&gt;
    Page,&lt;br /&gt;
    Subcat,&lt;br /&gt;
    File,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links (interne Verlinkung) ==&lt;br /&gt;
&lt;br /&gt;
Entspricht den Link-Tabellen &amp;lt;code&amp;gt;pagelinks&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;templatelinks&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;imagelinks&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;externallinks&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;langlinks&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;redirect&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub struct PageLink {&lt;br /&gt;
    pub from: PageId,&lt;br /&gt;
    pub to_namespace: Namespace,&lt;br /&gt;
    pub to_title: String,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub struct TemplateLink {&lt;br /&gt;
    pub from: PageId,&lt;br /&gt;
    pub template_namespace: Namespace,&lt;br /&gt;
    pub template_title: String,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub struct ImageLink {&lt;br /&gt;
    pub from: PageId,&lt;br /&gt;
    pub file_name: String,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub struct ExternalLink {&lt;br /&gt;
    pub from: PageId,&lt;br /&gt;
    pub url: String,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub struct LangLink {&lt;br /&gt;
    pub from: PageId,&lt;br /&gt;
    pub lang: String,&lt;br /&gt;
    pub title: String,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub struct Redirect {&lt;br /&gt;
    pub from: PageId,&lt;br /&gt;
    pub to_namespace: Namespace,&lt;br /&gt;
    pub to_title: String,&lt;br /&gt;
    pub fragment: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RecentChanges ==&lt;br /&gt;
&lt;br /&gt;
Entspricht &amp;lt;code&amp;gt;recentchanges&amp;lt;/code&amp;gt; – Ereignis-Log für Edits, Neuanlagen, Log-Aktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub struct RecentChange {&lt;br /&gt;
    pub rc_id: u64,&lt;br /&gt;
    pub timestamp: DateTime&amp;lt;Utc&amp;gt;,&lt;br /&gt;
    pub page_id: PageId,&lt;br /&gt;
    pub rev_id: Option&amp;lt;RevisionId&amp;gt;,&lt;br /&gt;
    pub user: RevisionUser,&lt;br /&gt;
    pub kind: RecentChangeType,&lt;br /&gt;
    pub comment: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub bot: bool,&lt;br /&gt;
    pub patrolled: bool,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub enum RecentChangeType {&lt;br /&gt;
    Edit,&lt;br /&gt;
    New,&lt;br /&gt;
    Log(LogAction),&lt;br /&gt;
    Categorize,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub enum LogAction {&lt;br /&gt;
    Delete,&lt;br /&gt;
    Move,&lt;br /&gt;
    Block,&lt;br /&gt;
    Protect,&lt;br /&gt;
    Upload,&lt;br /&gt;
    Merge,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Watchlist ==&lt;br /&gt;
&lt;br /&gt;
Entspricht &amp;lt;code&amp;gt;watchlist&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub struct WatchlistEntry {&lt;br /&gt;
    pub user_id: UserId,&lt;br /&gt;
    pub namespace: Namespace,&lt;br /&gt;
    pub title: String,&lt;br /&gt;
    pub notification_timestamp: Option&amp;lt;DateTime&amp;lt;Utc&amp;gt;&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beziehungen (Übersicht) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
User ──authors──▶ Revision ──belongs to──▶ Page ──in──▶ Namespace&lt;br /&gt;
  │                    │                       │&lt;br /&gt;
  │                    └──points to──▶ Text     ├──has many──▶ CategoryLink ──▶ Category&lt;br /&gt;
  │                                              ├──has many──▶ PageLink / TemplateLink / ImageLink&lt;br /&gt;
  └──has──▶ WatchlistEntry                       ├──may be──▶ Redirect&lt;br /&gt;
                                                  └──generates──▶ RecentChange&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Rust]]&lt;br /&gt;
[[Category:MediaWiki]]&lt;br /&gt;
[[Category:Datenmodell]]&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Data_Engine&amp;diff=22</id>
		<title>Data Engine</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Data_Engine&amp;diff=22"/>
		<updated>2026-08-12T03:37:09Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[Rust-Datenmodell für Drupal-Entities]]&lt;br /&gt;
* [[Rust-Datenmodell für Typo3]]&lt;br /&gt;
* [[XWiki Datenmodell (Rust) ]]&lt;br /&gt;
* [[MediaWiki – Datenmodell (Rust)]]&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Wiki.js_Rust-Datenmodell&amp;diff=21</id>
		<title>Wiki.js Rust-Datenmodell</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Wiki.js_Rust-Datenmodell&amp;diff=21"/>
		<updated>2026-08-12T02:44:50Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: Die Seite wurde neu angelegt: „ Dieses Dokument beschreibt ein reines Rust-Datenmodell (Structs/Enums, ohne externe Crates wie &amp;lt;code&amp;gt;serde&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sqlx&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;chrono&amp;lt;/code&amp;gt;) für das PostgreSQL-Schema von [https://github.com/requarks/wiki Wiki.js] (&amp;lt;code&amp;gt;server/models/*.js&amp;lt;/code&amp;gt; + Knex-Migrationen). Der vollständige Quelltext liegt in &amp;lt;code&amp;gt;wikijs_models.rs&amp;lt;/code&amp;gt;.  __TOC__  == Überblick ==  * Keine Abhängigkeiten — reine &amp;lt;code&amp;gt;std&amp;lt;/code&amp;gt;. * JSONB-Spalten werden…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Dieses Dokument beschreibt ein reines Rust-Datenmodell (Structs/Enums, ohne externe Crates wie &amp;lt;code&amp;gt;serde&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sqlx&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;chrono&amp;lt;/code&amp;gt;) für das PostgreSQL-Schema von [https://github.com/requarks/wiki Wiki.js] (&amp;lt;code&amp;gt;server/models/*.js&amp;lt;/code&amp;gt; + Knex-Migrationen). Der vollständige Quelltext liegt in &amp;lt;code&amp;gt;wikijs_models.rs&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Überblick ==&lt;br /&gt;
&lt;br /&gt;
* Keine Abhängigkeiten — reine &amp;lt;code&amp;gt;std&amp;lt;/code&amp;gt;.&lt;br /&gt;
* JSONB-Spalten werden als roher JSON-Text (&amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;) abgebildet — kein eigener JSON-Typ.&lt;br /&gt;
* Zeitstempel werden über den ebenfalls selbstgebauten Typ &amp;lt;code&amp;gt;Timestamp&amp;lt;/code&amp;gt; (Unix-Zeit in Sekunden) abgebildet (siehe [[#Timestamp]]).&lt;br /&gt;
* Enums bilden die in Wiki.js als String/Int gespeicherten &amp;quot;closed sets&amp;quot; ab (z. B. &amp;lt;code&amp;gt;contentType&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;kind&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Cargo.toml ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[dependencies]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Timestamp ==&lt;br /&gt;
&lt;br /&gt;
Einfacher Zeitstempel ohne externe Crates.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| 0 (Tupelfeld) || i64 || Unix-Zeit in Sekunden seit 1970-01-01 UTC&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pages ==&lt;br /&gt;
&lt;br /&gt;
=== Page ===&lt;br /&gt;
&lt;br /&gt;
Entspricht der Tabelle &amp;lt;code&amp;gt;pages&amp;lt;/code&amp;gt; — Kerntabelle für Wiki-Seiten.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || i32 || Primärschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| path || String || Seitenpfad&lt;br /&gt;
|-&lt;br /&gt;
| hash || String || Hash des Pfads (für Lookups)&lt;br /&gt;
|-&lt;br /&gt;
| title || String || Titel&lt;br /&gt;
|-&lt;br /&gt;
| description || String || Kurzbeschreibung&lt;br /&gt;
|-&lt;br /&gt;
| is_private || bool || private Sichtbarkeit&lt;br /&gt;
|-&lt;br /&gt;
| is_published || bool || veröffentlicht?&lt;br /&gt;
|-&lt;br /&gt;
| private_ns || Option&amp;amp;lt;String&amp;amp;gt; || private Namespace-Kennung&lt;br /&gt;
|-&lt;br /&gt;
| publish_start_date || Option&amp;amp;lt;Timestamp&amp;amp;gt; || Start des Veröffentlichungsfensters&lt;br /&gt;
|-&lt;br /&gt;
| publish_end_date || Option&amp;amp;lt;Timestamp&amp;amp;gt; || Ende des Veröffentlichungsfensters&lt;br /&gt;
|-&lt;br /&gt;
| content || String || Rohinhalt (Quelltext)&lt;br /&gt;
|-&lt;br /&gt;
| content_type || [[#ContentType]] || Editor-/Renderformat&lt;br /&gt;
|-&lt;br /&gt;
| render || Option&amp;amp;lt;String&amp;amp;gt; || gerenderter HTML-Output&lt;br /&gt;
|-&lt;br /&gt;
| toc || Option&amp;amp;lt;String&amp;amp;gt; || Inhaltsverzeichnis-Baum als roher JSON-Text&lt;br /&gt;
|-&lt;br /&gt;
| extra || Option&amp;amp;lt;String&amp;amp;gt; || beliebige Zusatzdaten als roher JSON-Text&lt;br /&gt;
|-&lt;br /&gt;
| editor_key || String || genutzter Editor&lt;br /&gt;
|-&lt;br /&gt;
| locale_code || String || Sprachcode&lt;br /&gt;
|-&lt;br /&gt;
| creator_id || i32 || erstellender Benutzer&lt;br /&gt;
|-&lt;br /&gt;
| author_id || i32 || letzter Bearbeiter&lt;br /&gt;
|-&lt;br /&gt;
| owner_id || i32 || Eigentümer&lt;br /&gt;
|-&lt;br /&gt;
| css || Option&amp;amp;lt;String&amp;amp;gt; || seitenspezifisches CSS&lt;br /&gt;
|-&lt;br /&gt;
| script_css || Option&amp;amp;lt;String&amp;amp;gt; || zusätzliches CSS (Skript-Editor)&lt;br /&gt;
|-&lt;br /&gt;
| script_js || Option&amp;amp;lt;String&amp;amp;gt; || zusätzliches JS (Skript-Editor)&lt;br /&gt;
|-&lt;br /&gt;
| created_at || Timestamp || Erstellungszeitpunkt&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp || letzte Änderung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== ContentType ===&lt;br /&gt;
&lt;br /&gt;
Editor/Rendering-Format einer Seite (&amp;lt;code&amp;gt;pages.contentType&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pageHistory.contentType&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Markdown&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Html&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Asciidoc&amp;lt;/code&amp;gt; — nicht mehr aktiv genutzt, aber historisch im Schema möglich&lt;br /&gt;
&lt;br /&gt;
=== PageHistory ===&lt;br /&gt;
&lt;br /&gt;
Entspricht der Tabelle &amp;lt;code&amp;gt;pageHistory&amp;lt;/code&amp;gt; — Versionsverlauf, gleiche Spalten wie [[#Page]] plus &amp;lt;code&amp;gt;action&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;version_date&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || i32 || Primärschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| page_id || i32 || zugehörige Seite&lt;br /&gt;
|-&lt;br /&gt;
| path || String || Seitenpfad zum Zeitpunkt der Version&lt;br /&gt;
|-&lt;br /&gt;
| hash || String || Hash des Pfads&lt;br /&gt;
|-&lt;br /&gt;
| title || String || Titel zum Zeitpunkt der Version&lt;br /&gt;
|-&lt;br /&gt;
| description || String || Kurzbeschreibung&lt;br /&gt;
|-&lt;br /&gt;
| is_private || bool || private Sichtbarkeit&lt;br /&gt;
|-&lt;br /&gt;
| content || String || Rohinhalt dieser Version&lt;br /&gt;
|-&lt;br /&gt;
| content_type || [[#ContentType]] || Editor-/Renderformat&lt;br /&gt;
|-&lt;br /&gt;
| render || Option&amp;amp;lt;String&amp;amp;gt; || gerenderter HTML-Output&lt;br /&gt;
|-&lt;br /&gt;
| toc || Option&amp;amp;lt;String&amp;amp;gt; || Inhaltsverzeichnis-Baum als roher JSON-Text&lt;br /&gt;
|-&lt;br /&gt;
| editor_key || String || genutzter Editor&lt;br /&gt;
|-&lt;br /&gt;
| locale_code || String || Sprachcode&lt;br /&gt;
|-&lt;br /&gt;
| action || [[#PageHistoryAction]] || Art der Änderung&lt;br /&gt;
|-&lt;br /&gt;
| version_date || Timestamp || Zeitpunkt der Version&lt;br /&gt;
|-&lt;br /&gt;
| author_id || i32 || Bearbeiter dieser Version&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== PageHistoryAction ===&lt;br /&gt;
&lt;br /&gt;
Art der historisierten Änderung (&amp;lt;code&amp;gt;pageHistory.action&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Initial&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Edit&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Delete&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Move&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Restore&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PageLink ===&lt;br /&gt;
&lt;br /&gt;
Entspricht der Tabelle &amp;lt;code&amp;gt;pageLinks&amp;lt;/code&amp;gt; — extrahierte Verlinkungen zwischen Seiten (für Broken-Link-Check).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || i32 || Primärschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| path || String || Ziel-Pfad des Links&lt;br /&gt;
|-&lt;br /&gt;
| locale_code || String || Sprachcode des Ziels&lt;br /&gt;
|-&lt;br /&gt;
| page_id || i32 || Quellseite des Links&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
&lt;br /&gt;
=== Tag ===&lt;br /&gt;
&lt;br /&gt;
Entspricht der Tabelle &amp;lt;code&amp;gt;tags&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || i32 || Primärschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| tag || String || Tag-Slug&lt;br /&gt;
|-&lt;br /&gt;
| title || Option&amp;amp;lt;String&amp;amp;gt; || Anzeigename&lt;br /&gt;
|-&lt;br /&gt;
| created_at || Timestamp || Erstellungszeitpunkt&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp || letzte Änderung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== PageTag ===&lt;br /&gt;
&lt;br /&gt;
Join-Tabelle &amp;lt;code&amp;gt;pageTags&amp;lt;/code&amp;gt; (n:m zwischen [[#Page]] und [[#Tag]]).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| page_id || i32 || FK auf [[#Page]]&lt;br /&gt;
|-&lt;br /&gt;
| tag_id || i32 || FK auf [[#Tag]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Users ==&lt;br /&gt;
&lt;br /&gt;
=== User ===&lt;br /&gt;
&lt;br /&gt;
Entspricht der Tabelle &amp;lt;code&amp;gt;users&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || i32 || Primärschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| email || String || E-Mail-Adresse&lt;br /&gt;
|-&lt;br /&gt;
| name || String || Anzeigename&lt;br /&gt;
|-&lt;br /&gt;
| provider || String || Modul-ID des Auth-Providers (z. B. &amp;quot;local&amp;quot;, &amp;quot;ldap&amp;quot;, &amp;quot;google&amp;quot;, &amp;quot;azure&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| provider_id || Option&amp;amp;lt;String&amp;amp;gt; || externe Provider-ID&lt;br /&gt;
|-&lt;br /&gt;
| provider_key || Option&amp;amp;lt;String&amp;amp;gt; || Provider-Schlüssel&lt;br /&gt;
|-&lt;br /&gt;
| password || Option&amp;amp;lt;String&amp;amp;gt; || bcrypt-Hash, nur bei provider == &amp;quot;local&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| tfa_is_active || bool || Zwei-Faktor-Auth aktiv?&lt;br /&gt;
|-&lt;br /&gt;
| tfa_secret || Option&amp;amp;lt;String&amp;amp;gt; || 2FA-Secret&lt;br /&gt;
|-&lt;br /&gt;
| job_title || Option&amp;amp;lt;String&amp;amp;gt; || Berufsbezeichnung&lt;br /&gt;
|-&lt;br /&gt;
| location || Option&amp;amp;lt;String&amp;amp;gt; || Standort&lt;br /&gt;
|-&lt;br /&gt;
| picture_url || Option&amp;amp;lt;String&amp;amp;gt; || Profilbild-URL&lt;br /&gt;
|-&lt;br /&gt;
| timezone || String || Zeitzone&lt;br /&gt;
|-&lt;br /&gt;
| date_format || String || bevorzugtes Datumsformat&lt;br /&gt;
|-&lt;br /&gt;
| appearance || String || UI-Theme-Einstellung&lt;br /&gt;
|-&lt;br /&gt;
| is_system || bool || Systembenutzer?&lt;br /&gt;
|-&lt;br /&gt;
| is_active || bool || Konto aktiv?&lt;br /&gt;
|-&lt;br /&gt;
| is_verified || bool || E-Mail verifiziert?&lt;br /&gt;
|-&lt;br /&gt;
| meta || Option&amp;amp;lt;String&amp;amp;gt; || beliebige Provider-spezifische Zusatzdaten als roher JSON-Text&lt;br /&gt;
|-&lt;br /&gt;
| last_login_at || Option&amp;amp;lt;Timestamp&amp;amp;gt; || letzter Login&lt;br /&gt;
|-&lt;br /&gt;
| created_at || Timestamp || Erstellungszeitpunkt&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp || letzte Änderung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== UserKeyKind ===&lt;br /&gt;
&lt;br /&gt;
Zweck eines temporären Tokens (&amp;lt;code&amp;gt;userKeys.kind&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Validation&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ResetPwd&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ChangeEmail&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Api&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== UserKey ===&lt;br /&gt;
&lt;br /&gt;
Entspricht der Tabelle &amp;lt;code&amp;gt;userKeys&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || i32 || Primärschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| kind || [[#UserKeyKind]] || Zweck des Tokens&lt;br /&gt;
|-&lt;br /&gt;
| token || String || Token-Wert&lt;br /&gt;
|-&lt;br /&gt;
| user_id || i32 || FK auf [[#User]]&lt;br /&gt;
|-&lt;br /&gt;
| expiration || Timestamp || Ablaufzeitpunkt&lt;br /&gt;
|-&lt;br /&gt;
| created_at || Timestamp || Erstellungszeitpunkt&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp || letzte Änderung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Groups ==&lt;br /&gt;
&lt;br /&gt;
=== Group ===&lt;br /&gt;
&lt;br /&gt;
Entspricht der Tabelle &amp;lt;code&amp;gt;groups&amp;lt;/code&amp;gt; — Rechte- und Gruppenverwaltung.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || i32 || Primärschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| name || String || Gruppenname&lt;br /&gt;
|-&lt;br /&gt;
| is_system || bool || Systemgruppe?&lt;br /&gt;
|-&lt;br /&gt;
| permissions || Vec&amp;amp;lt;[[#Permission]]&amp;amp;gt; || globale Rechte, z. B. [ReadPages, WritePages]&lt;br /&gt;
|-&lt;br /&gt;
| page_rules || Vec&amp;amp;lt;[[#PageRule]]&amp;amp;gt; || pfadbasierte Zugriffsregeln&lt;br /&gt;
|-&lt;br /&gt;
| created_at || Timestamp || Erstellungszeitpunkt&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp || letzte Änderung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== UserGroup ===&lt;br /&gt;
&lt;br /&gt;
Join-Tabelle &amp;lt;code&amp;gt;userGroups&amp;lt;/code&amp;gt; (n:m zwischen [[#User]] und [[#Group]]).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| user_id || i32 || FK auf [[#User]]&lt;br /&gt;
|-&lt;br /&gt;
| group_id || i32 || FK auf [[#Group]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Permission ===&lt;br /&gt;
&lt;br /&gt;
Bekannte globale Rechte, in &amp;lt;code&amp;gt;groups.permissions&amp;lt;/code&amp;gt; als String-Array (JSON) gespeichert.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ManageSystem&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ManageGroups&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ManageNavigation&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ManageTheme&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ManageApi&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ManageUsers&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ManagePages&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ReadPages&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ReadAssets&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ReadComments&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;WritePages&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;WriteAssets&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;WriteComments&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ManageComments&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;DeletePages&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;DeleteAssets&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;DeleteComments&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PageRule ===&lt;br /&gt;
&lt;br /&gt;
Ein Eintrag aus &amp;lt;code&amp;gt;groups.pageRules&amp;lt;/code&amp;gt; (JSONB-Array).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || String || Regel-ID&lt;br /&gt;
|-&lt;br /&gt;
| deny || bool || Regel verweigert (statt erlaubt)?&lt;br /&gt;
|-&lt;br /&gt;
| roles || Vec&amp;amp;lt;[[#Permission]]&amp;amp;gt; || betroffene Rechte&lt;br /&gt;
|-&lt;br /&gt;
| match (r#match) || [[#PageRuleMatch]] || Art des Pfad-Matchings&lt;br /&gt;
|-&lt;br /&gt;
| path || String || Pfad-Muster&lt;br /&gt;
|-&lt;br /&gt;
| locales || Vec&amp;amp;lt;String&amp;amp;gt; || betroffene Sprachcodes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== PageRuleMatch ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Start&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;End&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Regex&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Exact&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Tag&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
&lt;br /&gt;
=== Comment ===&lt;br /&gt;
&lt;br /&gt;
Entspricht der Tabelle &amp;lt;code&amp;gt;comments&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || i32 || Primärschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| content || String || Rohinhalt des Kommentars&lt;br /&gt;
|-&lt;br /&gt;
| render || String || gerenderter HTML-Output&lt;br /&gt;
|-&lt;br /&gt;
| name || String || angezeigter Name&lt;br /&gt;
|-&lt;br /&gt;
| email || String || E-Mail des Verfassers&lt;br /&gt;
|-&lt;br /&gt;
| ip || String || IP-Adresse des Verfassers&lt;br /&gt;
|-&lt;br /&gt;
| page_id || i32 || FK auf [[#Page]]&lt;br /&gt;
|-&lt;br /&gt;
| author_id || i32 || FK auf [[#User]]&lt;br /&gt;
|-&lt;br /&gt;
| created_at || Timestamp || Erstellungszeitpunkt&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp || letzte Änderung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Assets ==&lt;br /&gt;
&lt;br /&gt;
=== Asset ===&lt;br /&gt;
&lt;br /&gt;
Entspricht der Tabelle &amp;lt;code&amp;gt;assets&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || i32 || Primärschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| filename || String || Dateiname&lt;br /&gt;
|-&lt;br /&gt;
| ext || String || Dateiendung&lt;br /&gt;
|-&lt;br /&gt;
| kind || [[#AssetKind]] || Art der Datei&lt;br /&gt;
|-&lt;br /&gt;
| mime || String || MIME-Type&lt;br /&gt;
|-&lt;br /&gt;
| file_size || i64 || Dateigröße in Bytes&lt;br /&gt;
|-&lt;br /&gt;
| metadata || Option&amp;amp;lt;String&amp;amp;gt; || Zusatzmetadaten als roher JSON-Text&lt;br /&gt;
|-&lt;br /&gt;
| folder_id || Option&amp;amp;lt;i32&amp;amp;gt; || FK auf [[#AssetFolder]]&lt;br /&gt;
|-&lt;br /&gt;
| author_id || i32 || FK auf [[#User]]&lt;br /&gt;
|-&lt;br /&gt;
| created_at || Timestamp || Erstellungszeitpunkt&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp || letzte Änderung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== AssetKind ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Image&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Binary&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AssetFolder ===&lt;br /&gt;
&lt;br /&gt;
Entspricht der Tabelle &amp;lt;code&amp;gt;assetFolders&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || i32 || Primärschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| slug || String || URL-Slug&lt;br /&gt;
|-&lt;br /&gt;
| name || String || Anzeigename&lt;br /&gt;
|-&lt;br /&gt;
| parent_id || Option&amp;amp;lt;i32&amp;amp;gt; || übergeordneter Ordner (rekursiv)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== AssetData ===&lt;br /&gt;
&lt;br /&gt;
Binärdaten getrennt von den Metadaten gehalten (1:1 zu [[#Asset]]).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || i32 || FK/PK auf [[#Asset]]&lt;br /&gt;
|-&lt;br /&gt;
| data || Vec&amp;amp;lt;u8&amp;amp;gt; || Binärinhalt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Storage ==&lt;br /&gt;
&lt;br /&gt;
=== StorageTarget ===&lt;br /&gt;
&lt;br /&gt;
Sync-Status der konfigurierten Storage-Targets (Git, S3, ...), Tabelle &amp;lt;code&amp;gt;storage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || i32 || Primärschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| key || String || Target-Kennung (z. B. &amp;quot;git&amp;quot;, &amp;quot;s3&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| is_enabled || bool || aktiviert?&lt;br /&gt;
|-&lt;br /&gt;
| mode || [[#StorageMode]] || Sync-Richtung&lt;br /&gt;
|-&lt;br /&gt;
| config || String || provider-spezifische Konfiguration (als roher JSON-Text) (Repo-URL, Credentials-Ref, ...)&lt;br /&gt;
|-&lt;br /&gt;
| state || Option&amp;amp;lt;String&amp;amp;gt; || letzter bekannter Sync-Zustand (als roher JSON-Text)&lt;br /&gt;
|-&lt;br /&gt;
| sync_interval || Option&amp;amp;lt;String&amp;amp;gt; || Sync-Intervall&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== StorageMode ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Push&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Pull&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Sync&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Navigation ==&lt;br /&gt;
&lt;br /&gt;
=== NavigationTree ===&lt;br /&gt;
&lt;br /&gt;
Seitenbaum pro Locale, Tabelle &amp;lt;code&amp;gt;navigation&amp;lt;/code&amp;gt; (eine Zeile je Locale-Code).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || String || Locale-Code, z. B. &amp;quot;en&amp;quot; oder &amp;quot;de&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| config || Vec&amp;amp;lt;[[#NavigationItem]]&amp;amp;gt; || Navigationseinträge&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NavigationItem ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || String || Eintrags-ID&lt;br /&gt;
|-&lt;br /&gt;
| kind || [[#NavigationItemKind]] || Art des Eintrags&lt;br /&gt;
|-&lt;br /&gt;
| label || Option&amp;amp;lt;String&amp;amp;gt; || Anzeigetext&lt;br /&gt;
|-&lt;br /&gt;
| icon || Option&amp;amp;lt;String&amp;amp;gt; || Icon-Kennung&lt;br /&gt;
|-&lt;br /&gt;
| target_type || Option&amp;amp;lt;[[#NavigationTargetType]]&amp;amp;gt; || Ziel-Art&lt;br /&gt;
|-&lt;br /&gt;
| target || Option&amp;amp;lt;String&amp;amp;gt; || Ziel (Pfad/URL)&lt;br /&gt;
|-&lt;br /&gt;
| visibility_rules || Option&amp;amp;lt;Vec&amp;amp;lt;String&amp;amp;gt;&amp;amp;gt; || Sichtbarkeitsregeln&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NavigationItemKind ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Link&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Header&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Divider&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== NavigationTargetType ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Internal&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;External&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Locales ==&lt;br /&gt;
&lt;br /&gt;
=== Locale ===&lt;br /&gt;
&lt;br /&gt;
Entspricht der Tabelle &amp;lt;code&amp;gt;locales&amp;lt;/code&amp;gt; — installierte Sprachpakete.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| code || String || Sprachcode (Primärschlüssel)&lt;br /&gt;
|-&lt;br /&gt;
| strings || String || Übersetzungs-Strings (als roher JSON-Text)&lt;br /&gt;
|-&lt;br /&gt;
| is_rtl || bool || rechts-nach-links-Schrift?&lt;br /&gt;
|-&lt;br /&gt;
| name || String || englischer Name&lt;br /&gt;
|-&lt;br /&gt;
| native_name || String || einheimischer Name&lt;br /&gt;
|-&lt;br /&gt;
| created_at || Timestamp || Erstellungszeitpunkt&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp || letzte Änderung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== API Keys ==&lt;br /&gt;
&lt;br /&gt;
=== ApiKey ===&lt;br /&gt;
&lt;br /&gt;
Entspricht der Tabelle &amp;lt;code&amp;gt;apiKeys&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| id || i32 || Primärschlüssel&lt;br /&gt;
|-&lt;br /&gt;
| name || String || Bezeichnung&lt;br /&gt;
|-&lt;br /&gt;
| key || String || Schlüsselwert&lt;br /&gt;
|-&lt;br /&gt;
| expiration || Timestamp || Ablaufzeitpunkt&lt;br /&gt;
|-&lt;br /&gt;
| is_revoked || bool || widerrufen?&lt;br /&gt;
|-&lt;br /&gt;
| created_at || Timestamp || Erstellungszeitpunkt&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp || letzte Änderung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
=== Setting ===&lt;br /&gt;
&lt;br /&gt;
Generischer Key/Value-Store für Sitekonfiguration, Tabelle &amp;lt;code&amp;gt;settings&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| key || String || Einstellungsschlüssel (Primärschlüssel)&lt;br /&gt;
|-&lt;br /&gt;
| value || String || Wert (als roher JSON-Text)&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || Timestamp || letzte Änderung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Vollständiger Quelltext ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/// Einfacher Zeitstempel ohne externe Crates: Unix-Zeit in Sekunden seit&lt;br /&gt;
/// 1970-01-01 UTC.&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]&lt;br /&gt;
pub struct Timestamp(pub i64);&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct Page {&lt;br /&gt;
    pub id: i32,&lt;br /&gt;
    pub path: String,&lt;br /&gt;
    pub hash: String,&lt;br /&gt;
    pub title: String,&lt;br /&gt;
    pub description: String,&lt;br /&gt;
    pub is_private: bool,&lt;br /&gt;
    pub is_published: bool,&lt;br /&gt;
    pub private_ns: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub publish_start_date: Option&amp;lt;Timestamp&amp;gt;,&lt;br /&gt;
    pub publish_end_date: Option&amp;lt;Timestamp&amp;gt;,&lt;br /&gt;
    pub content: String,&lt;br /&gt;
    pub content_type: ContentType,&lt;br /&gt;
    pub render: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub toc: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub extra: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub editor_key: String,&lt;br /&gt;
    pub locale_code: String,&lt;br /&gt;
    pub creator_id: i32,&lt;br /&gt;
    pub author_id: i32,&lt;br /&gt;
    pub owner_id: i32,&lt;br /&gt;
    pub css: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub script_css: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub script_js: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub created_at: Timestamp,&lt;br /&gt;
    pub updated_at: Timestamp,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]&lt;br /&gt;
pub enum ContentType {&lt;br /&gt;
    Markdown,&lt;br /&gt;
    Html,&lt;br /&gt;
    Asciidoc,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct PageHistory {&lt;br /&gt;
    pub id: i32,&lt;br /&gt;
    pub page_id: i32,&lt;br /&gt;
    pub path: String,&lt;br /&gt;
    pub hash: String,&lt;br /&gt;
    pub title: String,&lt;br /&gt;
    pub description: String,&lt;br /&gt;
    pub is_private: bool,&lt;br /&gt;
    pub content: String,&lt;br /&gt;
    pub content_type: ContentType,&lt;br /&gt;
    pub render: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub toc: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub editor_key: String,&lt;br /&gt;
    pub locale_code: String,&lt;br /&gt;
    pub action: PageHistoryAction,&lt;br /&gt;
    pub version_date: Timestamp,&lt;br /&gt;
    pub author_id: i32,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]&lt;br /&gt;
pub enum PageHistoryAction {&lt;br /&gt;
    Initial,&lt;br /&gt;
    Edit,&lt;br /&gt;
    Delete,&lt;br /&gt;
    Move,&lt;br /&gt;
    Restore,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct PageLink {&lt;br /&gt;
    pub id: i32,&lt;br /&gt;
    pub path: String,&lt;br /&gt;
    pub locale_code: String,&lt;br /&gt;
    pub page_id: i32,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct Tag {&lt;br /&gt;
    pub id: i32,&lt;br /&gt;
    pub tag: String,&lt;br /&gt;
    pub title: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub created_at: Timestamp,&lt;br /&gt;
    pub updated_at: Timestamp,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct PageTag {&lt;br /&gt;
    pub page_id: i32,&lt;br /&gt;
    pub tag_id: i32,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct User {&lt;br /&gt;
    pub id: i32,&lt;br /&gt;
    pub email: String,&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub provider: String,&lt;br /&gt;
    pub provider_id: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub provider_key: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub password: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub tfa_is_active: bool,&lt;br /&gt;
    pub tfa_secret: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub job_title: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub location: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub picture_url: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub timezone: String,&lt;br /&gt;
    pub date_format: String,&lt;br /&gt;
    pub appearance: String,&lt;br /&gt;
    pub is_system: bool,&lt;br /&gt;
    pub is_active: bool,&lt;br /&gt;
    pub is_verified: bool,&lt;br /&gt;
    pub meta: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub last_login_at: Option&amp;lt;Timestamp&amp;gt;,&lt;br /&gt;
    pub created_at: Timestamp,&lt;br /&gt;
    pub updated_at: Timestamp,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]&lt;br /&gt;
pub enum UserKeyKind {&lt;br /&gt;
    Validation,&lt;br /&gt;
    ResetPwd,&lt;br /&gt;
    ChangeEmail,&lt;br /&gt;
    Api,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct UserKey {&lt;br /&gt;
    pub id: i32,&lt;br /&gt;
    pub kind: UserKeyKind,&lt;br /&gt;
    pub token: String,&lt;br /&gt;
    pub user_id: i32,&lt;br /&gt;
    pub expiration: Timestamp,&lt;br /&gt;
    pub created_at: Timestamp,&lt;br /&gt;
    pub updated_at: Timestamp,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct Group {&lt;br /&gt;
    pub id: i32,&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub is_system: bool,&lt;br /&gt;
    pub permissions: Vec&amp;lt;Permission&amp;gt;,&lt;br /&gt;
    pub page_rules: Vec&amp;lt;PageRule&amp;gt;,&lt;br /&gt;
    pub created_at: Timestamp,&lt;br /&gt;
    pub updated_at: Timestamp,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct UserGroup {&lt;br /&gt;
    pub user_id: i32,&lt;br /&gt;
    pub group_id: i32,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]&lt;br /&gt;
pub enum Permission {&lt;br /&gt;
    ManageSystem,&lt;br /&gt;
    ManageGroups,&lt;br /&gt;
    ManageNavigation,&lt;br /&gt;
    ManageTheme,&lt;br /&gt;
    ManageApi,&lt;br /&gt;
    ManageUsers,&lt;br /&gt;
    ManagePages,&lt;br /&gt;
    ReadPages,&lt;br /&gt;
    ReadAssets,&lt;br /&gt;
    ReadComments,&lt;br /&gt;
    WritePages,&lt;br /&gt;
    WriteAssets,&lt;br /&gt;
    WriteComments,&lt;br /&gt;
    ManageComments,&lt;br /&gt;
    DeletePages,&lt;br /&gt;
    DeleteAssets,&lt;br /&gt;
    DeleteComments,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct PageRule {&lt;br /&gt;
    pub id: String,&lt;br /&gt;
    pub deny: bool,&lt;br /&gt;
    pub roles: Vec&amp;lt;Permission&amp;gt;,&lt;br /&gt;
    pub r#match: PageRuleMatch,&lt;br /&gt;
    pub path: String,&lt;br /&gt;
    pub locales: Vec&amp;lt;String&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]&lt;br /&gt;
pub enum PageRuleMatch {&lt;br /&gt;
    Start,&lt;br /&gt;
    End,&lt;br /&gt;
    Regex,&lt;br /&gt;
    Exact,&lt;br /&gt;
    Tag,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct Comment {&lt;br /&gt;
    pub id: i32,&lt;br /&gt;
    pub content: String,&lt;br /&gt;
    pub render: String,&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub email: String,&lt;br /&gt;
    pub ip: String,&lt;br /&gt;
    pub page_id: i32,&lt;br /&gt;
    pub author_id: i32,&lt;br /&gt;
    pub created_at: Timestamp,&lt;br /&gt;
    pub updated_at: Timestamp,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct Asset {&lt;br /&gt;
    pub id: i32,&lt;br /&gt;
    pub filename: String,&lt;br /&gt;
    pub ext: String,&lt;br /&gt;
    pub kind: AssetKind,&lt;br /&gt;
    pub mime: String,&lt;br /&gt;
    pub file_size: i64,&lt;br /&gt;
    pub metadata: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub folder_id: Option&amp;lt;i32&amp;gt;,&lt;br /&gt;
    pub author_id: i32,&lt;br /&gt;
    pub created_at: Timestamp,&lt;br /&gt;
    pub updated_at: Timestamp,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]&lt;br /&gt;
pub enum AssetKind {&lt;br /&gt;
    Image,&lt;br /&gt;
    Binary,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct AssetFolder {&lt;br /&gt;
    pub id: i32,&lt;br /&gt;
    pub slug: String,&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub parent_id: Option&amp;lt;i32&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct AssetData {&lt;br /&gt;
    pub id: i32,&lt;br /&gt;
    pub data: Vec&amp;lt;u8&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct StorageTarget {&lt;br /&gt;
    pub id: i32,&lt;br /&gt;
    pub key: String,&lt;br /&gt;
    pub is_enabled: bool,&lt;br /&gt;
    pub mode: StorageMode,&lt;br /&gt;
    pub config: String,&lt;br /&gt;
    pub state: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub sync_interval: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]&lt;br /&gt;
pub enum StorageMode {&lt;br /&gt;
    Push,&lt;br /&gt;
    Pull,&lt;br /&gt;
    Sync,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct NavigationTree {&lt;br /&gt;
    pub id: String,&lt;br /&gt;
    pub config: Vec&amp;lt;NavigationItem&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct NavigationItem {&lt;br /&gt;
    pub id: String,&lt;br /&gt;
    pub kind: NavigationItemKind,&lt;br /&gt;
    pub label: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub icon: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub target_type: Option&amp;lt;NavigationTargetType&amp;gt;,&lt;br /&gt;
    pub target: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub visibility_rules: Option&amp;lt;Vec&amp;lt;String&amp;gt;&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]&lt;br /&gt;
pub enum NavigationItemKind {&lt;br /&gt;
    Link,&lt;br /&gt;
    Header,&lt;br /&gt;
    Divider,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]&lt;br /&gt;
pub enum NavigationTargetType {&lt;br /&gt;
    Internal,&lt;br /&gt;
    External,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct Locale {&lt;br /&gt;
    pub code: String,&lt;br /&gt;
    pub strings: String,&lt;br /&gt;
    pub is_rtl: bool,&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub native_name: String,&lt;br /&gt;
    pub created_at: Timestamp,&lt;br /&gt;
    pub updated_at: Timestamp,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct ApiKey {&lt;br /&gt;
    pub id: i32,&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub key: String,&lt;br /&gt;
    pub expiration: Timestamp,&lt;br /&gt;
    pub is_revoked: bool,&lt;br /&gt;
    pub created_at: Timestamp,&lt;br /&gt;
    pub updated_at: Timestamp,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct Setting {&lt;br /&gt;
    pub key: String,&lt;br /&gt;
    pub value: String,&lt;br /&gt;
    pub updated_at: Timestamp,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Rust]]&lt;br /&gt;
[[Category:Wiki.js]]&lt;br /&gt;
[[Category:Datenmodell]]&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Data_Engine&amp;diff=20</id>
		<title>Data Engine</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Data_Engine&amp;diff=20"/>
		<updated>2026-08-12T02:44:13Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* [[Rust-Datenmodell für Drupal-Entities]]&lt;br /&gt;
* [[Rust-Datenmodell für Typo3]]&lt;br /&gt;
* [[XWiki Datenmodell (Rust) ]]&lt;br /&gt;
* [[Wiki.js Rust-Datenmodell]]&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=XWiki_Datenmodell_(Rust)&amp;diff=19</id>
		<title>XWiki Datenmodell (Rust)</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=XWiki_Datenmodell_(Rust)&amp;diff=19"/>
		<updated>2026-08-12T02:22:32Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: Die Seite wurde neu angelegt: „ Dieses Datenmodell bildet den typischen Aufbau von &amp;#039;&amp;#039;&amp;#039;XWiki&amp;#039;&amp;#039;&amp;#039; in Rust ab, nur als &amp;lt;code&amp;gt;struct&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;enum&amp;lt;/code&amp;gt; (keine Logik):  &amp;#039;&amp;#039;&amp;#039;Wiki → Space → Document → Objects/Attachments/Revisions&amp;#039;&amp;#039;&amp;#039;  == Grundstruktur: Wiki, Space, Document ==  Eine XWiki-Instanz kann mehrere (Sub-)Wikis enthalten (Wiki-Farm).  &amp;lt;pre&amp;gt; struct Wiki {     id: String,              // z.B. &amp;quot;xwiki&amp;quot;     name: String,     description: String,     spaces: Vec&amp;lt;Space&amp;gt;,     is_m…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Dieses Datenmodell bildet den typischen Aufbau von &#039;&#039;&#039;XWiki&#039;&#039;&#039; in Rust ab, nur als &amp;lt;code&amp;gt;struct&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;enum&amp;lt;/code&amp;gt; (keine Logik):&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wiki → Space → Document → Objects/Attachments/Revisions&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Grundstruktur: Wiki, Space, Document ==&lt;br /&gt;
&lt;br /&gt;
Eine XWiki-Instanz kann mehrere (Sub-)Wikis enthalten (Wiki-Farm).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Wiki {&lt;br /&gt;
    id: String,              // z.B. &amp;quot;xwiki&amp;quot;&lt;br /&gt;
    name: String,&lt;br /&gt;
    description: String,&lt;br /&gt;
    spaces: Vec&amp;lt;Space&amp;gt;,&lt;br /&gt;
    is_main_wiki: bool,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Spaces sind hierarchisch (können verschachtelt sein).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Space {&lt;br /&gt;
    name: String,&lt;br /&gt;
    parent: Option&amp;lt;Box&amp;lt;Space&amp;gt;&amp;gt;,&lt;br /&gt;
    documents: Vec&amp;lt;Document&amp;gt;,&lt;br /&gt;
    subspaces: Vec&amp;lt;Space&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Dokument (Page) ist die zentrale Content-Einheit in XWiki.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Document {&lt;br /&gt;
    id: DocumentReference,&lt;br /&gt;
    title: String,&lt;br /&gt;
    content: String,&lt;br /&gt;
    syntax: Syntax,&lt;br /&gt;
    version: String,          // z.B. &amp;quot;1.3&amp;quot;&lt;br /&gt;
    revisions: Vec&amp;lt;Revision&amp;gt;,&lt;br /&gt;
    objects: Vec&amp;lt;XObject&amp;gt;,&lt;br /&gt;
    attachments: Vec&amp;lt;Attachment&amp;gt;,&lt;br /&gt;
    author: String,&lt;br /&gt;
    creator: String,&lt;br /&gt;
    creation_date: String,    // ggf. chrono::DateTime&amp;lt;Utc&amp;gt;&lt;br /&gt;
    last_modified: String,&lt;br /&gt;
    locale: String,&lt;br /&gt;
    parent: Option&amp;lt;DocumentReference&amp;gt;,&lt;br /&gt;
    tags: Vec&amp;lt;String&amp;gt;,&lt;br /&gt;
    hidden: bool,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eindeutige Referenz auf ein Dokument: &amp;lt;code&amp;gt;wiki:space.page&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct DocumentReference {&lt;br /&gt;
    wiki: String,&lt;br /&gt;
    spaces: Vec&amp;lt;String&amp;gt;,      // verschachtelte Space-Pfade&lt;br /&gt;
    page: String,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versionierung ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Revision {&lt;br /&gt;
    version: String,&lt;br /&gt;
    author: String,&lt;br /&gt;
    date: String,&lt;br /&gt;
    comment: String,&lt;br /&gt;
    minor_edit: bool,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Syntax / Rendering ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enum Syntax {&lt;br /&gt;
    XWiki20,&lt;br /&gt;
    XWiki21,&lt;br /&gt;
    Markdown11,&lt;br /&gt;
    Html5,&lt;br /&gt;
    Plain,&lt;br /&gt;
    Velocity,&lt;br /&gt;
    Other(String),&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== XClass / XObject / XProperty (das &amp;quot;strukturierte Daten&amp;quot;-System) ==&lt;br /&gt;
&lt;br /&gt;
Eine XClass definiert ein wiederverwendbares Datenschema (wie eine Klasse).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct XClass {&lt;br /&gt;
    reference: DocumentReference,&lt;br /&gt;
    properties: Vec&amp;lt;XProperty&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct XProperty {&lt;br /&gt;
    name: String,&lt;br /&gt;
    prop_type: PropertyType,&lt;br /&gt;
    pretty_name: String,&lt;br /&gt;
    mandatory: bool,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
enum PropertyType {&lt;br /&gt;
    StringProperty,&lt;br /&gt;
    TextAreaProperty,&lt;br /&gt;
    NumberProperty(NumberKind),&lt;br /&gt;
    BooleanProperty,&lt;br /&gt;
    DateProperty,&lt;br /&gt;
    ListProperty { values: Vec&amp;lt;String&amp;gt;, multi_select: bool },&lt;br /&gt;
    DBListProperty { query: String },&lt;br /&gt;
    PasswordProperty,&lt;br /&gt;
    EmailProperty,&lt;br /&gt;
    UsersProperty,&lt;br /&gt;
    GroupsProperty,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
enum NumberKind {&lt;br /&gt;
    Integer,&lt;br /&gt;
    Long,&lt;br /&gt;
    Float,&lt;br /&gt;
    Double,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein XObject ist eine Instanz einer XClass, an ein Dokument angehängt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct XObject {&lt;br /&gt;
    class_reference: DocumentReference,&lt;br /&gt;
    number: u32,               // Index, falls mehrere Objects gleicher Klasse&lt;br /&gt;
    properties: Vec&amp;lt;PropertyValue&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct PropertyValue {&lt;br /&gt;
    name: String,&lt;br /&gt;
    value: FieldValue,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
enum FieldValue {&lt;br /&gt;
    Text(String),&lt;br /&gt;
    Number(f64),&lt;br /&gt;
    Boolean(bool),&lt;br /&gt;
    Date(String),&lt;br /&gt;
    List(Vec&amp;lt;String&amp;gt;),&lt;br /&gt;
    Empty,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Attachments ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Attachment {&lt;br /&gt;
    filename: String,&lt;br /&gt;
    mime_type: String,&lt;br /&gt;
    size_bytes: u64,&lt;br /&gt;
    author: String,&lt;br /&gt;
    date: String,&lt;br /&gt;
    version: String,&lt;br /&gt;
    content_ref: String,       // Pfad/Handle zum Binärinhalt&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rechte / Sicherheit ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Right {&lt;br /&gt;
    level: RightLevel,&lt;br /&gt;
    entity: RightEntity,&lt;br /&gt;
    scope: RightScope,&lt;br /&gt;
    allow: bool,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
enum RightLevel {&lt;br /&gt;
    View,&lt;br /&gt;
    Edit,&lt;br /&gt;
    Comment,&lt;br /&gt;
    Delete,&lt;br /&gt;
    Admin,&lt;br /&gt;
    Register,&lt;br /&gt;
    ProgrammingRight,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
enum RightEntity {&lt;br /&gt;
    User(String),&lt;br /&gt;
    Group(String),&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
enum RightScope {&lt;br /&gt;
    Wiki(String),&lt;br /&gt;
    Space(String),&lt;br /&gt;
    Document(DocumentReference),&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Benutzer / Gruppen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct User {&lt;br /&gt;
    reference: DocumentReference,   // Users sind selbst Dokumente in XWiki.XWikiUsers&lt;br /&gt;
    username: String,&lt;br /&gt;
    email: String,&lt;br /&gt;
    groups: Vec&amp;lt;String&amp;gt;,&lt;br /&gt;
    active: bool,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct Group {&lt;br /&gt;
    reference: DocumentReference,&lt;br /&gt;
    members: Vec&amp;lt;String&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Wiki&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;Space&amp;lt;/code&amp;gt; (verschachtelbar) → &amp;lt;code&amp;gt;Document&amp;lt;/code&amp;gt; als Basis-Hierarchie&lt;br /&gt;
* &amp;lt;code&amp;gt;Document&amp;lt;/code&amp;gt; trägt Content (in einer &amp;lt;code&amp;gt;Syntax&amp;lt;/code&amp;gt;) &#039;&#039;&#039;und&#039;&#039;&#039; strukturierte Daten via &amp;lt;code&amp;gt;XObject&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;XClass&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;XProperty&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Attachment&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;Revision&amp;lt;/code&amp;gt; hängen am Dokument&lt;br /&gt;
* Rechte (&amp;lt;code&amp;gt;Right&amp;lt;/code&amp;gt;) sind granular auf Wiki/Space/Document-Ebene vergebbar&lt;br /&gt;
&lt;br /&gt;
[[Category:Rust]]&lt;br /&gt;
[[Category:XWiki]]&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Data_Engine&amp;diff=18</id>
		<title>Data Engine</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Data_Engine&amp;diff=18"/>
		<updated>2026-08-12T02:17:01Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* [[Rust-Datenmodell für Drupal-Entities]]&lt;br /&gt;
* [[Rust-Datenmodell für Typo3]]&lt;br /&gt;
* [[XWiki Datenmodell (Rust) ]]&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Rust-Datenmodell_f%C3%BCr_Typo3&amp;diff=17</id>
		<title>Rust-Datenmodell für Typo3</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Rust-Datenmodell_f%C3%BCr_Typo3&amp;diff=17"/>
		<updated>2026-08-12T01:39:34Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: Die Seite wurde neu angelegt: „== Überblick ==  Dieses Datenmodell bildet zentrale &amp;#039;&amp;#039;&amp;#039;TYPO3&amp;#039;&amp;#039;&amp;#039;-Konzepte als reine Rust-&amp;#039;&amp;#039;structs&amp;#039;&amp;#039; und &amp;#039;&amp;#039;enums&amp;#039;&amp;#039; ab: Seiten (&amp;lt;code&amp;gt;pages&amp;lt;/code&amp;gt;), Inhaltselemente (&amp;lt;code&amp;gt;tt_content&amp;lt;/code&amp;gt;), Sprachen, Workspaces, Benutzer und Datei-Referenzen. Es enthält &amp;#039;&amp;#039;&amp;#039;keine&amp;#039;&amp;#039;&amp;#039; Datenbank- oder API-Logik, sondern nur die Datenstrukturen selbst.  Der vollständige Quellcode liegt in der Datei &amp;lt;code&amp;gt;typo3_model.rs&amp;lt;/code&amp;gt;.  == Basistypen ==  Kleine Alias-Typen für lesb…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Überblick ==&lt;br /&gt;
&lt;br /&gt;
Dieses Datenmodell bildet zentrale &#039;&#039;&#039;TYPO3&#039;&#039;&#039;-Konzepte als reine Rust-&#039;&#039;structs&#039;&#039; und &#039;&#039;enums&#039;&#039; ab: Seiten (&amp;lt;code&amp;gt;pages&amp;lt;/code&amp;gt;), Inhaltselemente (&amp;lt;code&amp;gt;tt_content&amp;lt;/code&amp;gt;), Sprachen, Workspaces, Benutzer und Datei-Referenzen. Es enthält &#039;&#039;&#039;keine&#039;&#039;&#039; Datenbank- oder API-Logik, sondern nur die Datenstrukturen selbst.&lt;br /&gt;
&lt;br /&gt;
Der vollständige Quellcode liegt in der Datei &amp;lt;code&amp;gt;typo3_model.rs&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Basistypen ==&lt;br /&gt;
&lt;br /&gt;
Kleine Alias-Typen für lesbarere Signaturen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Typ !! Rust-Definition !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Uid&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;u64&amp;lt;/code&amp;gt; || Eindeutige Datensatz-ID (TYPO3: immer positiv)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Pid&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;i64&amp;lt;/code&amp;gt; || Seiten-/Storage-ID; 0 = Root&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LanguageUid&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;i32&amp;lt;/code&amp;gt; || Sprach-UID; -1 = alle Sprachen, 0 = Standardsprache&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ColPos&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;i32&amp;lt;/code&amp;gt; || Spaltenposition im Backend-Layout (0 = Main, 1 = Sidebar, …)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Enums ==&lt;br /&gt;
&lt;br /&gt;
=== Doktype ===&lt;br /&gt;
&lt;br /&gt;
Seitentyp (&amp;lt;code&amp;gt;doktype&amp;lt;/code&amp;gt;-Feld der Tabelle &amp;lt;code&amp;gt;pages&amp;lt;/code&amp;gt;), bestimmt das Frontend-Verhalten einer Seite.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub enum Doktype {&lt;br /&gt;
    Standard = 1,&lt;br /&gt;
    Link = 3,&lt;br /&gt;
    Shortcut = 4,&lt;br /&gt;
    BackendUserSection = 6,&lt;br /&gt;
    MountPoint = 7,&lt;br /&gt;
    Spacer = 199,&lt;br /&gt;
    Sysfolder = 254,&lt;br /&gt;
    Recycler = 255,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CType ===&lt;br /&gt;
&lt;br /&gt;
Inhaltstyp (&amp;lt;code&amp;gt;CType&amp;lt;/code&amp;gt;-Feld der Tabelle &amp;lt;code&amp;gt;tt_content&amp;lt;/code&amp;gt;). Deckt die Core-Typen ab; &amp;lt;code&amp;gt;Plugin&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;Other&amp;lt;/code&amp;gt; fangen Extension-/Plugin-Inhalte auf.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub enum CType {&lt;br /&gt;
    Header,&lt;br /&gt;
    Text,&lt;br /&gt;
    Textmedia,&lt;br /&gt;
    Image,&lt;br /&gt;
    Bullets,&lt;br /&gt;
    Table,&lt;br /&gt;
    Uploads,&lt;br /&gt;
    Html,&lt;br /&gt;
    Plugin { list_type: String },&lt;br /&gt;
    Other(String),&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== WorkspaceStage ===&lt;br /&gt;
&lt;br /&gt;
Freigabestatus eines Datensatzes innerhalb eines Workspace.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub enum WorkspaceStage {&lt;br /&gt;
    Editing,&lt;br /&gt;
    ReadyToPublish,&lt;br /&gt;
    ReadyToPreview,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Record ===&lt;br /&gt;
&lt;br /&gt;
Getaggter Wrapper, um Datensätze unterschiedlichen Typs (z. B. in Suchergebnislisten) einheitlich zu behandeln.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub enum Record {&lt;br /&gt;
    Page(Page),&lt;br /&gt;
    Content(ContentElement),&lt;br /&gt;
    File(FileReference),&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Structs ==&lt;br /&gt;
&lt;br /&gt;
=== Visibility ===&lt;br /&gt;
&lt;br /&gt;
Wiederverwendbare Sichtbarkeits-/Zeitsteuerung, wie sie in TYPO3 auf fast jedem Datensatz-Typ vorkommt.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;hidden&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt; || Datensatz manuell ausgeblendet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;deleted&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt; || Datensatz (soft-)gelöscht&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;starttime&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;i64&amp;lt;/code&amp;gt; || Unix-Timestamp ab Sichtbarkeit (0 = sofort)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;endtime&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;i64&amp;lt;/code&amp;gt; || Unix-Timestamp bis Sichtbarkeit (0 = unbegrenzt)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;fe_groups&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Vec&amp;lt;Uid&amp;gt;&amp;lt;/code&amp;gt; || Frontend-Gruppen mit Zugriff (leer = öffentlich)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Localization ===&lt;br /&gt;
&lt;br /&gt;
Lokalisierungs-Beziehung eines Datensatzes (Connected Mode).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feld !! Typ !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sys_language_uid&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;LanguageUid&amp;lt;/code&amp;gt; || Sprache dieses Datensatzes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;l10n_parent&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Option&amp;lt;Uid&amp;gt;&amp;lt;/code&amp;gt; || uid des Originals in der Standardsprache&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Page ===&lt;br /&gt;
&lt;br /&gt;
Eine TYPO3-Seite (Tabelle &amp;lt;code&amp;gt;pages&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub struct Page {&lt;br /&gt;
    pub uid: Uid,&lt;br /&gt;
    pub pid: Pid,&lt;br /&gt;
    pub doktype: Doktype,&lt;br /&gt;
    pub title: String,&lt;br /&gt;
    pub slug: String,&lt;br /&gt;
    pub sorting: i64,&lt;br /&gt;
    pub nav_title: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub is_siteroot: bool,&lt;br /&gt;
    pub visibility: Visibility,&lt;br /&gt;
    pub localization: Localization,&lt;br /&gt;
    pub content_elements: Vec&amp;lt;ContentElement&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ContentElement ===&lt;br /&gt;
&lt;br /&gt;
Ein Inhaltselement (Tabelle &amp;lt;code&amp;gt;tt_content&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub struct ContentElement {&lt;br /&gt;
    pub uid: Uid,&lt;br /&gt;
    pub pid: Pid,&lt;br /&gt;
    pub ctype: CType,&lt;br /&gt;
    pub col_pos: ColPos,&lt;br /&gt;
    pub sorting: i64,&lt;br /&gt;
    pub header: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub bodytext: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub visibility: Visibility,&lt;br /&gt;
    pub localization: Localization,&lt;br /&gt;
    pub media: Vec&amp;lt;FileReference&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FileReference ===&lt;br /&gt;
&lt;br /&gt;
Datei-Referenz (Tabelle &amp;lt;code&amp;gt;sys_file_reference&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub struct FileReference {&lt;br /&gt;
    pub uid: Uid,&lt;br /&gt;
    pub file_uid: Uid,&lt;br /&gt;
    pub title: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub alternative: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub description: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub sorting: i64,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SysLanguage ===&lt;br /&gt;
&lt;br /&gt;
Sprachdefinition (Tabelle &amp;lt;code&amp;gt;sys_language&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub struct SysLanguage {&lt;br /&gt;
    pub uid: LanguageUid,&lt;br /&gt;
    pub title: String,&lt;br /&gt;
    pub language_iso_code: String,&lt;br /&gt;
    pub flag_identifier: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Workspace ===&lt;br /&gt;
&lt;br /&gt;
Ein Workspace (Tabelle &amp;lt;code&amp;gt;sys_workspace&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub struct Workspace {&lt;br /&gt;
    pub uid: Uid,&lt;br /&gt;
    pub title: String,&lt;br /&gt;
    pub stage: WorkspaceStage,&lt;br /&gt;
    pub members: Vec&amp;lt;Uid&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BackendUser / FrontendUser ===&lt;br /&gt;
&lt;br /&gt;
Benutzerkonten aus &amp;lt;code&amp;gt;be_users&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;fe_users&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub struct BackendUser {&lt;br /&gt;
    pub uid: Uid,&lt;br /&gt;
    pub username: String,&lt;br /&gt;
    pub is_admin: bool,&lt;br /&gt;
    pub usergroups: Vec&amp;lt;Uid&amp;gt;,&lt;br /&gt;
    pub disable: bool,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub struct FrontendUser {&lt;br /&gt;
    pub uid: Uid,&lt;br /&gt;
    pub username: String,&lt;br /&gt;
    pub usergroups: Vec&amp;lt;Uid&amp;gt;,&lt;br /&gt;
    pub visibility: Visibility,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beziehungen zwischen den Typen ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Page&#039;&#039;&#039; enthält mehrere &#039;&#039;&#039;ContentElement&#039;&#039;&#039;s (&amp;lt;code&amp;gt;content_elements&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &#039;&#039;&#039;ContentElement&#039;&#039;&#039; enthält mehrere &#039;&#039;&#039;FileReference&#039;&#039;&#039;s (&amp;lt;code&amp;gt;media&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &#039;&#039;&#039;Page&#039;&#039;&#039; und &#039;&#039;&#039;ContentElement&#039;&#039;&#039; nutzen beide &#039;&#039;&#039;Visibility&#039;&#039;&#039; und &#039;&#039;&#039;Localization&#039;&#039;&#039; als eingebettete structs&lt;br /&gt;
* &#039;&#039;&#039;Record&#039;&#039;&#039; fasst &#039;&#039;&#039;Page&#039;&#039;&#039;, &#039;&#039;&#039;ContentElement&#039;&#039;&#039; und &#039;&#039;&#039;FileReference&#039;&#039;&#039; als Summentyp zusammen&lt;br /&gt;
* &#039;&#039;&#039;Workspace&#039;&#039;&#039; referenziert &#039;&#039;&#039;BackendUser&#039;&#039;&#039;s über &amp;lt;code&amp;gt;members&amp;lt;/code&amp;gt; (nur als &amp;lt;code&amp;gt;Uid&amp;lt;/code&amp;gt;, keine Einbettung)&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[MCP-Server]]&lt;br /&gt;
* [[TYPO3]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Rust]]&lt;br /&gt;
[[Kategorie:TYPO3]]&lt;br /&gt;
[[Kategorie:Datenmodell]]&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Data_Engine&amp;diff=16</id>
		<title>Data Engine</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Data_Engine&amp;diff=16"/>
		<updated>2026-08-12T01:39:27Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* [[Rust-Datenmodell für Drupal-Entities]]&lt;br /&gt;
* [[Rust-Datenmodell für Typo3]]&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Data_Engine&amp;diff=15</id>
		<title>Data Engine</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Data_Engine&amp;diff=15"/>
		<updated>2026-08-12T01:24:37Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: Der Seiteninhalt wurde durch einen anderen Text ersetzt: „ * Rust-Datenmodell für Drupal-Entities“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* [[Rust-Datenmodell für Drupal-Entities]]&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Rust-Datenmodell_f%C3%BCr_Drupal-Entities&amp;diff=14</id>
		<title>Rust-Datenmodell für Drupal-Entities</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Rust-Datenmodell_f%C3%BCr_Drupal-Entities&amp;diff=14"/>
		<updated>2026-08-12T01:20:46Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: Die Seite wurde neu angelegt: „== Übersicht ==  Dieser Artikel dokumentiert ein Rust-Datenmodell, das die zentralen Entity-Konzepte von Drupal (Node, User, Taxonomy Term, Media, Paragraph) als &amp;lt;pre&amp;gt;struct&amp;lt;/pre&amp;gt;/&amp;lt;pre&amp;gt;enum&amp;lt;/pre&amp;gt;-Typen abbildet. Das Modell enthält bewusst &amp;#039;&amp;#039;&amp;#039;keine Logik&amp;#039;&amp;#039;&amp;#039; (keine &amp;lt;pre&amp;gt;impl&amp;lt;/pre&amp;gt;-Methoden) – es dient als reine Datenrepräsentation. Eine (De-)Serialisierung (z. B. mit [https://serde.rs/ serde] für Drupal-JSON:API-Antworten) ist bewusst noch nicht Teil…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übersicht ==&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel dokumentiert ein Rust-Datenmodell, das die zentralen&lt;br /&gt;
Entity-Konzepte von Drupal (Node, User, Taxonomy Term, Media, Paragraph)&lt;br /&gt;
als &amp;lt;pre&amp;gt;struct&amp;lt;/pre&amp;gt;/&amp;lt;pre&amp;gt;enum&amp;lt;/pre&amp;gt;-Typen abbildet. Das Modell enthält bewusst &#039;&#039;&#039;keine&lt;br /&gt;
Logik&#039;&#039;&#039; (keine &amp;lt;pre&amp;gt;impl&amp;lt;/pre&amp;gt;-Methoden) – es dient als reine Datenrepräsentation.&lt;br /&gt;
Eine (De-)Serialisierung (z. B. mit [https://serde.rs/ serde] für&lt;br /&gt;
Drupal-JSON:API-Antworten) ist bewusst noch nicht Teil dieses Modells&lt;br /&gt;
und folgt in einem späteren Schritt.&lt;br /&gt;
&lt;br /&gt;
== Motivation ==&lt;br /&gt;
&lt;br /&gt;
Drupal modelliert Inhalte über ein generisches Entity-System:&lt;br /&gt;
* &#039;&#039;&#039;Entity-Typen&#039;&#039;&#039; (&amp;lt;pre&amp;gt;node&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;user&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;taxonomy_term&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;media&amp;lt;/pre&amp;gt;, …) definieren die grundlegende Art eines Objekts.&lt;br /&gt;
* &#039;&#039;&#039;Bundles&#039;&#039;&#039; (bei Nodes „Content Types&amp;quot; genannt, z. B. &amp;lt;pre&amp;gt;article&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;page&amp;lt;/pre&amp;gt;) spezialisieren einen Entity-Typ.&lt;br /&gt;
* &#039;&#039;&#039;Felder&#039;&#039;&#039; (&amp;lt;pre&amp;gt;field_*&amp;lt;/pre&amp;gt;) sind pro Bundle konfigurierbar, typisiert und können einfach- oder mehrwertig (Kardinalität) sein.&lt;br /&gt;
&lt;br /&gt;
Um mit einem Drupal-Backend aus Rust heraus zu arbeiten, braucht man&lt;br /&gt;
typisierte Gegenstücke zu diesen Konzepten. Das hier beschriebene&lt;br /&gt;
Modell bildet diese Struktur 1:1 in Rust ab.&lt;br /&gt;
&lt;br /&gt;
== Grundtypen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone, PartialEq, Eq)]&lt;br /&gt;
pub enum EntityType {&lt;br /&gt;
    Node,&lt;br /&gt;
    User,&lt;br /&gt;
    TaxonomyTerm,&lt;br /&gt;
    Media,&lt;br /&gt;
    Paragraph,&lt;br /&gt;
    File,&lt;br /&gt;
    Menu,&lt;br /&gt;
    Block,&lt;br /&gt;
    Custom(String),&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]&lt;br /&gt;
pub enum PublishStatus {&lt;br /&gt;
    Published,&lt;br /&gt;
    Unpublished,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub type LangCode = String;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EntityType&amp;lt;/pre&amp;gt; bildet die von Drupal vordefinierten Entity-Typen ab; der&lt;br /&gt;
&amp;lt;pre&amp;gt;Custom&amp;lt;/pre&amp;gt;-Zweig deckt eigene, per Modul definierte Entity-Typen ab, ohne&lt;br /&gt;
das Enum ändern zu müssen.&lt;br /&gt;
&lt;br /&gt;
== Feldwerte: &amp;lt;pre&amp;gt;FieldValue&amp;lt;/pre&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Drupal-Felder sind stark typisiert (Text, Zahl, Datum, Referenz, Bild, …).&lt;br /&gt;
Dies wird über ein Enum mit Payload pro Variante abgebildet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub enum FieldValue {&lt;br /&gt;
    Text(String),&lt;br /&gt;
    TextLong { value: String, format: Option&amp;lt;String&amp;gt; },&lt;br /&gt;
    Integer(i64),&lt;br /&gt;
    Decimal(f64),&lt;br /&gt;
    Boolean(bool),&lt;br /&gt;
    DateTime(DateTime&amp;lt;Utc&amp;gt;),&lt;br /&gt;
    Email(String),&lt;br /&gt;
    Link { uri: String, title: Option&amp;lt;String&amp;gt; },&lt;br /&gt;
    EntityReference { target_id: u64, target_type: EntityType },&lt;br /&gt;
    Image {&lt;br /&gt;
        target_id: u64,&lt;br /&gt;
        alt: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
        title: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
        width: Option&amp;lt;u32&amp;gt;,&lt;br /&gt;
        height: Option&amp;lt;u32&amp;gt;,&lt;br /&gt;
    },&lt;br /&gt;
    List(Vec&amp;lt;FieldValue&amp;gt;),&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub type FieldMap = HashMap&amp;lt;String, FieldValue&amp;gt;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;pre&amp;gt;List(Vec&amp;lt;FieldValue&amp;gt;)&amp;lt;/pre&amp;gt; bildet mehrwertige Felder ab (Kardinalität &amp;gt; 1).&lt;br /&gt;
* &amp;lt;pre&amp;gt;FieldMap&amp;lt;/pre&amp;gt; ist die generische Ablage für alle &amp;lt;pre&amp;gt;field_*&amp;lt;/pre&amp;gt;-Werte eines Bundles, adressiert über den Feldmaschinennamen (z. B. &amp;lt;pre&amp;gt;field_tags&amp;lt;/pre&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Entity-Typen im Detail ==&lt;br /&gt;
&lt;br /&gt;
=== Gemeinsame Basis ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct EntityBase {&lt;br /&gt;
    pub id: u64,&lt;br /&gt;
    pub uuid: Uuid,&lt;br /&gt;
    pub entity_type: EntityType,&lt;br /&gt;
    pub bundle: String,&lt;br /&gt;
    pub langcode: LangCode,&lt;br /&gt;
    pub created: DateTime&amp;lt;Utc&amp;gt;,&lt;br /&gt;
    pub changed: DateTime&amp;lt;Utc&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EntityBase&amp;lt;/pre&amp;gt; fasst Eigenschaften zusammen, die praktisch jede&lt;br /&gt;
Content-Entity in Drupal besitzt, und wird per Komposition in konkrete&lt;br /&gt;
Entity-Structs eingebettet (siehe &amp;lt;pre&amp;gt;Node&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;Media&amp;lt;/pre&amp;gt;). Beim späteren&lt;br /&gt;
Ergänzen von serde bietet sich dafür &amp;lt;pre&amp;gt;#[serde(flatten)]&amp;lt;/pre&amp;gt; an, damit die&lt;br /&gt;
Felder von &amp;lt;pre&amp;gt;EntityBase&amp;lt;/pre&amp;gt; beim (De-)Serialisieren auf derselben Ebene&lt;br /&gt;
wie die restlichen Felder erscheinen.&lt;br /&gt;
&lt;br /&gt;
=== Node ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct Node {&lt;br /&gt;
    pub base: EntityBase,&lt;br /&gt;
    pub title: String,&lt;br /&gt;
    pub status: PublishStatus,&lt;br /&gt;
    pub author_id: u64,&lt;br /&gt;
    pub fields: FieldMap,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== User ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct User {&lt;br /&gt;
    pub id: u64,&lt;br /&gt;
    pub uuid: Uuid,&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub mail: String,&lt;br /&gt;
    pub status: bool,&lt;br /&gt;
    pub roles: Vec&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub created: DateTime&amp;lt;Utc&amp;gt;,&lt;br /&gt;
    pub fields: FieldMap,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;User&amp;lt;/pre&amp;gt; nutzt bewusst kein &amp;lt;pre&amp;gt;EntityBase&amp;lt;/pre&amp;gt;, da User-Entities in Drupal kein&lt;br /&gt;
&amp;lt;pre&amp;gt;bundle&amp;lt;/pre&amp;gt;/&amp;lt;pre&amp;gt;langcode&amp;lt;/pre&amp;gt; im klassischen Sinn besitzen und stattdessen&lt;br /&gt;
&amp;lt;pre&amp;gt;roles&amp;lt;/pre&amp;gt; und einen einfachen &amp;lt;pre&amp;gt;status: bool&amp;lt;/pre&amp;gt; (aktiv/blockiert) haben.&lt;br /&gt;
&lt;br /&gt;
=== TaxonomyTerm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct TaxonomyTerm {&lt;br /&gt;
    pub id: u64,&lt;br /&gt;
    pub uuid: Uuid,&lt;br /&gt;
    pub vocabulary: String,&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub description: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub parent_id: Option&amp;lt;u64&amp;gt;,&lt;br /&gt;
    pub weight: i32,&lt;br /&gt;
    pub fields: FieldMap,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bildet Taxonomiebegriffe inkl. hierarchischer Eltern-Referenz&lt;br /&gt;
(&amp;lt;pre&amp;gt;parent_id&amp;lt;/pre&amp;gt;) und Sortiergewicht (&amp;lt;pre&amp;gt;weight&amp;lt;/pre&amp;gt;) ab.&lt;br /&gt;
&lt;br /&gt;
=== Media &amp;amp; Paragraph ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct Media {&lt;br /&gt;
    pub base: EntityBase,&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub fields: FieldMap,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct Paragraph {&lt;br /&gt;
    pub id: u64,&lt;br /&gt;
    pub uuid: Uuid,&lt;br /&gt;
    pub bundle: String,&lt;br /&gt;
    pub fields: FieldMap,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Paragraph&amp;lt;/pre&amp;gt; ist bewusst schlank gehalten, da Paragraphs in Drupal keine&lt;br /&gt;
eigenständigen, direkt aufrufbaren Entities mit URL/Alias sind, sondern&lt;br /&gt;
stets über eine Host-Entity referenziert werden.&lt;br /&gt;
&lt;br /&gt;
== Schema-Introspektion (optional) ==&lt;br /&gt;
&lt;br /&gt;
Für Anwendungsfälle, in denen Feld- und Bundle-Definitionen selbst&lt;br /&gt;
(nicht nur Werte) abgebildet werden müssen – etwa um ein Drupal-Schema&lt;br /&gt;
zu spiegeln oder Formulare dynamisch zu generieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]&lt;br /&gt;
pub enum Cardinality {&lt;br /&gt;
    Single,&lt;br /&gt;
    Multiple,&lt;br /&gt;
    Unlimited,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct FieldDefinition {&lt;br /&gt;
    pub field_name: String,&lt;br /&gt;
    pub field_type: String,&lt;br /&gt;
    pub cardinality: Cardinality,&lt;br /&gt;
    pub required: bool,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct BundleDefinition {&lt;br /&gt;
    pub entity_type: EntityType,&lt;br /&gt;
    pub bundle: String,&lt;br /&gt;
    pub label: String,&lt;br /&gt;
    pub fields: Vec&amp;lt;FieldDefinition&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Design-Entscheidungen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Entscheidung !! Begründung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;pre&amp;gt;FieldValue&amp;lt;/pre&amp;gt; als Enum mit Payload pro Variante || Bildet Drupals starke Feldtypisierung typsicher ab, statt alles als &amp;lt;pre&amp;gt;String&amp;lt;/pre&amp;gt; zu behandeln.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;pre&amp;gt;FieldMap = HashMap&amp;lt;String, FieldValue&amp;gt;&amp;lt;/pre&amp;gt; || Bundles sind zur Compile-Zeit nicht bekannt; generische Map bleibt flexibel für beliebige &amp;lt;pre&amp;gt;field_*&amp;lt;/pre&amp;gt;-Namen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;pre&amp;gt;EntityBase&amp;lt;/pre&amp;gt; als Kompositionsfeld || Vermeidet Duplikation gemeinsamer Properties zwischen Node/Media, ohne Vererbung (die es in Rust nicht gibt).&lt;br /&gt;
|-&lt;br /&gt;
| Kein &amp;lt;pre&amp;gt;impl&amp;lt;/pre&amp;gt;-Block || Modell bleibt reine Datenschicht; Geschäftslogik (Validierung, API-Calls) gehört in separate Module.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;pre&amp;gt;EntityType::Custom(String)&amp;lt;/pre&amp;gt; || Deckt durch Contrib-/Custom-Module definierte Entity-Typen ab, ohne das Enum erweitern zu müssen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Offene Erweiterungspunkte ==&lt;br /&gt;
&lt;br /&gt;
* Weitere &amp;lt;pre&amp;gt;FieldValue&amp;lt;/pre&amp;gt;-Varianten je nach genutzten Feldtypen (z. B. &amp;lt;pre&amp;gt;Geolocation&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;Address&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;File&amp;lt;/pre&amp;gt; losgelöst von &amp;lt;pre&amp;gt;Image&amp;lt;/pre&amp;gt;).&lt;br /&gt;
* Übersetzungen (&amp;lt;pre&amp;gt;translations: HashMap&amp;lt;LangCode, FieldMap&amp;gt;&amp;lt;/pre&amp;gt;), falls Drupal-Mehrsprachigkeit (Content Translation) abgebildet werden soll.&lt;br /&gt;
* Konkretes Mapping auf die JSON:API-Hüllstruktur (&amp;lt;pre&amp;gt;data&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;attributes&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;relationships&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;included&amp;lt;/pre&amp;gt;), falls direkt gegen die Drupal-JSON:API deserialisiert werden soll, statt ein eigenes flaches Modell zu pflegen.&lt;br /&gt;
&lt;br /&gt;
== Verwendete Crates ==&lt;br /&gt;
&lt;br /&gt;
* [https://crates.io/crates/chrono chrono] – Zeitstempel (&amp;lt;pre&amp;gt;created&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;changed&amp;lt;/pre&amp;gt;)&lt;br /&gt;
* [https://crates.io/crates/uuid uuid] – Entity-UUIDs&lt;br /&gt;
&lt;br /&gt;
Hinweis: [https://serde.rs/ serde] (für die (De-)Serialisierung) ist&lt;br /&gt;
bewusst noch nicht Teil dieses Modells und wird in einem späteren&lt;br /&gt;
Schritt ergänzt.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* Drupal-Dokumentation: [https://www.drupal.org/docs/drupal-apis/entity-api Entity API]&lt;br /&gt;
* Drupal-Dokumentation: [https://www.drupal.org/docs/core-modules-and-themes/core-modules/jsonapi-module JSON:API-Modul]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Rust]]&lt;br /&gt;
[[Kategorie:Drupal]]&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Data_Engine&amp;diff=13</id>
		<title>Data Engine</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Data_Engine&amp;diff=13"/>
		<updated>2026-08-12T01:19:58Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* [[Rust-Datenmodell für Drupal-Entities]]&lt;br /&gt;
= Rust-Datenmodell für Drupal-Entities =&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel dokumentiert ein Rust-Datenmodell, das die zentralen&lt;br /&gt;
Entity-Konzepte von Drupal (Node, User, Taxonomy Term, Media, Paragraph)&lt;br /&gt;
als &amp;lt;pre&amp;gt;struct&amp;lt;/pre&amp;gt;/&amp;lt;pre&amp;gt;enum&amp;lt;/pre&amp;gt;-Typen abbildet. Das Modell enthält bewusst &#039;&#039;&#039;keine&lt;br /&gt;
Logik&#039;&#039;&#039; (keine &amp;lt;pre&amp;gt;impl&amp;lt;/pre&amp;gt;-Methoden) – es dient als reine Datenrepräsentation.&lt;br /&gt;
Eine (De-)Serialisierung (z. B. mit [https://serde.rs/ serde] für&lt;br /&gt;
Drupal-JSON:API-Antworten) ist bewusst noch nicht Teil dieses Modells&lt;br /&gt;
und folgt in einem späteren Schritt.&lt;br /&gt;
&lt;br /&gt;
== Motivation ==&lt;br /&gt;
&lt;br /&gt;
Drupal modelliert Inhalte über ein generisches Entity-System:&lt;br /&gt;
* &#039;&#039;&#039;Entity-Typen&#039;&#039;&#039; (&amp;lt;pre&amp;gt;node&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;user&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;taxonomy_term&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;media&amp;lt;/pre&amp;gt;, …) definieren die grundlegende Art eines Objekts.&lt;br /&gt;
* &#039;&#039;&#039;Bundles&#039;&#039;&#039; (bei Nodes „Content Types&amp;quot; genannt, z. B. &amp;lt;pre&amp;gt;article&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;page&amp;lt;/pre&amp;gt;) spezialisieren einen Entity-Typ.&lt;br /&gt;
* &#039;&#039;&#039;Felder&#039;&#039;&#039; (&amp;lt;pre&amp;gt;field_*&amp;lt;/pre&amp;gt;) sind pro Bundle konfigurierbar, typisiert und können einfach- oder mehrwertig (Kardinalität) sein.&lt;br /&gt;
&lt;br /&gt;
Um mit einem Drupal-Backend aus Rust heraus zu arbeiten, braucht man&lt;br /&gt;
typisierte Gegenstücke zu diesen Konzepten. Das hier beschriebene&lt;br /&gt;
Modell bildet diese Struktur 1:1 in Rust ab.&lt;br /&gt;
&lt;br /&gt;
== Grundtypen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone, PartialEq, Eq)]&lt;br /&gt;
pub enum EntityType {&lt;br /&gt;
    Node,&lt;br /&gt;
    User,&lt;br /&gt;
    TaxonomyTerm,&lt;br /&gt;
    Media,&lt;br /&gt;
    Paragraph,&lt;br /&gt;
    File,&lt;br /&gt;
    Menu,&lt;br /&gt;
    Block,&lt;br /&gt;
    Custom(String),&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]&lt;br /&gt;
pub enum PublishStatus {&lt;br /&gt;
    Published,&lt;br /&gt;
    Unpublished,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub type LangCode = String;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EntityType&amp;lt;/pre&amp;gt; bildet die von Drupal vordefinierten Entity-Typen ab; der&lt;br /&gt;
&amp;lt;pre&amp;gt;Custom&amp;lt;/pre&amp;gt;-Zweig deckt eigene, per Modul definierte Entity-Typen ab, ohne&lt;br /&gt;
das Enum ändern zu müssen.&lt;br /&gt;
&lt;br /&gt;
== Feldwerte: &amp;lt;pre&amp;gt;FieldValue&amp;lt;/pre&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Drupal-Felder sind stark typisiert (Text, Zahl, Datum, Referenz, Bild, …).&lt;br /&gt;
Dies wird über ein Enum mit Payload pro Variante abgebildet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub enum FieldValue {&lt;br /&gt;
    Text(String),&lt;br /&gt;
    TextLong { value: String, format: Option&amp;lt;String&amp;gt; },&lt;br /&gt;
    Integer(i64),&lt;br /&gt;
    Decimal(f64),&lt;br /&gt;
    Boolean(bool),&lt;br /&gt;
    DateTime(DateTime&amp;lt;Utc&amp;gt;),&lt;br /&gt;
    Email(String),&lt;br /&gt;
    Link { uri: String, title: Option&amp;lt;String&amp;gt; },&lt;br /&gt;
    EntityReference { target_id: u64, target_type: EntityType },&lt;br /&gt;
    Image {&lt;br /&gt;
        target_id: u64,&lt;br /&gt;
        alt: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
        title: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
        width: Option&amp;lt;u32&amp;gt;,&lt;br /&gt;
        height: Option&amp;lt;u32&amp;gt;,&lt;br /&gt;
    },&lt;br /&gt;
    List(Vec&amp;lt;FieldValue&amp;gt;),&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub type FieldMap = HashMap&amp;lt;String, FieldValue&amp;gt;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;pre&amp;gt;List(Vec&amp;lt;FieldValue&amp;gt;)&amp;lt;/pre&amp;gt; bildet mehrwertige Felder ab (Kardinalität &amp;gt; 1).&lt;br /&gt;
* &amp;lt;pre&amp;gt;FieldMap&amp;lt;/pre&amp;gt; ist die generische Ablage für alle &amp;lt;pre&amp;gt;field_*&amp;lt;/pre&amp;gt;-Werte eines Bundles, adressiert über den Feldmaschinennamen (z. B. &amp;lt;pre&amp;gt;field_tags&amp;lt;/pre&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Entity-Typen im Detail ==&lt;br /&gt;
&lt;br /&gt;
=== Gemeinsame Basis ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct EntityBase {&lt;br /&gt;
    pub id: u64,&lt;br /&gt;
    pub uuid: Uuid,&lt;br /&gt;
    pub entity_type: EntityType,&lt;br /&gt;
    pub bundle: String,&lt;br /&gt;
    pub langcode: LangCode,&lt;br /&gt;
    pub created: DateTime&amp;lt;Utc&amp;gt;,&lt;br /&gt;
    pub changed: DateTime&amp;lt;Utc&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EntityBase&amp;lt;/pre&amp;gt; fasst Eigenschaften zusammen, die praktisch jede&lt;br /&gt;
Content-Entity in Drupal besitzt, und wird per Komposition in konkrete&lt;br /&gt;
Entity-Structs eingebettet (siehe &amp;lt;pre&amp;gt;Node&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;Media&amp;lt;/pre&amp;gt;). Beim späteren&lt;br /&gt;
Ergänzen von serde bietet sich dafür &amp;lt;pre&amp;gt;#[serde(flatten)]&amp;lt;/pre&amp;gt; an, damit die&lt;br /&gt;
Felder von &amp;lt;pre&amp;gt;EntityBase&amp;lt;/pre&amp;gt; beim (De-)Serialisieren auf derselben Ebene&lt;br /&gt;
wie die restlichen Felder erscheinen.&lt;br /&gt;
&lt;br /&gt;
=== Node ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct Node {&lt;br /&gt;
    pub base: EntityBase,&lt;br /&gt;
    pub title: String,&lt;br /&gt;
    pub status: PublishStatus,&lt;br /&gt;
    pub author_id: u64,&lt;br /&gt;
    pub fields: FieldMap,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== User ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct User {&lt;br /&gt;
    pub id: u64,&lt;br /&gt;
    pub uuid: Uuid,&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub mail: String,&lt;br /&gt;
    pub status: bool,&lt;br /&gt;
    pub roles: Vec&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub created: DateTime&amp;lt;Utc&amp;gt;,&lt;br /&gt;
    pub fields: FieldMap,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;User&amp;lt;/pre&amp;gt; nutzt bewusst kein &amp;lt;pre&amp;gt;EntityBase&amp;lt;/pre&amp;gt;, da User-Entities in Drupal kein&lt;br /&gt;
&amp;lt;pre&amp;gt;bundle&amp;lt;/pre&amp;gt;/&amp;lt;pre&amp;gt;langcode&amp;lt;/pre&amp;gt; im klassischen Sinn besitzen und stattdessen&lt;br /&gt;
&amp;lt;pre&amp;gt;roles&amp;lt;/pre&amp;gt; und einen einfachen &amp;lt;pre&amp;gt;status: bool&amp;lt;/pre&amp;gt; (aktiv/blockiert) haben.&lt;br /&gt;
&lt;br /&gt;
=== TaxonomyTerm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct TaxonomyTerm {&lt;br /&gt;
    pub id: u64,&lt;br /&gt;
    pub uuid: Uuid,&lt;br /&gt;
    pub vocabulary: String,&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub description: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub parent_id: Option&amp;lt;u64&amp;gt;,&lt;br /&gt;
    pub weight: i32,&lt;br /&gt;
    pub fields: FieldMap,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bildet Taxonomiebegriffe inkl. hierarchischer Eltern-Referenz&lt;br /&gt;
(&amp;lt;pre&amp;gt;parent_id&amp;lt;/pre&amp;gt;) und Sortiergewicht (&amp;lt;pre&amp;gt;weight&amp;lt;/pre&amp;gt;) ab.&lt;br /&gt;
&lt;br /&gt;
=== Media &amp;amp; Paragraph ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct Media {&lt;br /&gt;
    pub base: EntityBase,&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub fields: FieldMap,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct Paragraph {&lt;br /&gt;
    pub id: u64,&lt;br /&gt;
    pub uuid: Uuid,&lt;br /&gt;
    pub bundle: String,&lt;br /&gt;
    pub fields: FieldMap,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Paragraph&amp;lt;/pre&amp;gt; ist bewusst schlank gehalten, da Paragraphs in Drupal keine&lt;br /&gt;
eigenständigen, direkt aufrufbaren Entities mit URL/Alias sind, sondern&lt;br /&gt;
stets über eine Host-Entity referenziert werden.&lt;br /&gt;
&lt;br /&gt;
== Schema-Introspektion (optional) ==&lt;br /&gt;
&lt;br /&gt;
Für Anwendungsfälle, in denen Feld- und Bundle-Definitionen selbst&lt;br /&gt;
(nicht nur Werte) abgebildet werden müssen – etwa um ein Drupal-Schema&lt;br /&gt;
zu spiegeln oder Formulare dynamisch zu generieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]&lt;br /&gt;
pub enum Cardinality {&lt;br /&gt;
    Single,&lt;br /&gt;
    Multiple,&lt;br /&gt;
    Unlimited,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct FieldDefinition {&lt;br /&gt;
    pub field_name: String,&lt;br /&gt;
    pub field_type: String,&lt;br /&gt;
    pub cardinality: Cardinality,&lt;br /&gt;
    pub required: bool,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct BundleDefinition {&lt;br /&gt;
    pub entity_type: EntityType,&lt;br /&gt;
    pub bundle: String,&lt;br /&gt;
    pub label: String,&lt;br /&gt;
    pub fields: Vec&amp;lt;FieldDefinition&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Design-Entscheidungen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Entscheidung !! Begründung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;pre&amp;gt;FieldValue&amp;lt;/pre&amp;gt; als Enum mit Payload pro Variante || Bildet Drupals starke Feldtypisierung typsicher ab, statt alles als &amp;lt;pre&amp;gt;String&amp;lt;/pre&amp;gt; zu behandeln.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;pre&amp;gt;FieldMap = HashMap&amp;lt;String, FieldValue&amp;gt;&amp;lt;/pre&amp;gt; || Bundles sind zur Compile-Zeit nicht bekannt; generische Map bleibt flexibel für beliebige &amp;lt;pre&amp;gt;field_*&amp;lt;/pre&amp;gt;-Namen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;pre&amp;gt;EntityBase&amp;lt;/pre&amp;gt; als Kompositionsfeld || Vermeidet Duplikation gemeinsamer Properties zwischen Node/Media, ohne Vererbung (die es in Rust nicht gibt).&lt;br /&gt;
|-&lt;br /&gt;
| Kein &amp;lt;pre&amp;gt;impl&amp;lt;/pre&amp;gt;-Block || Modell bleibt reine Datenschicht; Geschäftslogik (Validierung, API-Calls) gehört in separate Module.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;pre&amp;gt;EntityType::Custom(String)&amp;lt;/pre&amp;gt; || Deckt durch Contrib-/Custom-Module definierte Entity-Typen ab, ohne das Enum erweitern zu müssen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Offene Erweiterungspunkte ==&lt;br /&gt;
&lt;br /&gt;
* Weitere &amp;lt;pre&amp;gt;FieldValue&amp;lt;/pre&amp;gt;-Varianten je nach genutzten Feldtypen (z. B. &amp;lt;pre&amp;gt;Geolocation&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;Address&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;File&amp;lt;/pre&amp;gt; losgelöst von &amp;lt;pre&amp;gt;Image&amp;lt;/pre&amp;gt;).&lt;br /&gt;
* Übersetzungen (&amp;lt;pre&amp;gt;translations: HashMap&amp;lt;LangCode, FieldMap&amp;gt;&amp;lt;/pre&amp;gt;), falls Drupal-Mehrsprachigkeit (Content Translation) abgebildet werden soll.&lt;br /&gt;
* Konkretes Mapping auf die JSON:API-Hüllstruktur (&amp;lt;pre&amp;gt;data&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;attributes&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;relationships&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;included&amp;lt;/pre&amp;gt;), falls direkt gegen die Drupal-JSON:API deserialisiert werden soll, statt ein eigenes flaches Modell zu pflegen.&lt;br /&gt;
&lt;br /&gt;
== Verwendete Crates ==&lt;br /&gt;
&lt;br /&gt;
* [https://crates.io/crates/chrono chrono] – Zeitstempel (&amp;lt;pre&amp;gt;created&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;changed&amp;lt;/pre&amp;gt;)&lt;br /&gt;
* [https://crates.io/crates/uuid uuid] – Entity-UUIDs&lt;br /&gt;
&lt;br /&gt;
Hinweis: [https://serde.rs/ serde] (für die (De-)Serialisierung) ist&lt;br /&gt;
bewusst noch nicht Teil dieses Modells und wird in einem späteren&lt;br /&gt;
Schritt ergänzt.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* Drupal-Dokumentation: [https://www.drupal.org/docs/drupal-apis/entity-api Entity API]&lt;br /&gt;
* Drupal-Dokumentation: [https://www.drupal.org/docs/core-modules-and-themes/core-modules/jsonapi-module JSON:API-Modul]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Rust]]&lt;br /&gt;
[[Kategorie:Drupal]]&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Data_Engine&amp;diff=12</id>
		<title>Data Engine</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Data_Engine&amp;diff=12"/>
		<updated>2026-08-12T01:17:50Z</updated>

		<summary type="html">&lt;p&gt;Thorsten: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Rust-Datenmodell für Drupal-Entities =&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
&lt;br /&gt;
Dieser Artikel dokumentiert ein Rust-Datenmodell, das die zentralen&lt;br /&gt;
Entity-Konzepte von Drupal (Node, User, Taxonomy Term, Media, Paragraph)&lt;br /&gt;
als &amp;lt;pre&amp;gt;struct&amp;lt;/pre&amp;gt;/&amp;lt;pre&amp;gt;enum&amp;lt;/pre&amp;gt;-Typen abbildet. Das Modell enthält bewusst &#039;&#039;&#039;keine&lt;br /&gt;
Logik&#039;&#039;&#039; (keine &amp;lt;pre&amp;gt;impl&amp;lt;/pre&amp;gt;-Methoden) – es dient als reine Datenrepräsentation.&lt;br /&gt;
Eine (De-)Serialisierung (z. B. mit [https://serde.rs/ serde] für&lt;br /&gt;
Drupal-JSON:API-Antworten) ist bewusst noch nicht Teil dieses Modells&lt;br /&gt;
und folgt in einem späteren Schritt.&lt;br /&gt;
&lt;br /&gt;
== Motivation ==&lt;br /&gt;
&lt;br /&gt;
Drupal modelliert Inhalte über ein generisches Entity-System:&lt;br /&gt;
* &#039;&#039;&#039;Entity-Typen&#039;&#039;&#039; (&amp;lt;pre&amp;gt;node&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;user&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;taxonomy_term&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;media&amp;lt;/pre&amp;gt;, …) definieren die grundlegende Art eines Objekts.&lt;br /&gt;
* &#039;&#039;&#039;Bundles&#039;&#039;&#039; (bei Nodes „Content Types&amp;quot; genannt, z. B. &amp;lt;pre&amp;gt;article&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;page&amp;lt;/pre&amp;gt;) spezialisieren einen Entity-Typ.&lt;br /&gt;
* &#039;&#039;&#039;Felder&#039;&#039;&#039; (&amp;lt;pre&amp;gt;field_*&amp;lt;/pre&amp;gt;) sind pro Bundle konfigurierbar, typisiert und können einfach- oder mehrwertig (Kardinalität) sein.&lt;br /&gt;
&lt;br /&gt;
Um mit einem Drupal-Backend aus Rust heraus zu arbeiten, braucht man&lt;br /&gt;
typisierte Gegenstücke zu diesen Konzepten. Das hier beschriebene&lt;br /&gt;
Modell bildet diese Struktur 1:1 in Rust ab.&lt;br /&gt;
&lt;br /&gt;
== Grundtypen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone, PartialEq, Eq)]&lt;br /&gt;
pub enum EntityType {&lt;br /&gt;
    Node,&lt;br /&gt;
    User,&lt;br /&gt;
    TaxonomyTerm,&lt;br /&gt;
    Media,&lt;br /&gt;
    Paragraph,&lt;br /&gt;
    File,&lt;br /&gt;
    Menu,&lt;br /&gt;
    Block,&lt;br /&gt;
    Custom(String),&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]&lt;br /&gt;
pub enum PublishStatus {&lt;br /&gt;
    Published,&lt;br /&gt;
    Unpublished,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub type LangCode = String;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EntityType&amp;lt;/pre&amp;gt; bildet die von Drupal vordefinierten Entity-Typen ab; der&lt;br /&gt;
&amp;lt;pre&amp;gt;Custom&amp;lt;/pre&amp;gt;-Zweig deckt eigene, per Modul definierte Entity-Typen ab, ohne&lt;br /&gt;
das Enum ändern zu müssen.&lt;br /&gt;
&lt;br /&gt;
== Feldwerte: &amp;lt;pre&amp;gt;FieldValue&amp;lt;/pre&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Drupal-Felder sind stark typisiert (Text, Zahl, Datum, Referenz, Bild, …).&lt;br /&gt;
Dies wird über ein Enum mit Payload pro Variante abgebildet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub enum FieldValue {&lt;br /&gt;
    Text(String),&lt;br /&gt;
    TextLong { value: String, format: Option&amp;lt;String&amp;gt; },&lt;br /&gt;
    Integer(i64),&lt;br /&gt;
    Decimal(f64),&lt;br /&gt;
    Boolean(bool),&lt;br /&gt;
    DateTime(DateTime&amp;lt;Utc&amp;gt;),&lt;br /&gt;
    Email(String),&lt;br /&gt;
    Link { uri: String, title: Option&amp;lt;String&amp;gt; },&lt;br /&gt;
    EntityReference { target_id: u64, target_type: EntityType },&lt;br /&gt;
    Image {&lt;br /&gt;
        target_id: u64,&lt;br /&gt;
        alt: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
        title: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
        width: Option&amp;lt;u32&amp;gt;,&lt;br /&gt;
        height: Option&amp;lt;u32&amp;gt;,&lt;br /&gt;
    },&lt;br /&gt;
    List(Vec&amp;lt;FieldValue&amp;gt;),&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pub type FieldMap = HashMap&amp;lt;String, FieldValue&amp;gt;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;pre&amp;gt;List(Vec&amp;lt;FieldValue&amp;gt;)&amp;lt;/pre&amp;gt; bildet mehrwertige Felder ab (Kardinalität &amp;gt; 1).&lt;br /&gt;
* &amp;lt;pre&amp;gt;FieldMap&amp;lt;/pre&amp;gt; ist die generische Ablage für alle &amp;lt;pre&amp;gt;field_*&amp;lt;/pre&amp;gt;-Werte eines Bundles, adressiert über den Feldmaschinennamen (z. B. &amp;lt;pre&amp;gt;field_tags&amp;lt;/pre&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Entity-Typen im Detail ==&lt;br /&gt;
&lt;br /&gt;
=== Gemeinsame Basis ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct EntityBase {&lt;br /&gt;
    pub id: u64,&lt;br /&gt;
    pub uuid: Uuid,&lt;br /&gt;
    pub entity_type: EntityType,&lt;br /&gt;
    pub bundle: String,&lt;br /&gt;
    pub langcode: LangCode,&lt;br /&gt;
    pub created: DateTime&amp;lt;Utc&amp;gt;,&lt;br /&gt;
    pub changed: DateTime&amp;lt;Utc&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;EntityBase&amp;lt;/pre&amp;gt; fasst Eigenschaften zusammen, die praktisch jede&lt;br /&gt;
Content-Entity in Drupal besitzt, und wird per Komposition in konkrete&lt;br /&gt;
Entity-Structs eingebettet (siehe &amp;lt;pre&amp;gt;Node&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;Media&amp;lt;/pre&amp;gt;). Beim späteren&lt;br /&gt;
Ergänzen von serde bietet sich dafür &amp;lt;pre&amp;gt;#[serde(flatten)]&amp;lt;/pre&amp;gt; an, damit die&lt;br /&gt;
Felder von &amp;lt;pre&amp;gt;EntityBase&amp;lt;/pre&amp;gt; beim (De-)Serialisieren auf derselben Ebene&lt;br /&gt;
wie die restlichen Felder erscheinen.&lt;br /&gt;
&lt;br /&gt;
=== Node ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct Node {&lt;br /&gt;
    pub base: EntityBase,&lt;br /&gt;
    pub title: String,&lt;br /&gt;
    pub status: PublishStatus,&lt;br /&gt;
    pub author_id: u64,&lt;br /&gt;
    pub fields: FieldMap,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== User ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct User {&lt;br /&gt;
    pub id: u64,&lt;br /&gt;
    pub uuid: Uuid,&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub mail: String,&lt;br /&gt;
    pub status: bool,&lt;br /&gt;
    pub roles: Vec&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub created: DateTime&amp;lt;Utc&amp;gt;,&lt;br /&gt;
    pub fields: FieldMap,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;User&amp;lt;/pre&amp;gt; nutzt bewusst kein &amp;lt;pre&amp;gt;EntityBase&amp;lt;/pre&amp;gt;, da User-Entities in Drupal kein&lt;br /&gt;
&amp;lt;pre&amp;gt;bundle&amp;lt;/pre&amp;gt;/&amp;lt;pre&amp;gt;langcode&amp;lt;/pre&amp;gt; im klassischen Sinn besitzen und stattdessen&lt;br /&gt;
&amp;lt;pre&amp;gt;roles&amp;lt;/pre&amp;gt; und einen einfachen &amp;lt;pre&amp;gt;status: bool&amp;lt;/pre&amp;gt; (aktiv/blockiert) haben.&lt;br /&gt;
&lt;br /&gt;
=== TaxonomyTerm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct TaxonomyTerm {&lt;br /&gt;
    pub id: u64,&lt;br /&gt;
    pub uuid: Uuid,&lt;br /&gt;
    pub vocabulary: String,&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub description: Option&amp;lt;String&amp;gt;,&lt;br /&gt;
    pub parent_id: Option&amp;lt;u64&amp;gt;,&lt;br /&gt;
    pub weight: i32,&lt;br /&gt;
    pub fields: FieldMap,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bildet Taxonomiebegriffe inkl. hierarchischer Eltern-Referenz&lt;br /&gt;
(&amp;lt;pre&amp;gt;parent_id&amp;lt;/pre&amp;gt;) und Sortiergewicht (&amp;lt;pre&amp;gt;weight&amp;lt;/pre&amp;gt;) ab.&lt;br /&gt;
&lt;br /&gt;
=== Media &amp;amp; Paragraph ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct Media {&lt;br /&gt;
    pub base: EntityBase,&lt;br /&gt;
    pub name: String,&lt;br /&gt;
    pub fields: FieldMap,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct Paragraph {&lt;br /&gt;
    pub id: u64,&lt;br /&gt;
    pub uuid: Uuid,&lt;br /&gt;
    pub bundle: String,&lt;br /&gt;
    pub fields: FieldMap,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Paragraph&amp;lt;/pre&amp;gt; ist bewusst schlank gehalten, da Paragraphs in Drupal keine&lt;br /&gt;
eigenständigen, direkt aufrufbaren Entities mit URL/Alias sind, sondern&lt;br /&gt;
stets über eine Host-Entity referenziert werden.&lt;br /&gt;
&lt;br /&gt;
== Schema-Introspektion (optional) ==&lt;br /&gt;
&lt;br /&gt;
Für Anwendungsfälle, in denen Feld- und Bundle-Definitionen selbst&lt;br /&gt;
(nicht nur Werte) abgebildet werden müssen – etwa um ein Drupal-Schema&lt;br /&gt;
zu spiegeln oder Formulare dynamisch zu generieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]&lt;br /&gt;
pub enum Cardinality {&lt;br /&gt;
    Single,&lt;br /&gt;
    Multiple,&lt;br /&gt;
    Unlimited,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct FieldDefinition {&lt;br /&gt;
    pub field_name: String,&lt;br /&gt;
    pub field_type: String,&lt;br /&gt;
    pub cardinality: Cardinality,&lt;br /&gt;
    pub required: bool,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[derive(Debug, Clone)]&lt;br /&gt;
pub struct BundleDefinition {&lt;br /&gt;
    pub entity_type: EntityType,&lt;br /&gt;
    pub bundle: String,&lt;br /&gt;
    pub label: String,&lt;br /&gt;
    pub fields: Vec&amp;lt;FieldDefinition&amp;gt;,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Design-Entscheidungen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Entscheidung !! Begründung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;pre&amp;gt;FieldValue&amp;lt;/pre&amp;gt; als Enum mit Payload pro Variante || Bildet Drupals starke Feldtypisierung typsicher ab, statt alles als &amp;lt;pre&amp;gt;String&amp;lt;/pre&amp;gt; zu behandeln.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;pre&amp;gt;FieldMap = HashMap&amp;lt;String, FieldValue&amp;gt;&amp;lt;/pre&amp;gt; || Bundles sind zur Compile-Zeit nicht bekannt; generische Map bleibt flexibel für beliebige &amp;lt;pre&amp;gt;field_*&amp;lt;/pre&amp;gt;-Namen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;pre&amp;gt;EntityBase&amp;lt;/pre&amp;gt; als Kompositionsfeld || Vermeidet Duplikation gemeinsamer Properties zwischen Node/Media, ohne Vererbung (die es in Rust nicht gibt).&lt;br /&gt;
|-&lt;br /&gt;
| Kein &amp;lt;pre&amp;gt;impl&amp;lt;/pre&amp;gt;-Block || Modell bleibt reine Datenschicht; Geschäftslogik (Validierung, API-Calls) gehört in separate Module.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;pre&amp;gt;EntityType::Custom(String)&amp;lt;/pre&amp;gt; || Deckt durch Contrib-/Custom-Module definierte Entity-Typen ab, ohne das Enum erweitern zu müssen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Offene Erweiterungspunkte ==&lt;br /&gt;
&lt;br /&gt;
* Weitere &amp;lt;pre&amp;gt;FieldValue&amp;lt;/pre&amp;gt;-Varianten je nach genutzten Feldtypen (z. B. &amp;lt;pre&amp;gt;Geolocation&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;Address&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;File&amp;lt;/pre&amp;gt; losgelöst von &amp;lt;pre&amp;gt;Image&amp;lt;/pre&amp;gt;).&lt;br /&gt;
* Übersetzungen (&amp;lt;pre&amp;gt;translations: HashMap&amp;lt;LangCode, FieldMap&amp;gt;&amp;lt;/pre&amp;gt;), falls Drupal-Mehrsprachigkeit (Content Translation) abgebildet werden soll.&lt;br /&gt;
* Konkretes Mapping auf die JSON:API-Hüllstruktur (&amp;lt;pre&amp;gt;data&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;attributes&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;relationships&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;included&amp;lt;/pre&amp;gt;), falls direkt gegen die Drupal-JSON:API deserialisiert werden soll, statt ein eigenes flaches Modell zu pflegen.&lt;br /&gt;
&lt;br /&gt;
== Verwendete Crates ==&lt;br /&gt;
&lt;br /&gt;
* [https://crates.io/crates/chrono chrono] – Zeitstempel (&amp;lt;pre&amp;gt;created&amp;lt;/pre&amp;gt;, &amp;lt;pre&amp;gt;changed&amp;lt;/pre&amp;gt;)&lt;br /&gt;
* [https://crates.io/crates/uuid uuid] – Entity-UUIDs&lt;br /&gt;
&lt;br /&gt;
Hinweis: [https://serde.rs/ serde] (für die (De-)Serialisierung) ist&lt;br /&gt;
bewusst noch nicht Teil dieses Modells und wird in einem späteren&lt;br /&gt;
Schritt ergänzt.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* Drupal-Dokumentation: [https://www.drupal.org/docs/drupal-apis/entity-api Entity API]&lt;br /&gt;
* Drupal-Dokumentation: [https://www.drupal.org/docs/core-modules-and-themes/core-modules/jsonapi-module JSON:API-Modul]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Rust]]&lt;br /&gt;
[[Kategorie:Drupal]]&lt;/div&gt;</summary>
		<author><name>Thorsten</name></author>
	</entry>
</feed>