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.

Eine Beziehung hat immer zwei Seiten:
- Die Child-Seite, die die Referenz hält — die Spalte
conta_idder Tabellecontactos. - Die Parent-Seite, die referenziert wird — die Spalte
idder Tabellecontas.
Eine Beziehung anlegen
Beziehungen werden im Diagramm gezeichnet, indem man ein Feld mit einem anderen verbindet:
- 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.
- Ziehen Sie von diesem Feld bis zum Feld der Parent-Seite (typischerweise der Primärschlüssel der anderen Entität) und lassen Sie los.
- 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.
- 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.

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
iddes 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:
- Wählen Sie im Dialog Neue Tabelle (oder in Struktur bearbeiten) die Spalte aus.
- Wählen Sie unter Typ den Wert
enum. - Es erscheint der Kasten Enum-Einträge. Klicken Sie für jeden Wert auf Eintrag hinzufügen.
- 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). |

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.

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.