KEPLIN Docs

Beziehungen und Enums

Tabellen miteinander verbinden — Kardinalität, Navigators, physische und virtuelle Beziehungen — und die Wertemenge eines Feldes mit einem Enum schließen.

Eine Tabelle für sich speichert eine Liste. Eine Anwendung braucht mehr: dass die Kontakte wissen, zu welchem Konto sie gehören, dass die Opportunities wissen, wem sie gehören, dass ein Feld estado nur die Zustände annimmt, die es gibt.

Das sind die beiden Bausteine dieser Seite: die Beziehungen, die Entitäten miteinander verbinden, und die Enums, die die Menge der möglichen Werte eines Feldes schließen.

Die Beziehungen

Im Modelldiagramm ist jede Beziehung eine Linie zwischen zwei Entitäten, mit einer Beschriftung, die den Namen des Pfades und die Kardinalität nennt — in der Kundenverwaltung conta · 1:N zwischen Contas und Contactos, und eine gleiche zwischen Contas und Oportunidades.

Das Modell der App Kundenverwaltung: die Entitäten Contas, Contactos und Oportunidades, mit den beiden Beziehungen dazwischen.
Das Modell der App Kundenverwaltung: die Entitäten Contas, Contactos und Oportunidades, mit den beiden Beziehungen dazwischen.

Eine Beziehung hat immer zwei Seiten:

  • Die Child-Seite, die die Referenz hält — die Spalte conta_id der Tabelle contactos.
  • Die Parent-Seite, die referenziert wird — die Spalte id der Tabelle contas.

Eine Beziehung anlegen

Beziehungen werden im Diagramm gezeichnet, indem man ein Feld mit einem anderen verbindet:

  1. Fahren Sie mit der Maus über das Feld der Child-Seite — die Zeile antwortet mit dem Hinweis Auf ein Feld einer anderen Tabelle ziehen, um zu verknüpfen.
  2. Ziehen Sie von diesem Feld bis zum Feld der Parent-Seite (typischerweise der Primärschlüssel der anderen Entität) und lassen Sie los.
  3. Es öffnet sich der Dialog Neue Beziehung, bereits mit beiden Entitäten und beiden Spalten ausgefüllt — sie kamen aus dem Ziehen und werden dort nicht bearbeitet.
  4. Füllen Sie den Rest aus (siehe unten) und bestätigen Sie mit Beziehung erstellen.

Die Kardinalität

Das erste Feld des Dialogs ist die Kardinalität — wie viele auf jeder Seite:

Option Wann man sie verwendet
One-to-many (1:N) Ein Konto hat mehrere Kontakte. Der häufigste Fall.
Many-to-one (N:1) Dasselbe, von der anderen Seite gesehen.
One-to-one (1:1) Ein Datensatz zu einem Datensatz — ein Konto und sein Steuerdatenblatt.
Many-to-many (N:N) Viele zu vielen — Etiketten an Konten, Trainer in Kursen. Braucht eine Verknüpfungstabelle.

Je nach Wahl zeigt der Dialog Child (hält den FK) und Parent (referenziert) — oder, im Fall N:N, Entität A und Entität B.

Die Navigators

Die beiden nächsten Felder sind die Navigators — das Herz der Beziehung und das, was sie außerhalb des Diagramms nützlich macht.

Ein Navigator ist ein virtuelles Feld, das in der Datenbank nicht existiert: Er dient dazu, von einem Datensatz zu den verwandten Datensätzen zu springen und die Spalten der anderen Seite in den APIs mitzubringen. Sie sind es, die eine Abfrage von Kontakten dazu bringen, zu jedem Kontakt auch den Namen des Kontos zurückzugeben, zu dem er gehört — ohne zweite Abfrage und ohne Code.

  • Navigator in Contactos → Contas — der Weg vom Child zum Parent. Ein Name im Singular: conta.
  • Navigator in Contas → [Contactos] — der Weg vom Parent zu den Children. Ein Name im Plural: contactos. Die eckigen Klammern in der Beschriftung sagen, dass diese Seite eine Liste zurückgibt.

Eines der Felder leer zu lassen ist eine legitime Entscheidung: Diese Seite wird dann schlicht nicht bereitgestellt. Wenn niemand von einem Konto zu seinen Kontakten gehen muss, legen Sie den Weg nicht an.

Auf der Karte der Entität erscheinen die Navigators im Abschnitt Navigation, mit dem Namen links und dem Ziel rechts — in eckigen Klammern, wenn es eine Liste ist.

Die Entität Contactos mit dem Abschnitt Navigation: der Navigator conta führt zum Datensatz des Kontos, zu dem der Kontakt gehört.
Die Entität Contactos mit dem Abschnitt Navigation: der Navigator conta führt zum Datensatz des Kontos, zu dem der Kontakt gehört.

Dica

Behandeln Sie die Namen der Navigators als Teil der Sprache der App: conta, contactos, linhas, responsavel. Sie sind es, die Sie in den APIs, in den Datastores der Bildschirme und im Code der Ereignisse lesen werden — und ein heute schlecht gewähltes fk_ct_2 ist für immer Verwirrung.

Physisch oder virtuell

Das Feld Typ der Beziehung entscheidet, ob die Beziehung auch in die Datenbank geschrieben wird:

Option Was sie tut
Virtuell — nur im Modell der Plattform Die Beziehung existiert für die Plattform: Navigators, APIs, Bildschirme. Die Datenbank wird nicht angerührt.
Physisch — erstellt den FK in der Datenbank Zusätzlich zum Modell wird der Fremdschlüssel in der Engine angelegt: Von da an weist die Engine selbst eine conta_id zurück, die es nicht gibt.

Die physische Beziehung ist sicherer — die Integrität hängt nicht mehr davon ab, wer schreibt. Die virtuelle ist das, was bleibt, wenn man das Schema der Datenbank nicht anfassen kann (oder will): Datenbanken Dritter, mit anderen Systemen geteilte Tabellen, historische Daten, die die Prüfung nicht bestehen würden.

Beim Löschen des Parents

Beim Löschen des Parents (ON DELETE) sagt, was mit den Children geschieht, wenn der Parent-Datensatz gelöscht wird:

Option Was passiert
Nichts (blockiert, wenn es Children gibt) Das Löschen schlägt fehl, solange es Children gibt.
Restrict — blockiert sofort Dasselbe, sofort geprüft.
Cascade — löscht die Children Das Konto zu löschen löscht seine Kontakte und seine Opportunities.
Set NULL — löst die Children Die Children bleiben ohne Parent (die Spalte wird leer). Setzt voraus, dass die Spalte leer sein darf.

In einer physischen Beziehung wird diese Regel von der Engine durchgesetzt. In einer virtuellen bleibt sie im Modell gespeichert und gilt, sobald die Beziehung eines Tages materialisiert wird.

Atenção

Cascade ist bequem und ist unumkehrbar: Ein Konto zu löschen nimmt Kontakte, Opportunities und alles mit, was daran hängt. Bei Geschäftsdaten ist es üblich, Nichts vorzuziehen und das Löschen als Prozess zu behandeln — gelöscht wird nur, wer nichts Abhängiges mehr hat.

Viele-zu-viele

Mit Many-to-many (N:N) verlangt der Dialog drei weitere Angaben, weil eine solche Beziehung eine Tabelle dazwischen braucht (die Verknüpfungstabelle), mit je einer Referenz pro Seite:

Feld Was es ist
Verknüpfungstabelle Die Tabelle, die beide verbindet — zum Beispiel conta_etiqueta.
Spalte → A (Child) Die Spalte der Verknüpfung, die auf die erste Entität zeigt.
Spalte → B (Parent) Die Spalte der Verknüpfung, die auf die zweite zeigt.

Die Verknüpfungstabelle muss vorher existieren: Legen Sie sie an wie jede andere (siehe Tabellen und Felder).

Beziehungen, die schon fertig kommen

Beim Import einer Tabelle ins Modell kommen die Fremdschlüssel, die in der Datenbank bereits existieren, von selbst als Beziehungen mit, mit Navigators, die aus den Namen der Tabellen vorgeschlagen werden. So kam die Kundenverwaltung zu ihren beiden Beziehungen — man muss nur prüfen, ob die Namen der Navigators die sind, die Sie im Rest der App lesen wollen.

Eine Beziehung entfernen

Klicken Sie im Diagramm auf die Linie der Beziehung und bestätigen Sie. Die Frage ist eindeutig: Diese Beziehung aus dem Modell entfernen? — und die Antwort ebenso: Die Beziehung verlässt das Modell der Plattform, und ein bereits in der Datenbank erstellter physischer FK wird NICHT entfernt. Wenn Sie den Fremdschlüssel in der Engine wirklich rückgängig machen wollten, dann geschieht das in der Datenbank.

Wofür sie danach gut sind

Ist die Beziehung angelegt, taucht sie überall auf:

  • In den APIs, als verschachtelte Felder: Eine Abfrage von Kontakten kann conta { nome, cidade } zurückgeben.
  • In den Datastores der Bildschirme, um Master-Detail zu bauen — die Tabelle der Kontakte, gefiltert nach der id des geladenen Kontos (siehe Datastores und Daten).
  • In der Integrität der Daten, wenn die Beziehung physisch ist.

Die Enums

Ein Enum ist eine geschlossene Wertemenge für ein Feld: Der estado eines Kontos ist Aktiv, Ausgesetzt oder Verloren, und sonst nichts. Statt das Feld freien Text annehmen zu lassen — und mit „aktiv“, „Aktiv“, „AKTIV“ und „activo“ in derselben Spalte zu enden — deklariert man die Menge einmal.

Ein Enum anlegen

Das Enum entsteht an der Spalte, in dem Moment, in dem Sie ihr den Typ geben:

  1. Wählen Sie im Dialog Neue Tabelle (oder in Struktur bearbeiten) die Spalte aus.
  2. Wählen Sie unter Typ den Wert enum.
  3. Es erscheint der Kasten Enum-Einträge. Klicken Sie für jeden Wert auf Eintrag hinzufügen.
  4. Füllen Sie die drei Spalten jedes Eintrags aus:
Spalte Was es ist
Wert Der gespeicherte Wert. Buchstaben, Ziffern und _, beginnend mit einem Buchstaben — konventionell in Großbuchstaben: ATIVO, EM_ANALISE.
Label Der Text, den die Leute sehen: Aktiv, In Prüfung.
Farbe Eine optionale Farbe, die von den Widgets genutzt wird, die Zustände einfärben (das Kanban, die Formatierungsregeln).

Eine Spalte vom Typ enum öffnet die Enum-Einträge — jeder Eintrag mit Wert, Label und Farbe.
Eine Spalte vom Typ enum öffnet die Enum-Einträge — jeder Eintrag mit Wert, Label und Farbe.

Jede Aufzählungsspalte hat ihr Enum, und dessen Name leitet sich aus Tabelle und Spalte ab — die Spalte tipo der Tabelle actividades ergibt das Enum ActividadesTipo.

Nota

In der Datenbank wird eine Enum-Spalte in einem strukturierten Feld gespeichert — der Kasten selbst weist darauf hin: In der DB wird ein JSON-Feld gespeichert (1 oder N Werte). Das ist es, was dasselbe Feld heute für eine Einfachauswahl und morgen für eine Mehrfachauswahl taugen lässt, ohne das Schema zu ändern.

Ein Enum ändern

Öffnen Sie Struktur bearbeiten an der Tabelle erneut, wählen Sie die Spalte aus und bearbeiten Sie die Enum-Einträge: hinzufügen, das Label ändern, die Farbe ändern, mit dem × entfernen. Bestätigen Sie mit Änderungen anwenden.

Das Label oder die Farbe zu ändern ist ungefährlich — das ist nur Darstellung. Einen Wert zu ändern oder zu entfernen ist es nicht: Die Datensätze, die den alten Wert hatten, behalten einen Wert, den das Enum nicht mehr kennt.

Der Typ `enum` in der Liste der Spaltentypen, neben den normalen Typen.
Der Typ `enum` in der Liste der Spaltentypen, neben den normalen Typen.

Wo die Enums auftauchen

Ein Aufzählungsfeld hört in der ganzen Plattform auf, freier Text zu sein:

Wo Was sich ändert
Im Diagramm Das Feld erscheint kursiv, mit dem Namen des Enums anstelle des Typs.
In den APIs Das Feld bekommt einen Typ mit festen Werten, und die API weist jeden Wert außerhalb der Liste zurück.
Im Widget Auswahlliste Unter Quelle der Optionen wählt man Enum aus dem Modell und danach das Enum-Feld — die Optionen und die Labels kommen aus dem Modell, und es gibt keine Listen, die an zwei Stellen gepflegt werden müssen.
Im Kanban Unter Quelle der Spalten erzeugt die Option Enum eine Spalte pro Enum-Wert, gleich mit den Farben.
In den Formatierungsregeln Die Bedingungen vergleichen mit den Werten des Enums.

Dica

Immer wenn ein Feld eine bekannte Wertemenge hat — Status, Typ, Priorität, Kanal — machen Sie ein Enum daraus statt eines Textfeldes. Sie gewinnen die übersetzbaren Labels, die Farben, die richtigen Filter und ein Kanban obendrein.

Warum nicht…?

  • Warum kann ich nicht von einem Feld zum anderen ziehen? Das Ziehen beginnt in der Zeile des Feldes der Child-Seite und endet in der Zeile des Feldes der Parent-Seite. Wenn Sie die ganze Karte ziehen, verschieben Sie sie im Diagramm — fassen Sie die Zeile des Feldes an.
  • Warum gibt die API die Daten der verwandten Tabelle nicht zurück? Es fehlt der Navigator auf dieser Seite. Ein leerer Navigator ist eine Seite, die absichtlich nicht bereitgestellt wurde — legen Sie die Beziehung erneut an, mit ausgefülltem Namen.
  • Warum ist das Anlegen der physischen Beziehung fehlgeschlagen? Ein Fremdschlüssel wird nur akzeptiert, wenn die bereits vorhandenen Daten ihn einhalten. Wenn es Children gibt, die auf nicht existierende Parents zeigen, weist die Engine ihn zurück — räumen Sie erst die Waisen auf, oder legen Sie die Beziehung als virtuell an.
  • Warum sehe ich die Beziehung weiterhin, nachdem ich sie entfernt habe? Sie haben sie aus dem Modell entfernt; der Fremdschlüssel in der Datenbank ist weiterhin da, und er ist es, den der erneute Import wieder mitbringt.
  • Warum zeigt mein Enum-Feld den Wert statt des Labels? Das Widget ist nicht mit dem Enum des Modells verbunden — wählen Sie statt einer festen Liste Enum aus dem Modell und zeigen Sie auf das Enum-Feld.