CodamAIDocs
Themafertig

Die Datenbank

CRMS nutzt dieselbe Datenbankschicht wie CDMS: dieselben Variablen, dasselbe Routing zu System- und Mandanten-Datenbank, das Schema aus den Entities, und Tabellen, an die nur angehängt wird.

Ausprägungen
eingebettet: die CDMS-Datenbankeigener Dienst: eigene DatenbankSINGLEMULTI

Worum es geht

CRMS speichert Vorlagen, Journale und die Einträge endgültiger Dokumente in einer Datenbank. Die Dateien der Dokumente selbst liegen im S3-Bucket, nicht in der Datenbank.

CRMS hat dafür keinen eigenen Datenbankweg. Es nutzt die gemeinsame Datenbankschicht von CodamAI, dieselbe wie CDMS. Sie wählt je Anfrage den Entity Manager der System-Datenbank oder der Mandanten-Datenbank des Aufrufers. Ein Entity Manager ist das Objekt, über das JPA Zeilen liest und schreibt.

Welche Datenbank

Eingebettet und als eigener Dienst
eingebetteteigener Dienst
Datenbankdie Datenbank der CDMS-Anwendungeine eigene Datenbank
Variablendie der Anwendung, nichts zusätzlichCODAMAI_PERSISTENCE_*, Pflicht
Transaktiondieselbe wie die der Anwendung, dieselben Poolseigene
Tabellenneben den Tabellen der Anwendungnur die CRMS-Tabellen

System und Mandant

Wie bei CDMS gibt es zwei Arten, eine Installation zu betreiben (siehe SINGLE und MULTI):

  • SINGLE: Eine Datenbank hält alles.
  • MULTI: Eine System-Datenbank und je Mandant eine eigene Datenbank.

Jedes CRMS-Modul legt dieselben Tabellen in der System-Datenbank und in jeder Mandanten-Datenbank an. In welche eine Zeile kommt, entscheidet, wem sie gehört:

WasWohin
Systemvorlagen (Scope SYSTEM)System-Datenbank
Vorlagen eines Mandanten und eines BenutzersDatenbank des Mandanten des Aufrufers
endgültige DokumenteDatenbank des Mandanten des Aufrufers, ohne Mandant die System-Datenbank

Bei SINGLE ist das dieselbe Datenbank.

Die Variablen des eigenen Diensts

VariableBedeutungVorgabe
CODAMAI_PERSISTENCE_TENANT_MODESINGLE oder MULTIPflicht
CODAMAI_PERSISTENCE_DATABASE_DRIVERJDBC-Treiberklasse, etwa com.mysql.cj.jdbc.DriverPflicht
CODAMAI_PERSISTENCE_DATABASE_URLJDBC-URL mit dem Platzhalter {tenant}. Er wird zu single, system oder dem Schlüssel eines MandantenPflicht
CODAMAI_PERSISTENCE_DATABASE_USER, _PASSWORDdas DatenbankkontoPflicht
CODAMAI_PERSISTENCE_DATABASE_POOL_SIZEGröße eines Verbindungspools20
CODAMAI_PERSISTENCE_DATABASE_AUTO_UPDATEHibernate passt das Schema beim Start antrue
CODAMAI_PERSISTENCE_DATABASE_AUTO_CREATE_TENANT_DATABASEeine fehlende Mandanten-Datenbank beim ersten Zugriff anlegenfalse
CODAMAI_PERSISTENCE_DATABASE_SHOW_SQLSQL ins Log schreibenfalse

Eingebettet setzt du keine davon zusätzlich. CRMS nutzt, was die Anwendung schon hat.

Das Schema

  • Aus den Entities. Hibernate baut die Tabellen aus den Entity-Klassen. CRMS liefert keine eigenen SQL-Skripte mit.
  • Portabel. Aufzählungen liegen als Text in VARCHAR-Spalten, nicht als datenbankeigener ENUM-Typ. Es gibt keine herstellerspezifischen Spaltendefinitionen. Deshalb läuft CRMS auf jeder Datenbank, die der CDMS-Rahmen anbietet.
  • Abfragen über die Criteria API. Kein Modul schreibt SQL oder JPQL als Text.

Die Tabellen heißen alle crms_…:

BereichTabellen
Vorlagenverwaltungcrms_template_edition, crms_template_variant, crms_template_entry, crms_template_content, crms_template_asset, crms_template_blob, crms_template_draft
Nachweiscrms_journal_entry, crms_journal_head, crms_anchor, crms_anchor_proof, crms_document_key
Dokumentablagecrms_document_entry, crms_document_payload, crms_document_retention

Nur anhängen

Was einmal geschrieben ist, ändert CRMS nicht mehr. Die Entities dieser Tabellen sind @Immutable: Hibernate schreibt für sie nie ein UPDATE. Kein Modul ruft für sie Löschen, Zusammenführen oder Massenänderungen auf. Ein Architekturtest je Modul verlangt das.

Nur vier Tabellen werden geändert, jede aus einem benannten Grund:

TabelleWas sich ändert
crms_template_draftder Entwurf einer Vorlage, beim Speichern des Entwurfs
crms_journal_headder Kopf eines Journals. Er wird beim Anhängen gesperrt, damit Schreibende nacheinander drankommen
crms_document_keynur das Vernichten eines Dokumentschlüssels. Die Zeile bleibt als Grabstein
crms_document_retentiondie Arbeitsliste der Aufbewahrung: done_at, wenn ein Dokument entfernt ist

Was gegen Änderungen schützt, ist die Hash-Kette: Jeder Eintrag enthält den Hash des vorigen, und der Kopf jedes Journals bekommt einen Zeitstempel außerhalb der Datenbank. Wer mit Datenbankzugang eine Zeile ändert, wird beim Prüfen erkannt. Siehe Die Hash-Kette.

Fallen

Weiter

Suchen