Anne Nühm and the Half-Blood Record //2396

Es war einmal vor vielen, vielen Jahren, als ich noch nicht lange mit Programmieren begonnen hatte, als ich mir eine Datenbank mit meiner Verwandtschaft erstellte, und darauf basierend einige objektorientierte Tools, um Verwandtschaftbeziehungen zu visualisieren, oder Vorfahren und Nachkommen darzustellen.
Diese Datenbank (eine einfache Access-DB, auf die ich über den ODBC-Treiber zugreife) hat rund zweihundert Datensätze. Praktisch alle meine mir bekannten (Bluts-)Verwandten (sowie weiteren Personen, die mit diesen blutsverwandt sind) habe ich aufgenommen. Teilweise gehen sie bis zu meinen Urururgroßeltern zurück, samt allen Nachkommen und ggf. deren Partnern, von denen ich erfahren konnte.
Allmählich wäre es mal an der Zeit, die Datenbank zu erweitern, um auch die Verknüpfung mit Carsten miteinzubeziehen.
Tja .. ich musste leider feststellen, dass mein Datenbankschema dafür nicht ausreichend ist.

Für jede Person gibt es einen indizierten Record mit mehreren Feldern. Es existieren u.a. Felder für Vor-, Nach- und Geburtsname. Im Prinzip könnte man alle möglichen Daten von Adresse bis Geburts- und Todesdaten eintragen, aber da ich solche detailliertere Daten meistens gar nicht kenne, hab ich’s gelassen.
Essentiell sind die vier Felder, in denen die verwandtschaftliche Beziehung zu Eltern, Geschwistern und Kindern als Index auf den jeweiligen Record gespeichert ist.
Bei dem Feld für Mother und Father ist das eindeutig und einfach begreiflich. Damit lässt sich iterativ leicht ein Stammbaum mit den Vorfahren aufbauen. Sobald der jeweilige Index 0 wird, ist die betreffende Person nicht mehr bekannt. Mehr als wenige Generationen zurück kenne ich meine Vorfahren nicht.
So. Ein wenig komplizierter wird es bei Kindern und Geschwistern. Das Schema habe ich mir vom Dateisystem abgeschaut, das auch eine hierarchische Struktur darstellt, in dem eine variable Anzahl von Unterelementen bzw. Subobjekten vorhanden ist. Mutter und Vater hat jeder ja nur jeweils genau einmal. Aber bei Kindern oder Geschwistern steht die Anzahl nicht fest.
Es gibt also in meiner Datenbank ein Feld für das first child, und eines für den next sibling. Um alle Kinder einer Person zu ermitteln, liest man den Index des ersten Kindes, und iteriert dann durch dessen Geschwister, bis man auf den Index 0 trifft. Soweit funktioniert das einwandfrei. Ich lese alle Datensätze ein, erzeuge Objekte, die miteinander verpointert sind und einen großen Objektbaum der Verwandtschaftsbeziehungen bilden.
Zur Demonstration ein Beispiel für eine solche verwandtschaftliche Verknüpfung: Florian.FirstChild.Mother.Father.Mother.FirstChild.FirstChild.NextSibling.FirstChild.NextSibling.NextSibling ist David.
[Ich hatte damals erwogen, ein Feld für den Spouse hinzuzufügen, lies es aber dann sein, weil es nicht notwendig (und ich zu faul) war. Normalerweise lässt sich dieser als anderes Elternteil der Kinder ermitteln, und angeheiratete Verwandte ohne Kinder nahm ich ohnehin nicht in die Datenbank auf.]

Tja, aber jetzt gibt es Schwierigkeiten, die Datenbank zu aktualisieren.
Ich kann ja bereits einen Record für das Baby anlegen, und mich als Mutter zuweisen. Soweit kein Problem. Ich kann auch einen Record für Carsten anlegen, und dem Baby als Vater eintragen. Aber die umgekehrte Verknüpfung kriege ich nicht hin. Carsten’s First Child ist Verena. Verena’s Next Sibling ist Fiona. Ich müsste also das Baby als Fiona’s Next Sibling eintragen. Sie ist aber nur die Halbschwester, hat eine andere Mutter. Meine ganzen schönen Algorithmen brechen dann zusammen oder laufen ins Leere. Die Datenbank wäre nicht mehr konsistent.
Selbst wenn ich über diese eine Schwachstelle hinwegsehe, wird es gruselig, wenn ich irgendwann auch Patrick, vielleicht sogar Nathalie hinzufüge. Oder Raphael. Corinna und Sven ignoriere ich. Genauso wie Friederike und Yvonne. Aber was wird aus Natascha?

In meiner Familie gab es nie solche Probleme. Da hat (zumindest soweit mir bekannt) nie jemand Kinder mit unterschiedlichen Personen in die Welt gesetzt.
Das sind ähnliche Schwierigkeiten, die sich bei der Umsetzung objektorientierter Programmiersprachen mit Mehrfachvererbung ergeben.
Hätte ich meine Datenbank von vorneherein für solche Fälle designt, wäre es damals Overengineering gewesen. Jetzt jedoch weiß ich nicht, wie ich am sinnvollsten weiter vorgehen soll.
Um die Verwandtschaftsverhältnisse in saubere Datenstrukturen abzubilden, müsste ich wohl den next Sibling in eine mütterliche und eine väterliche Linie aufspalten. Bei den allermeisten Records wären beide Werte identisch (es gibt sowieso eine gewisse Ambiguität – so ergäbe alternativ zum obigen Beispiel der Pfad Florian.FirstChild.Mother.Father.Father.FirstChild.FirstChild.NextSibling.FirstChild.NextSibling.NextSibling ebenfalls David ), aber in einigen halt doch nicht, und das verkompliziert die ganze Sache ungemein.



Als Ergänzung ein Auszug aus der Datenbank-Tabelle:

Index Name .. Mother Father FirstChild NextSibling
1 Anne 2 3 200 4
2 Mutter 10 11 1 12
3 Vater 20 21 1 22
4 Sabine 2 3 5 0
5 Robin 4 6 0 7
..
200 Baby 1 201 0 0
201 Carsten 210 211 202 212
202 Verena 220 201 230 203
203 Fiona 220 201 240 ?
..

Über Anne Nühm (breakpoint)

Die Programmierschlampe.
Dieser Beitrag wurde unter Uncategorized abgelegt und mit , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

21 Antworten zu Anne Nühm and the Half-Blood Record //2396

  1. keloph schreibt:

    das thema „patchwork“, mit stief oder halb geschwistern produziert sehr viele ausnahmen zu einem „sauberen“ regelwerk. das war auch früher schon so. denke einfach an die alten königshäuser, bastarde und so weiter. insofern wäre eine dimension die art der beziehung und eine die verbindung zwischen 2 menschen an sich mit dem attribut der beziehungsart…..das wäre dann ein modell, dass jegliche beziehung abbilden könnte? nur wenn 2 personen auf mehrere unterschiedliche weise verbunden sein könnten.

    Like

    • Es war mir immer wichtig, die Datenstruktur möglichst einfach und redundanzarm zu halten.
      Aufgabe der Programme war es gerade, die verwandtschaftlichen Beziehungen dynamisch herauszufinden. Bei aktuell rund 200 Einträgen sind das ja bereits etwa 20000 Beziehungen. So etwas will ich ganz sicher nicht hardkodiert in die Datenbank schreiben. Dazu ist die Software da.

      Gefällt 1 Person

      • keloph schreibt:

        da hast du jetzt glaube ich, meine gedanken missverstanden. aber die klarstellung nähme zu viel zeit und platz in anspruch, ich denke, du wirst das schon richtig machen.

        Gefällt 1 Person

      • carnofis schreibt:

        Und wenn Du in die Hauptdatenbank nur einen Zeiger für jede Person einfügst, die in eine zweite verweist?

        Adolf Hitler hat eine sehr interessante Familienbeziehung. Das wäre wahrscheinlich ein Lehrstück für jeden, der Kreuzbeziehungen sogar in der Verwandtschaft umsetzen möchte.
        Hitler war – so ich mich recht entsinne – Produkt einer Beziehung zwischen Cousin und Cousine. Oder noch näher. Jedenfalls hatte er zu Lebzeiten sehr drauf geachtet, dass über seine Familienverhältnisse nichts herauskommt. Um seinen Stammbaum nachzuvollziehen, muss man hochintelligent sein, oder – wie ich – viel Zeit investieren 🙂

        Ich hatte vor einigen Jahren mal begonnen, eine Datenbank von meinen ganzen Entwicklungen auf Access zu machen. Schätzungsweise 30.000 Daten wären am Anfang angefallen.
        Hat aber nicht gefunzt. Und am Ende war es sinnvoller und leichter, in Excel eine Datenmaske anzufertigen.

        Aber können täte ich es schon gern 😉

        Gefällt 1 Person

        • Und wenn Du in die Hauptdatenbank nur einen Zeiger für jede Person einfügst, die in eine zweite verweist?

          So ist das ja mit den Referenzen auf den jeweiligen Index gedacht.
          Ich hätte das wohl besser ausführlicher erklären sollen, habe aber inzwischen einen Auszug aus der Tabelle oben ergänzt, so dass man sich die Struktur hoffentlich besser vorstellen kann.

          Der Stammbaum mit den Vorfahren ist nicht das Problem. Jeder hat ja genau zwei Eltern, und mit jeder Generation verdoppelt sich die Anzahl der Vorfahren (auch wenn in der Vergangenheit zunehmend Personen mehrfach vorkommen).
          Komplizierter ist es mit den Nachfahren. Zum einen ist die Anzahl der Kinder unterschiedlich (was ich aber mit meinem Algorithmus abgefangen hatte), zum anderen gibt es Halbgeschwister, die nur ein Elternteil gemeinsam haben – und hier haut’s meine Vorgehensweise raus.
          (Übrigens finde ich es faszinierend, wie sich die Anzahl der Nachkommen über mehrere Generationen entwickeln kann: Manche Linien dümpeln so vor sich hin, andere wachsen und gedeihen, und wieder andere sterben ganz aus. Das hat etwas Fraktales.)

          Je nach Datenumfang und Struktur kann eine Excel-Tabelle zweckmäßiger sein als eine Datenbank.
          Datenbanken entfalten erst dann ihr Potential, wenn man SQL-Abfragen braucht.

          Like

          • Engywuck schreibt:

            “ Jeder hat ja genau zwei Eltern, “
            Abgesehen von denen, bei denen der Vater unbekannt ist. Oder auch die Mutter (anonyme Adoption, Mutter bei Geburt ohne Papiere verstorben).
            Von Adoptionen, Stiefeltern (und Adoptionen durch Stiefeltern) ganz abgesehen.

            So einfach ist das leider nicht und genau deshalb gibt es spezialisierte Genealogie-Programme…
            Ist fast so wie Datum/Zeit zu berechnen. Alles ganz einfach. Bis die Ausnahmen kommen.

            Like

  2. blindfoldedwoman schreibt:

    Solche Programme gibt es schon lange online und kostenlos. Vielleicht berücksichtigen sie bereits die gewünschten Angaben.
    Wie weit sind denn die Planungen für Eure Wohnung? Ab dem 7ten Monat wird sowas zu beschwerlich und meist leidet da auch die Konzentrations- und Bewegungsfähigkeit. Ich konnte da z.B. nicht mehr guten Gewissens selbst Auto fahren.
    Oder bleibst Du die erste Zeit jetzt doch im Landhaus?

    Gefällt 1 Person

    • Genealogie-Programme gibt es, die mir aber alle aus unterschiedlichen Gründen nicht zusagen. Deshalb hab ich’s ja selbst gemacht.
      Online möchte ich meine Daten auch ganz bestimmt nicht in einen fremden Server eingeben.

      Es gibt nichts Neues mit der Wohnung. Wir haben da ein paar vage Alternativüberlegungen gemacht, aber es steht noch nichts fest. Ist auch noch Zeit.

      Gerade mit kleinem Kind möchte ich mich sicherlich nicht in ländliche Abgeschiedenheit begeben. Mir ist wichtig, dass alles, was ich vielleicht brauchen könnte, fußläufig (auch mit Baby) erreichbar ist.

      Like

  3. MartinTriker schreibt:

    Umsteigen auf eine neuere SQL Server-Version, mit HierarchyID? Wobei ich es nur kurz angeschaut habe, und nicht durchdacht.

    Like

    • Nein, das würde gar nichts nützen.
      Eine ganz primitiv einfache Access-Datenbank genügt. Eine XML- oder sogar CSV-Datei wäre auch ausreichend gewesen. Ich hab halt damals ein wenig mit Datenbanken herumgespielt.
      Das Problem ist, dass das aktuelle Schema zu wenig Information enthält, da es voraussetzt, dass Geschwister dieselben Eltern haben. Bei Halbgeschwistern passt es nicht mehr.

      Gefällt 1 Person

  4. Plietsche Jung schreibt:

    In deinem Fall geht es doch nur um Visualisierung. Nimm Powerpoint.

    Like

    • Es geht um eine interaktive Anwendung, bei der ich auf einen Namen klicke, und dann sofort sämtliche Vorfahren oder Nachkommen dargestellt werden.
      Mit Powerpoint habe ich die zwei Bilder oben erstellt. Das ist viel zu statisch und man klickt sich zu Tode. Nur sehr eingeschränkt geeignet für meine Zwecke.

      Like

  5. Andy schreibt:

    Ich würde es so machen wie beim SAP-Modul BP (Business Partner). Für jede Person gibt es einen Datensatz, weiterhin für jede juristische oder sonstwie virtuelle Person (z. B. Ehegemeinschaft). Dann gibt es eine Beziehungstabelle mit Beziehungstypen („x ist Mitglied von y“ / „y hat x als Mitglied“, „x ist Kind von y“ / „y hat x als Kind“). Die Eltern-Kind-Beziehung würde ich nur zwischen Ehegemeinschaften oder, allgemein gesprochen, Zeugungsgemeinschaften und natürlichen Personen setzen. Für Zeugungsgemeinschaften mit unbekanntem Vater würde ich Dummy-Väter generieren. Jede Person hat eine GUID, daher können unbekannte Väter namenlos bleiben. Sollte sich eine genetische Identität von zwei namenlosen Vätern herausstellen, wird der Beziehungstyp „x ist identisch mit y“ vergeben. Auf diese Weise kann man auch Patchwork-Familien gut abbilden. Sogar ein ödipusartiges Verwandtschaftsverhältnis („x ist Stiefvater von sich selbst und damit auch Stiefgroßvater etc.“) ließe sich darstellen – was will man mehr? SAP hat hier, wie so oft, sehr weit gedacht.

    Gefällt 1 Person

    • Für meine Zwecke ist das viel zu kompliziert und aufwendig. Da müsste ich alleine für das Füllen der DB mehr Zeit investieren, als sich lohnt. Von der Neuimplementierung meiner SW ganz zu schweigen.

      Nee, ich werde wohl aus dem NextSibling zwei Tabellenspalten machen: NextSibling_M und NextSibling_F. Dafür muss ich die bisherige Spalte nur kopieren, weil die Werte bisher identisch waren.
      Meine Implementierung muss ich noch anpassen, aber das werde ich schon hinkriegen, wenn ich mal Zeit und Muße dafür habe.

      Like

  6. Pingback: #Tweettime //2504 | breakpoint

  7. Pingback: Sex Confusion //2669 | breakpoint

  8. Pingback: Auf Schicksalsspuren //2692 | breakpoint

  9. Pingback: pi gleich pi //3041 | breakpoint

Hinterlasse einen Kommentar