SQL Cossacks

1984 — 2024

Dr. Carsten Kumke

Ziel

  • Daten über historisch belegte Personen in großer Zahl verwalten zu können.

  • Darstellung und Aufbereitung der Daten zu ermöglichen.

  • Möglichst keine redundante Arbeiten erledigen zu müssen.

  • Daten zu Erkenntnisgewinnen zu nutzen (Big Data ?)

    • Auswertungen über Karrieren

    • Statistiken über Organisationsentwicklung

    • Rückkopplungen zur Kosakenforschung (Verifikation, Neuanstöße)

Probleme

  • Historische Veränderung vs. Statik elektronischer Systeme

    • Abbildung von Veränderungen

    • Transparentmachen von Veränderungen

    • Vergleichbarkeit von Daten sicherstellen

  • Unschärfen in der Begrifflichkeit …​

    • …​ in historischen Quellen

    • …​ in unserem modernen Denken

  • Diffuser Datenbestand

    • Daten sind nicht immer repräsentativ (v.a. in steppennahen Regionen)

    • Register im 17. Jh. spiegeln nur eine Vollständigkeit vor

  • Banalitäten:

    • Schreibweisen von Namen

    • Nicht zweifelsfreie Zuordnung von Daten zu Strukturen

    • Lokalisierung von Geschehenem

Meilensteine

  • 1984 - Karteikasten

  • 1986 - Versuche in BASIC

  • 1987-1996 - WordPerfect Text-Datei (ca. 1.500 Seiten)

  • 1997-2015 - PHP4 - Beginn der Entwicklung auf LAMP-Basis

  • 2003 - 1. Auftritt im www

  • seit 2017 - PHP7

1984: Karteikasten

  • Erste Form der Erfassung

  • Intensive Verwendung von Abkürzungen

  • Strukturen:

    • Stand (Adelig: Ja/Nein)

    • Grundbesitzer (Ja/Nein)

    • Dienstdaten

  • Probleme:

    • keine Auswertungen und Suche möglich

    • Zugriff nur über Person möglich

Kalynovs'kyj resized

1986: Intermezzo - Programmierung mit BASIC

Basic Listing[1]
10 INPUT "Geben Sie bitte Ihren Namen ein: ", A$
20 PRINT "Guten Tag, "; A$
30 INPUT "Wie viele Sterne möchten Sie"; S
35 S$ = ""
40 FOR I = 1 TO S
50 S$ = S$ + "*"
55 NEXT I
60 PRINT S$
70 INPUT "Möchten Sie noch mehr Sterne"; Q$
80 IF LEN(Q$) = 0 THEN GOTO 70
90 L$ = LEFT$(Q$, 1)
100 IF (L$ = "J") OR (L$ = "j") THEN GOTO 30
110 PRINT "Auf Wiedersehen";
120 FOR I = 1 TO 10
130 PRINT A$; " ";
140 NEXT I
150 PRINT
  • Versuche auf der Basis einer Vereinsverwaltung aus einer Zeitschrift

  • Erste Standardisierung von Informationen durch Abkürzungen

  • Probleme:

    • Textfelder zu kurz

    • Pflege umständlich

    • Begrenzter Speicherplatz

    • Starrer Zeilencode

  • Naja, - eben BASIC …​

1. Sorry, von dem Programm sind leider keine Code-Zeilen mehr überliefert.

1987-1996: WordPerfect (1)

Für die Dissertation wurde aus der Not eine Tugend gemacht und die Karteikarten in eine 1.500 Seiten große WordPerfect-Datei übertragen …​

  • Strukturierte Erfassung möglich

    • pro Person

    • pro Rang/Organisation durch Listen

  • Suche (nach Namen und Positionen)

  • Über gekennzeichnete Zeilen (1,2 …​) bestanden Filtermöglichkeiten bei Abfragen

  • Probleme:

    • Nur Zugriffe auf Einzelinformationen möglich

    • Doppelte Pflege von Daten für Zweidimensonalität (Person/Listen)

    • Fehlerquote durch "Typer" hoch

    • Abfragen umständlich und begrenzt

1987-1996: WordPerfect (2)

wordperfect Dascenko

  • Strukturierte Personendaten im Kopf

  • Datums orientierte Darstellung der Karriere

  • Erweiterbar

  • Ohne Abkürzungen würde es unübersichtlich

  • Bemerkungen und Kommentare zur Person

wordperfect Poltava

  • Örtliche Register pro Rang möglich

  • Darstellung wie bei George Gayecki

  • Für jede Position steht eine Quellenangabe zur Verfügung

  • 1 Zeile = 1 Eintrag

  • Erfassung auch der Gesandtschaften bzw. Teilnehmer von Gesandtschaften

Ab 1997: LAMP

LAMP ist ein Akronym und steht für die Kombination aus

  • L inux - Betriebssystem

  • A pache - Webserver

  • M ySQL (Maria) - Datenbank

  • P HP - PHP: Hypertext Preprocessor (Programmier- bzw. Skriptsprache).

Die Gründe für die Wahl dieser Umgebung zur Lösung der Probleme waren:

  • Ich war seit Anfang der 90er Jahre auf Linux als Betriebsumgebung umgestiegen,

  • Der Open-Source-Gedanke überhaupt,

  • Die Open-Source-Gemeinde stellte zu einem sehr frühen Zeitpunkt bereits professionelle, kostenlose Entwicklungsumgebungen (IDEs) zur Verfügung,

  • Das Bedürfnis - v.a. ab 1997 - sich technisch weiter zu entwickeln.

seit 1997: Architektur

plantumllamp
Figure 1. LAMP Architektur

Seit 1997: Konsequenzen

Der Einsatz von LAMP zog zahlreiche Konsequenzen nach sich. Man musste lernen:

  • Programmabläufe als Use-Cases (Anwendungsfälle) zu betrachten

  • Zwischen Darstellung, Logik und Daten in ihren verschiedenen Ebenen zu unterscheiden

  • Daten in Objekte bzw. Datentümpel aufzuteilen und ihre Relationen zu organisieren

Schnell (und manchmal sehr schmerzlich zu erfahren) war auch:

  • Traue keinem Code, den Du nicht getestet hast!

  • Daten-Backups sind nicht nur nützlich, sondern lebenswichtig (Im Zweifel sparen sie im Desasterfall viel Zeit :-) )!

  • Für experimentelles Programmieren, aber auch zur Absicherung des jeweiligen Bearbeitungsstands, ist die Nutzung eines Versionierungsmanagement-Systems unabdingbar!

  • Ziehe strikte Linien zwischen Entwicklung, Test und Produktion, indem Du einen Deployment-Prozess initiierst!

1997-2016: PHP4

Weitgehend selbst gestrickter Code unter Zuhilfenahme einer Template-Funktionalität.

if(isset($pid)) {
	$hier_select="polk_id=$pid";
	$org_select="SELECT polk_name AS name, polk_arm AS arm, polk_comment AS comment FROM polky WHERE polk_id='$pid'";
	$template->AddVar("body", "TAG", "PID");
	$template->AddVar("body", "ID", $pid);
	$template->AddVar("noindiv", "ID", $pid);
	$template->AddVar("noindiv", "LEV", "P");
	$string_org="zu diesem <em>polk</em>";
	} elseif (isset($sid)) {
			$hier_select="sotnja_id=$sid";
			$org_select="SELECT sotnja_name AS name, sotnja_comment AS comment FROM sotni WHERE sotnja_id='$sid'";
			$template->AddVar("body", "ID", $sid);
			$template->AddVar("noindiv", "ID", $sid);
			$template->AddVar("noindiv", "LEV", "S");
			$string_org="zu dieser <em>sotnja</em>";
	} elseif (isset($kid)) {
			$hier_select="kurinnja_id=$kid";
			$org_select="SELECT kurinnja_name AS name, kurinnja_comment AS comment FROM kurinni WHERE kurinnja_id='$kid'";
			$template->AddVar("body", "ID", $kid);
			$template->AddVar("noindiv", "ID", $kid);
			$template->AddVar("noindiv", "LEV", "K");
			$string_org="zu dieser <em>kurinnja</em>";
	}

1997-2016: GUI

Hier ein paar Beispiele der ersten Version der "SQL Cossacks"-Webseite (Version 0.75 vom 12.12.2015).

cossack search

carreer

rangspektrum

ra

2017: Migration nach PHP7

Ab 2012 etwa zeigte sich, dass auch die Technik voranschreitet. PHP4 wurde von neueren Versionen abgelöst. Individualcode hat zwar Vorteile, kann aber auf Dauer sehr pflegeaufwendig sein.

Bei der Migration - eigentlich: Neuerstellung - der Webseite auf PHP7 wurden daher folgende zentrale Änderungen vorgenommen:

  • Nutzung eines PHP-Frameworks (Laravel)

  • Strikte Unterscheidung von Entwicklungs-, Test- und Produktivumgebung

  • (nicht dokumentierte) Prozesse zum Release von neuen Versionen

  • Effektivere Nutzung des Versionsmanagementtools git

Inhaltlich erfolgte dann noch

  • Geolokation von Organisationseinheiten

  • Familienbeziehungen

Mehrsprachigkeit

  • Mehrsprachigkeit (Deutsch, Englisch, Ukrainisch und Russisch)

Die russische Version wurde am 21.02.2022 in Reaktion auf die Rede von Vladimir Putin, in der er der Ukraine jegliche kulturelle und nationale Eigenständigkeit absprach, wieder abgestellt.

Russische Nutzer sollten die ukrainische Version nutzen. Vielleicht fördert dies ein tieferes Verständnis für die sprachliche und kulturelle Eigenständigkeit des Nachbarn!

Datenbestand

  • 1988 - 3.000 Kosaken

  • 1988 - 3.800 Karrieredaten

  • 1987 - 10.000 Kosaken

  • 1987 - 12.000 Karrieredaten

  • 2003 - 54.000 Kosaken

  • 2003 - 57.000 Karrieredaten

  • 2017 - 1.200 Gesandte/Botschafter

  • 2017 - 350 Gesandtschaften/Reisen

  • 2022 - 88.000 Kosaken

  • 2022 - 110.000 Karrieredaten

Datenmodell

Der eigentliche Zweck dieses Foliensatzes ist, eine(n) Dritte(n) an die grundlegenden Strukturen der SQL-Cossacks-Webseite heranzuführen.

Wie alles in der Anwendung: Das Datenmodell ist work-in-progress !

  • Kern der Anwendung ist stets die Person bzw. der Dienstdatensatz. Es gäbe vielleicht noch andere Ansätze, aber so tickt SQL-Cossacks eben.

  • Organisation und Beziehungen sind hybrid durch Relationen und Kreuztabellen realisiert.

    • Sie sind damit erweiterbar, konfigurierbar und "flexibel"

  • Relevante Daten sind möglichst in der Datenbank vorzuhalten.

  • Ursprünglich war die Datenbank "einsprachig". Die Herstellung einer durchgängigen Mehrsprachigkeit ist noch in Arbeit.

Wieviel Komplexität will man zulassen ? KIS (Keep-it-simple) vereinfacht - verbaut aber auch Wege ins Detail.

Erkenntnisse

Ein Datenmodell kann nie als abgeschlossen und fest gelten. Beispiele:

  • Eine Unterscheidung in verschiedene Heere oder Loyalitätsgruppen war schon wegen der zahlreichen Gruppierungen während der Rujina notwendig - z.T. existierten hier drei Hetmanate parallel.

  • Regimenter wurden von Zeit zu Zeit umgruppiert, d.h. Sotni wurden von einem zu einem anderen Regiment transferiert. Regimenter aufgelöst, neu gegründet, wieder aufgestellt.

  • Neue Organisationen (z.B. slobidščyna) entstehen, ohne regionale Vorgeschichte, übernehmen aber Kosaken aus früheren Organisationen anderer Gegenden.

  • Bis zur Erfassung eines Registers von 1722 gab es nur männliche Kosaken in der Datenbank; durch die Weiterentwicklung des Registerplatzes zu einem soziologisch-gesellschaftlichen Ordnungsprinzip mussten nun auch weibliche Kosaken aufgenommen werden.

  • Um Verflechtungen innerhalb der Kosakenschaft kenntlich machen zu können, wurden ca. seit 2020 auch Familien eingeführt.

Zentrale Datenobjekte

basisobjekte
  • Basisobjekte sind cossack, military_position und legate - und damit jeweils die Person.

  • "Gesandtschaften" und "Organisationen" sowie Allokationen sind "hybrid" abgebildet:

    • Erst das Zusammenspiel mehrerer Tabellen ergibt die Organisation oder Gesandtschaft,

    • U.U. müssen lokale und organisatorische Ebenen synchronisiert werden,

    • Bei Gesandtschaften werden über cross references Start und Ziel abgebildet.

cossack (1) cossack

"Kosak" ist Kern und Ausgangspunkt für alle Daten in der Anwendung.

class cossack
  • Die ID ist systemweit eindeutig.

  • Namen:

    • Um Kosaken per Namen eindeutig zu indentifizieren, werden modernisierte Einheitsnamen verwendet.[1]

    • Abweichende Schreibweisen von Namen in den Quellen finden in den Bewegungsdaten (military_positions) Berücksichtigung.

    • Für Nutzer aus der Ukraine kann ein Kosak auch über kyrillische Einheitsnamen gesucht werden.

  • Seit 2022 werden auch weibliche Kosaken in der Datenbank vorgehalten.

  • Geburts- und Todesdaten, - nur soweit bekannt.

  • "Region" ermöglicht, auch regionale Einzugsbereiche über den eigentlichen Heimatort hinaus zu verwalten.

1. Zur Anwendung kommt hier die in Deutschland übliche, wissenschaftliche Umschrift (щ = šč).

cossack (2) cossack

Stammdaten zur Person werden auf mehrere Tabellen verteilt:

TabelleInhalt

cossack_relatives

Ordnet einen Kosaken einer Familie (Eltern) zu. Wenn Eltern unbekannt, können immerhin Geschwister dargestellt werden.

cossack_families

Stellt den Kosaken als Oberhaupt einer Familie dar.

residences

Ordnet einen Kosaken spezifischen Dienst-/Wohnorten zu.

remarks

Fließtext zum Kosaken (mehrere Remarks für einen Kosaken möglich).

Beziehungen werden jeweils über die ID des Kosaken und die dazugehörigen Objekt-IDs hergestellt.

cossack (3) Ende cossack

cossacks relations

military_position (1) cossack

Bei den Dienstdaten (military_positions) sind an einigen Stellen sind ganz bewusst Redundanzen bewahrt worden. Die "Normalisierung" wurde hier nicht konsequent angewendet, um nicht vorschnell in die kritische Situation zu gelangen, dass am Ende gar nichts mehr funktioniert.

So sind die wesentlichen Kerninformationen zu einer eingenommenen Dienstposition grundsätzlich in jedem Datensatz enthalten (Felder zu polk, sotnja und kurinnja). D.h. an einem Datensatz kann man erkennen, in welchem Rang, in welcher Einheit und auf welcher Hierarchie-Ebene der Betreffende gedient hat.[1]

Auch die Quellenangaben wurden nicht "normalisiert", d.h. vollständig in eine andere Tabelle ausgelagert.

Das Objekt military_position ist daher (zusammen mit den legates) vom Aufbau und Inhalt her das komplexeste.

1. ACHTUNG Fehlerquelle! Die hybride Einordnung in eine Organisationsstruktur in den Kreuztabellen, kann von der Zuordnung in diesen Datensätzen abweichen!

military_position (2) cossack

basicobjects milpos

military_position (3) cossack

Die Daten sind bewusst "flach" gehalten. Alle Informationen zu einer spezifischen Position sind enthalten:

  • Schreibweise in der Quelle

  • Position/Rang und Ort

  • Hierarchie-Ebene, Fundort (Quelle)

  • Zusätzliche Details (örtliche Unterorganisationen, Registerplatz)

Über Logik im Programm und über Relationen in der Datenbank werden Position, Person und der Fundort in Hierarchien später eingeordnet, z.B.

  • Hierarchie-Ebene über das Feld short_rankposition

  • Über die kurinnja_id, sotnja_id, polk_id erfolgt die Einordnung in das Kosakenheer

Das ist - Datenbank technisch - nicht sauber und kann zu einem späteren Zeitpunkt zu Konflikten und Widersprüchen führen.

legate (1) cossack

Datensätze zur Speicherung von Information über Botengänge (als kurjer) oder Gesandtschaften (poslannyk) sind ähnlich strukturiert, wie die military_positions. D.h. Schreibweise des Namens in den Quellen[1], Position, Hierarchieebene, Zeitraum des Einsatzes und Quellenangaben stimmen überein bzw. sind mit den bereits bekannten Hilfstabellen abzubilden.

Eine Besonderheit besteht darin, dass man in SQL-Cossacks sowohl Gesandten-/Botendienste zu ausländischen Mächten als auch interne, innerkosakische Botengänge erfassen kann.

Vor allem wenn sich Ebenen unter der Het’man-Verwaltung solcher Boten bedienen, muss natürlich auch der Absender eines Botenganges allokiert werden. Diese zusätzlichen Informationen konnten nur unter Zuhilfenahme von sogenannten Kreuz- oder Referenztabellen abgebildet werden.

Mehr hierzu → Hierarchien

1. Achtung ! Da diese in den ersten Jahren nicht mitgeführt wurden, sind nicht für alle Datensätze die Schreibweisen erfasst worden.

legate (2) cossack

basicobjects legates

legations

Die Tabelle legates hält Daten zu Boten- und Gesandtengängen "atomar" vor. Um ganze Gesandtschaften in SQL-Cossacks abbilden zu können, bündelt die Tabelle legations mehrere Gesandte zu einer Gruppe von Personen. Vorteile:

  • Mehrere Gesandte können als Gruppe gebündelt werden.

  • Das Ranking innerhalb dieser Gesandtschaft (z.B. "Kopf" der Gesandtschaft) kann abgebildet werden.

  • Alle Informationen zu einer Gesandtschaft sind gebündelt sichtbar und mischen sich nicht mit anderen Gesandtschaften.

basicobjects legations

Sonstige Tabellen (1)

Bis auf die Hilfstabellen zur Generierung von hierarchischen und regionalen Abhängigkeiten (siehe → Hierarchien) seien noch folgende Tabellen genannt:

TabelleInhalt

users

Verwaltet diejenigen Nutzer in der Anwendung, die das Recht haben, Daten anzulegen, zu ändern und zu löschen (CRUD).

definitions

Hält ein Glossar der verwendeten Begrifflichkeiten, v.a. der genutzten Rangbezeichnungen vor. - Bisherige definitions fokussieren aber leider noch auf die Verhältnisse Mitte des 17.Jh.s.

coss_remarks

Enthält Fließtext zu einzelnen Kosaken. Es können mehrere Bemerkungen von verschiedenen Autoren hinterlegt werden.

hierarchies

Tabelle zur Definition der Führungsebenen (V = vijs’ka, p = polk, etc.)

Sonstige Tabellen (2)

TabelleInhalt

<TABELLE>_comments

Enthält Fließtextkommentare zu einzelnen Datensätzen (Dienstpositionen, Gesandte, Gesandtschaften). Hiermit kann eine Einzelinformation also genauer beschrieben werden.

locations

Tabelle der ukrainischen Ortschaften mit weiterführenden Informationen, inkl. Geo-Lokation.

sources

Bibliographie der genutzten Quellen (vorzugsweise Quellen, nur in wenigen Ausnahmen auch Sekundärliteratur).

statistics

Tabelle zur Zwischenspeicherung von statistischen Werten; dient v.a. zur Entlastung der Datenbank.

weitere

Zu weiteren Tabellen siehe → Hierarchien

Hierarchien und Kreuztabellen

Die "Organisation" der Kosakengemeinschaften wird in dieser Datenbank durch datentechnisch realisierte Hierarchien mittels Kreuztabellen und Referenzen abgebildet.

Zwar sind in jedem Datensatz der military_positions dazu alle Informationen hinterlegt, jedoch werden diese Informationen nur atomar abgerufen. Sobald über die Oberfläche Seiten zur Organisation aufgerufen werden, werden diese Daten anhand der hybrid implementierten Relationen assembliert.

  • Militärische Organisation

    • polksot = Zuordnung der Hundertschaften zu den Regimentern

    • sotkur = Zuordnung der Kurinni zu Hundertschaften

    • polkperiods = Verwaltung der Lebenszyklen von Regimentern

  • Gesandschaften/Botendienste

    • legations = Bündelung von mehreren Kosaken in einer Gesandtschaft sowie aller Daten zu einer bestimmten Gesandtschaft.

Probleme der Hierarchisierung

Jede Hierarchisierung ist in gewisser Hinsicht zweischneidig. Beispiel:

  • Hierarchien können uneinheitlich sein, aber auch abbrechen.

    • najmancy → nur als Regimenter und mehr noch als Gruppen fassbar

    • kompanejcy (nur Regimenter oder auch Untereinheiten ?, Ort der Stationierung belegt, wie erfassen? Nur als Personenverband begreifen?) → Keine Unterorganisation, im 18. Jh. auch lokal

    • Wie umgehen mit den im 18. Jh. für Feldzüge abgestellten Verbänden (Pruth-Feldzug etc.)?

  • Rujina

    • Bekannt sind nur die Loyalitäten einzelner Kosaken.

    • Darf man jeweils gleich ganze Organisationen einem het’man zuschreiben?

  • Soziale Überlagerungen

    • Wie umgehen mit Kosaken, die im 18. Jh. "in Diensten eines polkovnyk stehen"?

    • Wie umgehen mit den im 18. Jh. vorhandenen Kosaken-Pauper (нищетніе и весма убогіе)

Eltern-Kind-Beziehungen (1)

Die einfachste Form der Hierarchiebildung (Über- und Unterordnung) wird über eine gesonderte Spalte (parent_id) in den Tabellen realisiert. Dabei wird bei einer untergeordneten Instanz lediglich die id der übergeordneten in diesem Feld referenziert. Solche Zuordnungen müssen einfach sein, - sind aber auch recht statisch.

Um etwa Untereinheiten nach Waffengattung unterscheiden zu können, können die "Infanterie"-Einheiten gesondert erfasst und dem Hauptregiment zugeordnet werden:

parent child relation

Eltern-Kind-Beziehungen (2): Andere Beispiele

TabelleBeispiel

polk_periods

Unterscheidung von Teilverbänden einer Region mit wechselnden Regimentszentren (Vynnycja, Kam’janec'-Podil’s’k etc.)

vijs’ka

Bündelung von mehreren, unterscheidbaren aber zusammengehörigen Heeresverbänden (Das sivers’ke vijs’ko wird als Teilverband den regulären Kosaken zugeordnet)

ranks

Unterscheidung von hauptamtlichen Amtsinhabern und Stellvertretern (nakazni)

targets

Differenzierung von Gesandtschaften, ob diese nach Moskau abgingen oder etwa nach Putivl’.

Ranghierarchie (1)

Das ursprüngliche Ziel war, Karrieren darstellen zu können. "Karrieren" sind "Auf-" und "Abstieg", d.h. die Einnahme eines Ranges entspricht einer Position auf einer Wertigkeitsskala. Unabhängig davon, dass eine starre Strukturierung immer problematisch ist, muss im System eine Struktur hinterlegt sein, die eine solche Über- und Unterordnung wiedergibt.

Um eine rudimentäre Ordnung herzustellen, musste zunächst eine Abstufung von Rängen auf jeder Führungsebene erfolgen. Diese Abstufung orientiert sich zur Zeit an den von den Kosakengruppen der ersten Hälfte des 17. Jh.s entwickelten Wertigkeiten.[1]

Ein noch ungelöstes Problem ist daher die Abbildung von sich ändernden Wertigkeiten. So war der Rang des osavul in der Anfangszeit bedeutsamer als der des oboznyj.
1. Siehe hierzu: Kumke, Carsten: Führer und Geführte bei den Zaporoger Kosaken, Berlin 1993, S. 251 ff.

Ranghierarchie (2): vertikal

Rangspektrum und Größe eines Verbandes bedingen einander. Kleinere Gruppen, in denen direkte Beziehungen unter den Mitgliedern bestehen, kommen mit ein paar wenigen Rangpositionen aus, während größere Verbände schnell komplexere Führungsstrukturen entwickeln.

Interessant ist aber, dass die Kosaken auf allen Führungsebenen ihre Rangpalette analog aufgebaut haben. D.h. wir finden osavuly sowohl auf kurinnja-, sotnja-, polk- und Heeresebene. Ich spreche deshalb hier von vertikaler Hierarchisierung.

So bot es sich an, alle vorhandenen Positionen einem dreistelligen numerischen Wert (rk_level) zuzuordnen. Dieser Wert unterscheidet sowohl Hierarchieebenen als auch das Ranking der Ränge untereinander:

  • 1 — Heeresebene

  • 2 — Polkebene

  • 3 — Sotnja-Ebene

  • 4/5 — Kurinnja-Ebene

Ranghierarchie (3): horizontal

rankorder
  • Vereinfachte Darstellung !

  • Hauptanführer mit jeweils unterschiedlichen Rangbezeichnungen, aber auf Ebene 00

  • Stellvertreter werden in den gleichen Level eingeordnet.

  • Hierarchisierung wird auch genutzt, um Abfolge der Ränge ganzer Einheiten zu generieren.

  • Stellt man eine "1" den Level-Angaben vorweg, repräsentiert dies die Rangpalette auf Heeresebene.

Ranghierarchie (4)

Die Hierarchisierung auf lokaler bzw. Gruppen bezogener Ebene (Ranghierarchie) und diejenige ganzer Heere (vertikale Hierarchie) wird mithin in einer Datenbanktabelle abgebildet: rankpositions.

Es ist dies ein relativ starres Bett, das in vieler Hinsicht problematisch ist und in bestimmten Fällen zu Intransparenzen führen kann. Beispiele:

  • Der Bedeutungsverlust des osavuls gegenüber dem oboznyj zumindest auf Heeres- und Polk-Ebene Ende des 17. Jh.s wird zur Zeit nicht dynamisiert wieder gegeben.

  • V.a. für irreguläre Einheiten (Söldnerverbände, Aufständische, Einheiten aus dem Zaporižž’ja) müssen Sonderlösungen gefunden werden.[1]

  • Sondererscheinungen, wie die rotmistrzy in polnischen Diensten oder der sotennyj otaman im Register von 1638, blähen die Tabelle auf und sorgen für Intransparenzen.

1. Der košovyj otaman im Zaporižž’ja wird mit dem RK-Level 103 geführt; seine "Organisation" kann nur über weitere einschränkende Anweisungen generiert werden.

Organisation (1)

Während die Ranghierarchie letztlich nur als lineare Über- und Unterordnung von Rangstufen dargestellt wird (in der Tiefe gestaffelt noch durch Levels), stellte sich die Abbildung der Organisation ganzer Verbände als die größere Herausforderung dar:

  • Regimenter existieren zeitlich begrenzt, aber auch über die gesamte betrachtete Periode.

  • Regimenter wechseln in Phasen ihren Bestand

  • Es gab Regimenter, die unabhängig von einem übergeordneten Heer existierten (Aufständische, Söldner)

  • Es gab Unterorganisationen von Regimentern, die aber eine Qualität als Regiment dadurch besaßen, dass für sie ein polkovnyk belegt ist (Infanterie, Armatni).

  • Auch an sich unabhängige Regimenter konnten in einem Abhängigkeitsverhältnis stehen (z.B. Nižyn und Baturyn; Bestandteile des sivers’ke vijs’ko)

  • sotni konnten (z.T. mehrfach) das Regiment wechseln oder aufhören zu existieren.

  • kurinni sind am schlechtesten belegt, können daher nur nach und nach implementiert werden.

Organisation (2)

Die Struktur der Organisationen wird unabhängig von den Personendaten in den military_positions abgebildet.

Kreuz- und Referenztabellen stellen Verbindungen zwischen den einzelnen Ebenen her:

  • Die Zuordnung von kurinni zu ihren sotni erfolgt über die Tabelle sotkur.

  • Die Zuordnung von sotni zu ihren polky erfolgt über die Tabelle polksot.

  • Eine Zuordnung von Regimentern zu Heeresverbänden erfolgt zur Zeit nicht. Gründe:

    • Heeresverbände sind lange Zeit keine starren organisatorischen Gebilde, sondern definieren sich aus (sehr wechselhaften) Loyalitäten zu einem Führer.

    • Die Erfassung der Heereszugehörigkeit war am Anfang zu unstrukturiert.

    • Es wurde keine Lösung gefunden für den Übergang z.B. Brjuchovec’kyjs als Anführer einer Rebellion hin zum späteren het’man.

    • Wegen der fehlenden Stabilität wurde auf eine (äußerst komplexe) Differenzierung verzichtet.

Organisation (3): sotni-kurinni-Beziehung

Die Zugehörigkeit von kurinni zu sotni ist über die Kreuztabelle sotkur realisiert. Sie ordnet eine kurinnja einfach einer oder mehrerer Hundertschaften zu.

Gründe:

  • kurinnja-Zugehörigkeiten werden im 17. Jh. höchstens im Rahmen von Registern genannt. Wenn unbekannt, wurden die Kosaken der kurinnja der Hundertschaftszentrale zugeordnet.

  • Da ein Wechsel einer kurinnja zwischen einzelnen Hundertschaften selten belegt ist, wurde die Zugehörigkeit nicht durch eine Zeitangabe differenziert.

Durch die sotni_kurinni-Beziehung können alle zu einer sotnja gehörigen kurinni gelistet werden; umgekehrt können zu einer kurinnja alle sotni aufgeführt werden, zu denen die kurinnja einmal gehört hat.

Das Listing von Kosaken auf kurinnja-Ebene listet grundsätzlich alle Kosaken auf, die für den jeweiligen Ort belegt sind. Es gibt keine Substrukturen, die etwa Rücksicht auf Heeres- oder Polkzugehörigkeit nehmen.

Organisation (4): Regimenter

polky standen immer im Fokus politischer Ordnungstätigkeiten der kosakischen Führung, aber auch der teilweise rebellierenden Untergebenen. Mitunter gibt es keine signifikanten Unterschiede zwischen Regimentern und (Aufstands-)Heeren. Zuschnitt, Zusammensetzung und letztlich Größe eines Regiments waren daher immer Ergebnisse lokaler oder allgemein politischer, aber auch militärisch strukturierender Eingriffe.

Änderungen an der Existenz oder am Bestand der Regimenter gehören damit zu jenen Ereignissen und Strukturen, die auch in einem System nachverfolgt werden sollten.

Die Rolle der Regimenter ist nicht zu unterschätzen: Sie hatten eine nennenswerte Größe, die in den Frühzeiten der eines ganzen Heeresverbandes entsprechen konnte.

Hinsichtlich der Hierarchisierung sind zwei Ebenen zu unterscheiden:

  1. Die Über- und Unterordnung zweier Regimenter

  2. Die Anzahl und Zusammensetzung der den Regimentern beigegebenen sotni

Organisation (5): Über-/Unterordnung

Eltern-Kind-Beziehungen wurden dort angewendet, wo gleichwertige Regimenter (z.T. mit eigenem polkovnyk) in einer Über- und Unterordnungsbeziehung standen.

  • Die einfachste Form stellen seit dem Ende der Rujina (ca. 1670) die Spezialisierung in einzelnen Waffengattungen dar. Artillerie-, Infanterie- (meist einfache Söldner) und Reiter- sowie Kriegszugsverbände verfügten nicht selten über eigene polkovnyky und ihnen beigegebene subalterne Anführer.

  • Es gab aber auch Erscheinungen, wonach sich auf der Ebene der staršyna lokale Identitäten bzw. politische Konglomerate manifestierten: So standen die Regimenter von Nižyn, Černihiv, Baturyn etc. in einem beständigen Austausch und Über- und Unterordnungsverhältnis.[1]

  • Ein weiterer (mehr: technischer) Aspekt sind Regimenter mit stark wechselnden Zentren und Bezeichnungen: Vynnycja, Podil’s’kyj Regiment.

Solche einfachen Unterordnungsbeziehungen wurden innerhalb der polky-Tabelle mit einer → Eltern-Kind-Beziehung abgebildet.

1. Dieses Phänomen und der damit vorbundene Titel des sivers’kyj het’man-Dynastie der Zolotarenki in den 1650er Jahren scheint mir immer noch nicht ausreichend erforscht zu sein.

Organisation (6): polky - sotni-Beziehungen

Die Zuordnung von Hundertschaften zu Regimentern erfolgt analog zu den → sotni-kurinni-Beziehungen mittels der Kreuztabelle polksot.

Im Unterschied zu der statischen kurinni-Beziehung wurde polksot-Zuordnung jedoch durch Zeitraum-Informationen dynamisiert. Auf diese Weise können temporäre Reorganisationen und Zwischenzustände sehr gut abgebildet werden.

Das folgende Beispiel zeigt, dass die sotnja Bilocerkivka (ID 49) mehrfach zwischen den Regimentern Poltava (ID 47), Kremenčuk (ID 27) und Myrhorod (ID 33) gewechselt ist.

polksot

Gesandte und Kuriere

  • Kosaken haben auf allen Ebenen mit allen Ebenen inländischer und ausländischer Obrigkeiten kommuniziert.

  • Bloße Start-Ziel-Definitionen reichen deshalb nicht aus, wenn

    • sowohl die Hierarchie-Ebene des Ziels (Zar von Moskau, nachgeordneter Verwalter in Putivl')

    • als auch die Hierarchie-Ebene des Starts (siehe die intensiven autonomen Kontakte zwischen allen Ebenen der Kosaken mit russischen Instanzen)

    • als auch der innerkosakische Informationsaustausch auf verschiedenen Ebenen

variieren können.

Das alles muss nicht nur implementiert, es muss auch sichergestellt werden, dass bei der Eingabe der Daten Transparenz für den Anwender gewahrt bleibt.

Die zur Zeit implementierte Lösung deckt die Anforderungen zwar ab, - sie ist aber m.E. nicht besonders transparent. Spätere Änderungen/Vereinfachungen sind nicht ausgeschlossen.

Implementierung

Im Unterschied zur Tabelle military-positions, in der alle Informationen zur Heimatorganisation in einem Datensatz enthalten sind, verweisen die legates-Daten sowohl für die Start- als auch die Zieldefinition auf Kreuztabellen.

Die Start-Definition erfolgt über das Feld allocaction-id als Fremdschlüssel auf die Tabelle allocations. Die Definition des Ziels verweist über einen weiteren Fremdschlüssel auf eine Kreuztabelle target-refs über das Feld target-refs-id.

Während die allocations-Tabelle über die Felder vijsko_id, polk_id und sotnja_id die Entsendeorganisation allokiert, verweist die Kreuztabelle target-refs

  • bei ausländischen Zielen auf die target-Tabelle oder

  • bei innerkosakischen Zielen auf die allocations-Tabelle.

Start-/Zieldefinition

Die folgende (vereinfachende) Darstellung gibt die Beziehungen nochmals wieder:

relations legate

Über- und Unterordnung

Die Über- und Unterordnung erfolgt

  • bei ausländischen Zielen mittels Eltern-Kind-Beziehung (target-Tabelle)

  • bei intern-kosakischen Zielen mit der Kombination aus vijsko, polk und sotnja (allocations-Tabelle)

  • das Ranking[1] innerhalb einer Gesandtschaft erfolgt über das Feld sequence in der legates-Tabelle sowie

  • zusätzlich über die Rangbezeichnungen (v — vijs’kovyj, p — polkovyj, etc.).

Eine Bündelung der legates-Daten zu Gesandtschaften erfolgt über einen Fremdschlüssel in jedem legate-Datensatz auf die legations-Tabelle.

1. Gemeint ist hier, dass etwa zwischen dem Gesandschaftsführern und seinem zugehörigen Tross unterschieden werden kann.

Laravel / PHP-Framework

Datenhaltung und Ablagestrukturen sind natürlich nicht alles an einer Anwendung. Sie spielt aber eine zentrale Rolle in der Gestaltung, und, ja, ich habe kaum auf vergleichbare Projekte in den Geisteswissenschaften zurückgreifen können.

Mit der Migration ab 2018 bin ich auf das PHP-Framework Laravel umgestiegen. Meine Hoffnung bestand darin,

  • auf professionelle Module ohne eigenes Programmieren zurückgreifen zu können,

  • den eigenen Programmieraufwand zu senken,

  • Stabilität in der Software durch klare Releasezyklen zu erzielen,

  • mehr Standards als Individualcode zu nutzen, um auch andere Menschen beteiligen zu können.

Hilfestellungen

Auf das Zusammenspiel von Daten und Skriptcode soll hier nicht weiter eingegangen werden. Vielleicht werde ich den Ansatz in einem anderen Foliensatz skizzieren. Für einen kurzen Blick in die Möglichkeiten der jetzt genutzten Infrastruktur des Frameworks Laravel sei zunächst auf folgende Hilfestellungen verwiesen:

Offene Punkte

Es ist schon öfter darauf hingewiesen worden, dass die Anwendung auch nach so langer Zeit

  • weder vollendet worden ist

  • noch alle Probleme behoben bzw. geklärt worden sind.

Bei allen Problemen darf nicht vergessen werden:

Es besteht die Gefahr, dem Nutzer eine Datengenauigkeit vorzuspiegeln, die es nicht gibt ! An bestimmten Stellen stösst man immer auf Unschärfen, die nicht zu vermeiden sind.

Hier eine Aufstellung.

Offene Punkte (1): Lokalisierung von Kosaken

Sofern Quellen verarbeitet werden, bei denen es sich nicht um Register, Eideslisten oder Konskriptionsverzeichnisse handelt, ist eine Lokalisierung eines Kosaken bis hinunter zur kurinnja häufig nicht möglich. In diesen Fällen sind zwei verschiedene, leider nicht konsequent angewandte Zuordnungsverfahren vorgenommen worden:

  1. Zuordnung immer zum Zentrum der nächst höheren bekannten Einheit → Ist nur das Regiment bekannt, dann wird der Kosak auch der sotnja und der kurinnja des Regimentszentrums zugeordnet (Polk: Poltava, Sotnja: Poltava, Kurinnja: Poltava).

  2. Ähnliches Verfahren, nur dass zwischen eindeutiger Zuordnung und mutmaßlicher Zuordnung unterschieden wird, indem für jeden Ort ein eigener Datensatz verwendet wird → Regiment: Poltava, Sotnja: [Poltava], Kurinnja: [Poltava]

Es gibt in diesen Feldern nie den Wert NULL !

Mit beiden Varianten bin ich nicht glücklich. Ich neige zur Zeit dazu, es bei der ersten Variante zu belassen. Zumal die zweite Variante nicht sauber implementiert ist.

Offene Punkte (2): Irreguläre Einheiten

Die Abbildung irregulärer Einheiten erfolgt zur Zeit damit, dass sie - irgendwie - in das vorgegebene Organisationsschema eingebettet werden. Erkennbar wird dies nur an den Bezeichnungen und insgesamt schlecht ausgeprägten oder nicht stimmigen Organisationsstruktur.

Solche irregulären Einheiten sind etwa:

  • Hoftruppen / Angehörige privater Armeen

  • Aufständische Einheiten mehr bäuerlichen Charakters

  • Söldner im Dienste der Kosaken (v.a. seit den 1660er Jahren)

  • Ganze Verbände während der Zeit der Rujina

Auch die "Umsetzbarkeit" der implementierten "Organisation" darf im übrigen nicht soweit übertrieben werden, dass man - wie noch heute vereinzelt in der Literatur sehen kann - von XXX_ZARUBA sprechen könnte.

Offene Punkte (3): Soziale Schichtung

Die Abbildung sozialer Schichten erfordert eine noch höhere Dynamik, als sie vom jetzigen System geleistet werden kann.

Im Gegensatz zu meinem ursprünglichen Vermutungen muss ich heute feststellen, dass es nach wie vor an klaren Definitionen sozialer Schichtung und v.a. für deren Übergänge mangelt. Wir befassen uns hier mit einer Ära tiefgreifender Verwerfungen und Umschichtungen. Strukturen, die für eine - begrenzte - Zeit gültig gewesen sein mögen, wandeln sich, kommen in Bewegung und reorganisieren Gesellschaft in kurzer Zeit zu einem völlig anderen Kontext.

Bisherige Ansätze, die nach Stabilität suchten, wo es keine gab, setzen

  • entweder die Ausgangspunkte sozialer Strukturen zu statisch an (z.B. Suche nach Adligen in der kosakischen Gesellschaft → sog. Kosakenchroniken) oder

  • definierten sie vom Endpunkt der Entwicklung her (z.B. die Entstehung der staršyna oder der znatni tovaryšči).

Daran ändert auch nichts, dass für die kosakische Selbstdefinition stets alte Kontexte herangezogen wurden. Führung war ohne Adelsprivileg kaum denkbar; der Dienstgedanke wurde - auf lange Sicht - als weniger privilegierend angesehen, als die Vererbbarkeit von Hervorgehobenheit.

Ausblick

Die Entwicklung der Anwendung ist noch nicht abgeschlossen. Einige Features aus der früheren PHP4-Umgebung sind noch nicht umgesetzt und, ja, es gibt inhaltlich noch zahlreiche Features, die der Realisierung bedürfen. Beispiele:

Kurzfristig:

  • Bessere, mehr statistische Überblicke und Auswertungen

  • Export von Abfragen in pdf-Datei zum Download

  • Darstellung ganzer Gesandtschaften (wenn mehr als nur ein Kosak als Kurier oder Gesandter eingesetzt wurde)

Langfristig:

  • Möglichkeiten über die GUI Datensätze verschiedener Kosakeneinträge zusammenzuführen.

  • Implementierung "sozialer Zugehörigkeit" (mit Datum und Quellenangabe, hohe Spannbreite)

  • Massenimport von Daten

  • und, und, und …​

Wünsche: Daten

Das Register von 1649 (Bodjanskij-Ausgabe) habe ich noch manuell abgetippt. Inzwischen gibt es zahlreiche Veröffentlichungen von Registern und Konskriptionslisten, die eigentlich elektronisch vorliegen müssten.

Es wäre schön, wenn sich die Herausgeber entschließen könnten, mir die den Publikationen zugrunde liegenden Dateien überlassen könnten. Dann könnte ich diese Daten ohne Abtippen in die SQL Cossacks aufnehmen.

Geschafft ? Nein !!

Dieser Foliensatz entstand u.a. deshalb, weil ich jetzt 65 Jahre alt bin.

Deshalb suche ich schon jetzt engagierte, Technik affine Geisteswissenschaftler mit einem Interesse (und Spass) daran, die Entwicklung und Pflege dieser Anwendung fortzusetzen.

© cku, 01.12.2023

Verwendete Hilfen

Dieser Foliensatz

Allen Mitwirkenden an diesen Tools der Open Source-Gemeinde sei hiermit Dank ausgesprochen !