Verknüpfte Tabellen

Tabellenverknüpfungen – auch Beziehungen oder Relationen genannt – sind eine der wichtigsten Funktionen von Ninox. Dass Sie Tabellen in Beziehung zueinander setzen können, unterscheidet Ninox von vielen anderen Apps, die lediglich die Verwaltung simpler Listen ermöglichen. Zudem sind Relationen ein wesentlicher Unterschied von echten Datenbanken zu Tabellenkalkulationsprogrammen.

Wenn Sie bisher nur wenig Erfahrung mit Datenbanksystemen gesammelt haben, sollten Sie diesen Abschnitt lesen, um zu erfahren welche unterschiedlichen Beziehungstypen es gibt und wie Sie diese am Besten einsetzen.

Grundlagen: Die 1:N-Beziehung

Ninox unterstützt – wie die meisten relationalen Datenbanksysteme – als Grundbaustein sogenannte 1:N-Beziehungen (lies: Eins zu N). Das bedeutet, dass Sie mit dieser Beziehung einem einzelnen Datensatz aus einer Tabelle mehrere Datensätze aus einer anderen zuordnen können.

relations_1N

Ein Beispiel dafür sind Kunden und Rechnungen. Zu einem Kunden können Sie beliebig viele Rechnungen zuordnen. Zu einer Rechnung können Sie aber nur einen Kunden festlegen.

Diese grundlegende Beziehung definieren Sie, indem Sie in der Tabelle Rechnung eine Verknüpfung zur Tabelle Kunde erstellen – die Rechnung verweist auf einen Kunden.

Wenn Sie nun die Formularansichten für Rechnung und Kunde öffnen, sehen Sie, dass im Rechnungsformular ein einzelnes Feld zur Aufnahme des Kunden eingeblendet wird. Im Kundenformular hingegen wird eine eingebettete Tabelle aller zugeordneten Rechnungen dargestellt.

Untertabellen: Die Kompositionsbeziehung

Eine besondere Form der 1:N-Beziehung ist die Komposition. Komposition bedeutet in etwa “besteht aus”. Ein gutes Beispiel hierfür sind Rechnungspositionen. Eine Rechnung besteht aus mehreren Positionen. Wenn die Rechnung gelöscht wird, sind auch die Positionen hinfällig.

relations_composition

Sie können eine Tabellenverknüpfung (auch nachträglich) als Kompositionsbeziehung markieren, indem Sie bei den Feldeigenschaften der Verknüpfung die erweiterten Optionen einblenden und “Komposition” mit “Ja” aktivieren.

Dies hat folgende Auswirkungen:

  • Im Datenmodell wird die Tabelle als Untertabelle der verknüpften Tabelle (Obertabelle) angezeigt, nämlich verschachtelt.
  • Auf der Startseite der Datenbank ist die Untertabelle nicht mehr zu sehen.
  • Beim Löschen eines Datensatzes in der Obertabelle werden alle verknüpften Datensätze der Untertabelle entfernt.
  • In der Formulardarstellung der Obertabelle fehlt die Option “Suchen und hinzufügen” (Lupensymbol) an der Untertabelle.
  • In der Formulardarstellung der Untertabelle fehlt die Option “Verknüpfung aufheben”.

Untertabellen eignen sich gut für Dinge, die fest miteinander verbunden sind; um einige Beispiele zu nennen:

  • Rechnungspositionen gehören unabdingbar zu einer Rechnung.
  • Telefonnummern sind fest mit einem Kontakt verbunden. Wird der Kontakt gelöscht, sollen auch die Telefonnumern entfernt werden – ohne die Kontaktinformation sind sie nicht nützlich.

Gegenbeispiele:

  • Die Mitarbeiter einer Firma sollten nicht als Untertabelle realisiert werden, da sie z. B. die Firma wechseln könnten bzw. unabhängig von der Firma existieren.
  • Rechnungen für einen Kunden
  • Rechnungspositionen sind zwar sinnvollerweise eine Untertabelle einer Rechnung, sollten aber zum Artikel eine ganz normale Beziehung haben.

Beziehungstabellen: die N:M-Beziehung

Manchmal sind 1:N-Beziehungen bzw. Kompositionen nicht ausreichend, um einen Sachverhalt darzustellen. Wie die meisten relationalen Datenbanksysteme unterstützt auch Ninox nicht direkt N:M-Beziehungen. Reine N:M-Beziehungen sind allerdings auch nur in Ausnahmefällen sinnvoll; häufig sollen Beziehungen nämlich noch weiter qualifiziert, also mit weiteren Daten angereichert werden.

relations_NM

Ein Beispiel: In einer Tabelle Firma werden Firmen erfasst. Eine weitere Tabelle Person erfasst Kontkatdaten von Personen. Nun soll zugeordnet werden, welche Person welchen Arbeitgeber hat. Die einfachste Modellierung wäre eine Verknüpfung von Person zu Firma. Wenn Sie allerdings berücksichtigen wollen, dass eine Person auch mehrere Arbeitgeber hat oder diese über die Zeit wechselt, ist dieses Modell nicht hinreichend.

Stattdessen benötigen Sie eine dritte Tabelle, zum Beispiel “Mitarbeiter”. In der Tabelle Mitarbeiter definieren Sie eine Verknüpfung zur Firma und eine weitere zur Person. Beide Beziehungen sollten als Komposition markiert werden, denn wenn die Firma gelöscht wird, hat Sie auch keine Mitarbeiter mehr. Wenn eine Person gelöscht wird, ist diese ebenfalls kein Mitarbeiter mehr.

Hinweise:

  • Obwohl für Mitarbeiter Kompositionsbeziehungen definiert wurden, wird die Tabelle nicht als Untertabelle dargestellt. Offensichtlich kann Mitarbeiter nicht Untertabelle von zwei verschiedenen Obertabellen sein.
  • Beachten Sie die Auswirkungen der Kompositionsbeziehungen auf das Löschen von Datensätzen: Wird eine Person gelöscht, so wird auch der Mitarbeiter gelöscht, nicht aber die Firma. Wird eine Firma gelöscht, werden alle ihre Mitarbeiter ebenfalls entfernt. Allerdings bleiben die Personen unberührt.

Die Tabelle Mitarbeiter ist eine sogenannte Beziehungstabelle, da Sie im Wesentlichen die Beziehung von Personen zu Firmen modelliert. Neben diesem Hauptzweck können Sie die Tabelle nun aber auch nutzen, um die Beziehung um hilfreiche Daten anzureichern. Beispiele wären in diesem Fall Felder für das Eintritts- und Austrittsdatum oder für das Gehalt. In diesem Sinne steht die Tabelle Mitarbeiter also für das Arbeitsverhältnis zwischen Person und Firma oder gar für den Arbeitsvertrag.

Beziehungsgeflechte

Die drei vorgestellten Grundtypen von Beziehungen lassen sich beliebig erweitern. So gibt es keine Einschränkung, auch höherwertige Beziehungen – zum Beispiel zwischen drei Tabellen – zu erstellen.

Hilfreich kann sein, wenn Sie sich beim Design Ihrer Datenbank zunächst eine Skizze auf Papier erstellen.

Malen Sie zunächst alle Objekte, die Sie verwalten wollen, als Kästen auf. Jeder Kasten steht für eine Tabelle. Im zweiten Schritt überlegen Sie, welche Beziehungen zwischen diesen Objekten bestehen. 1:N-Beziehungen können Sie einfach als Pfeil eintragen. Wenn das nicht ausreicht, müssen Sie einen weiteren Kasten für die Beziehungstabelle einfügen.

Achten Sie auch darauf, dass Sie nicht redundante (überflüssige) Beziehungen erstellen: Folgen Sie den Pfeilen: Wenn Sie von einem Kasten A auf zwei unterschiedliche Wege zu einem anderen Kasten B gelangen können, sollten Sie überlegen, ob die beiden Pfade tatsächlich verschiedene Sachverhalte darstellen oder ob Sie hier vereinfachen können.

Zu guter Letzt noch ein Tipp: Versuchen Sie nicht, mit Ihrem Datenmodell alle Eventualitäten zu erschlagen. Manchmal ist es besser, ein einfaches Modell zu verwenden und die ggf. wenigen Ausnahmen durch Kommentare oder andere Hilfsmittel zu kennzeichnen. KISS – Keep It Simple, Stupid.

133 Gedanken zu „Verknüpfte Tabellen

  1. Hallo Ninox Wizards

    Für eine Zeiterfassung habe ich die folgenden drei Tabellen:
    “Zeiterfassung”, “Mitarbeiter” und “Kunden”

    Einem Datensatz der “Zeiterfassung” möchte ich einen “Kunden” (1:N) zufügen
    und mehrere “Mitarbeiter” (M:N –> ??).

    Würde das eine M:N Verknüpfung benötigen?

    Oder gibt es einen besseren Weg?

      1. Hallo Leo
        Die Lösung von Dir ist super für mich! Gibt es eine Möglichkeit, dass in der Tabelle Mitarbeiter ich selbst standardmäßig immer automatisch drin bin?

        Also bei einem neu generierten Datensatz immer standartmässig ein Kontakt mit dabei ist …

        lieber Gruss Gebbo

        1. Hallo Gebbo,
          das geht auch. Angenommen du selbst hast in der Tabelle “Mitarbeiter” die ID “1″. Dann gehst du in der Tabelle “Zeiterfassung” auf “Zahnrädchen”->Felder Bearbeiten… und schreibst ins Feld “Beim neuen Datensatz folgendes Skript ausführen… die Formel:

          let myNR := Nr;
          let NE := (create Einsatz);
          NE.(Zeiterfassung := myNR);
          NE.(Mitarbeiter := 1)

          Grüße
          Leo

  2. Guten Tag,
    folgende Situation. Es gibt eine Tabelle “Texte” und Tabelle “Schlagwörter” diese sind mittels n:m Beziehung über Tabelle “MULTIPLE TAGS” miteinander verknüpft.
    Wenn ich mich in einem Text befinde, sehe ich alle Schlagwörter die zu diesem Text gehören. Dazu präpariere ich die Tabelle MULTIPLE TAGS entsprechend. Genauso kann ich zu jedem Schlagwort die Texte anschauen. Die Datensätze in der Tabelle Texte bestehen aber aus mehreren Felder. Um alle diese Felder anzuschauen muss ich den Datensatz öffnen. Bei n:m Beziehung verhält sich Ninox aber stufenweise und konsequent :
    wenn ich auf einen Datensatz “Texte” in dem Formular “Schlagwörter” klicke, lande ich erstmal in der Tabelle”MULTIPLE TAGS”, dann muss ich nochmal auf mein Text klicken um den Datensatz zu öffnen. So lange man die Datenbank für sich selbst programmiert und alleine nutzt, kann man damit leben. Wenn man aber unerfahrene Leute ins Team einlädt oder sogar die Datenbank als Leistung verkaufen möchte, ist dieses Verhalten für Endanwender schwierig zu verstehen, einfach ein Klick zu viel. Hier wäre ein Trigger “bei Klick” angebracht in dem man z.B. ein popup Fenster aus der m-Tabelle geöffnet wird, ohne nm Formular zu öffnen.

    Grüße
    Leo

      1. Hallo Birger,
        wir reden aneinander vorbei. Hier ist eine Beispieldatenbank.

        https://www.dropbox.com/s/rckrrg4oza9ydfj/MULTIPLE%20TAGS.ninox?dl=0

        Wenn du in der Tabelle MATERIALIEN bist, siehst du ein Material und dazugehörigen Schlagwörter. Nehmen wir z.B. Zement aus. Dort ist “Putz” als einer der Schlagwörter eingetragen, und ich möchte wissen, was es noch zum “Putz” gehört. Ich klicke auf “Putz” und lande erstmal in der Zwischentabelle (MULTIPLE TAGS). Da die Beziehungen als Komposition eingestellt sind, sehe ich hier nur einen Eintrag (Putz) und muss darauf klicken um weiter zu kommen. Jetzt bin ich in der Tabelle TAGS gelandet und sehe alle Materialien, die zu dem Schlagwort “Putz” gehören. Dort sehe ich noch “Sand” und möchte alles über Sand wissen. Ich klicke auf Sand und lande wieder in der Zwischentabelle, wo ich erneut auf Sand klicken muss um zu den Inhalten zu kommen. As meiner Sicht zwei Klicks zu viel.
        Viel eleganter wäre es, wenn ich beim Klick auf Putz direkt in der Tabelle TAGS lande und von dort aus direkt in der Tabelle Materialien.

        Grüße
        Leo

  3. Hallo Ninox-Team,

    ich habe mir nun eine Datenbank “Kunden” erstellt, die mir als CRM-Tool sehr gute Dienste leistet.

    Ich habe eine Tabelle “Projektliste”, die ich über eine 2. Tabelle “Projektzuordnung” mit der Kundendatei verknüpft habe:
    Projektliste Kunde

    Also eine N:M-Beziehung ähnlich Ihrem Beispiel oben bei
    Person Firma.

    Nun will ich diese Tabelle “Projektzuordnung” natürlich mit den bereits bestehenden Daten aus der “Projektliste” und den verknüpften “Kunden” füllen.
    Als Verknüpfungsfeld steht mir im Moment nur der Kundenname zur Verfügung, der in der Datei “Kunden” und in der “Projektliste” identisch ist.
    Wie gehe ich hier vor? Über die Massendatenänderung oder oder doch eher über die Importfunktion, so dass ich alle vorhandenen Projekte aus der Projektliste in dieser Datei habe? Für Ihre Hilfestellung wäre ich sehr dankbar!
    Viele Grüße
    Wolf

    1. Hallo,
      wenn ich es richtig verstehe, dann kann es für einen Kunden ein oder mehrere Projekte geben und andererseits kann ein Projekt einem oder mehreren Kunden zugeordnet sein. Oder ist es doch so, dass es immer genau einen Kunden pro Projekt gibt? Dann wäre eine M:N-Verknüpfung nicht richtig.

      Schreiben Sie mir doch, dann klären wir das: support@ninoxdb.de
      Birger – Ninox Support

Hinterlasse eine Antwort