Das Datenmodell
Die Datenbank der App anlegen, die drei Tabellen des CRM und das Modell mit den Beziehungen, die der Rest der Plattform verwenden wird.
Die App Kundenverwaltung existiert und ist leer. Diese Etappe gibt ihr
das Fundament: die Datenbank, in der die Datensätze leben, die Tabellen
contas, contactos und oportunidades und das Modell, das alles
verbindet — die Karte, die die APIs, die Bildschirme und die Skripte von hier
an lesen werden.
Am Ende dieser Seite haben Sie echte Daten: drei erstellte Tabellen, miteinander verbunden, und eine Konsole, in der die Abfragen Zeilen zurückgeben.
Zwei Schichten, die man besser nicht verwechselt
Keplin arbeitet mit Daten in zwei übereinanderliegenden Schichten. Sie tun Unterschiedliches und werden an unterschiedlichen Orten angefasst:
| Schicht | Was sie ist | Wo man sie anfasst |
|---|---|---|
| Datenquelle | Die Datenbank selbst — die Verbindung, die Tabellen, die Spalten, die Zeilen. | Panel Daten ▸ Datenquellen |
| Modell | Das Abbild dieser Datenbank innerhalb der Plattform: Entitäten, Felder mit Anzeigenamen und Beziehungen. | Der Tab der Datenquelle, im Canvas des Modells |
Der Unterschied ist praktisch. Eine Spalte zu erstellen fasst die Datenbank an. Eine Tabelle ins Modell zu importieren fasst nichts in der Datenbank an — es sagt der Plattform nur „diese Tabelle interessiert mich, und so liest man sie“. Es ist das Modell, das die GraphQL-API der App speist, die Tabellen-APIs und, über sie, die Bildschirme.
Nota
In diesem Leitfaden wird die Datenbank von Grund auf innerhalb der App erstellt. Wenn Ihre Organisation bereits eine Datenbank mit den Kunden darin hat, ist der Weg ab dem Schritt „Die Tabellen ins Modell importieren“ derselbe — registrieren Sie die Verbindung und importieren Sie die vorhandenen Tabellen. Das Kapitel Datenbanken verbinden behandelt diesen Fall.
Die Datenquelle Dados CRM erstellen
Der erste Schritt ist, die Datenbank der App zu registrieren. Da wir nichts Externes verbinden, nehmen wir den Typ, den die Plattform selbst erstellt und zusammen mit der App speichert: Er verlangt weder Server noch Port, Benutzernamen oder Passwort.
Wählen Sie im Arbeitsbereich der App am Fuß der Seitenleiste das Panel Daten.
Klicken Sie im Abschnitt Datenquellen auf den Button + (Neue Datenquelle). Es öffnet sich der Dialog Neue Datenquelle — „Verbinden Sie eine Datenbank mit dieser App. Alles wird ruhend verschlüsselt.“
Schreiben Sie in Interner Name
Dados CRM. Unter genau diesem Namen werden die APIs und die Skripte später im Leitfaden auf die Verbindung verweisen.Öffnen Sie die Liste Typ. Sie zeigt alle unterstützten Engines; wählen Sie die der lokalen Datenbank, der, die bei der App gespeichert wird. Achten Sie darauf, was danach passiert: Die Felder für Server, Port, Benutzer und Passwort verschwinden — es gibt nichts zu verbinden.

Die Liste der Datenbanktypen im Dialog Neue Datenquelle: die sechs unterstützten Engines. Es bleibt ein Feld übrig, Datenbank importieren (optional). Lassen Sie es leer: „Ohne Datei wird eine leere Datenbank erstellt.“ Genau das wollen wir.
Klicken Sie auf Verbindung testen, um es zu bestätigen — die Antwort ist Verbindung OK.
Klicken Sie auf Erstellen. Die Datenquelle erscheint im Baum und ihr Tab öffnet sich sofort, mit dem Canvas des Modells — noch leer.

Atenção
Der Interne Name ist ein Bezeichner, kein Etikett. Ihn später zu ändern
zwingt dazu, die Skripte zu überarbeiten, die db("Dados CRM") aufrufen,
und die SQL-Schritte, die die Verbindung über den alten Namen gewählt
haben.
Die Tabelle contas erstellen
Mit der erstellten Datenquelle entstehen die Tabellen, ohne die Plattform zu verlassen.
- Öffnen Sie im Baum das Menü ⋯ der Datenquelle Dados CRM und wählen Sie Neue Tabelle.
- Schreiben Sie in Name der Tabelle
contas. Lassen Sie Schema (optional) leer. - Schreiben Sie in Beschreibung der Tabelle
Empresas clientes e potenciais clientes. Sie ist optional, aber sie ist das, was Sie in einem Jahr lesen werden. - Die Liste SPALTEN bringt bereits eine Spalte
idmit, vom Typinteger, mit eingeschaltetem Primärschlüssel (PK) und Auto-Inkrement. Lassen Sie sie, wie sie ist — sie ist die Identität jedes Datensatzes. - Klicken Sie für jede neue Spalte auf das + von SPALTEN und füllen Sie Name, Typ und die Schalter aus. Die Tabelle unten sagt, was zu schreiben ist.
- Bestätigen Sie mit Tabelle erstellen. Die Tabelle entsteht in der Datenbank und erscheint fortan im Objektbaum.

Die Spalten der Tabelle contas:
| Spalte | Typ | NULL erlaubt | Wofür sie da ist |
|---|---|---|---|
id |
integer |
nein | Primärschlüssel, mit Auto-Inkrement |
nome |
text |
nein | Der Name des Unternehmens |
nif |
text |
ja | Steuernummer |
sector |
text |
ja | Agrar- und Lebensmittelbranche, Technologie, Gesundheit… |
cidade |
text |
ja | Wo das Unternehmen sitzt |
telefone |
text |
ja | Allgemeine Kontaktdaten |
email |
text |
ja | Allgemeine Kontaktdaten |
estado |
text |
nein | ativo, prospeto oder inativo |
Dica
NULL erlaubt ausgeschaltet heißt in der Datenbank verpflichtend. Reservieren Sie es für das, was wirklich verpflichtend ist — den Namen eines Unternehmens, das Konto, zu dem ein Kontakt gehört. Ein Feld, das heute optional und morgen verpflichtend ist, ändert man im Nu; umgekehrt zwingt es dazu, Daten aufzuräumen.
Die Tabellen contactos und oportunidades erstellen
Wiederholen Sie die Geste — Menü ⋯ der Datenquelle ▸ Neue Tabelle — noch zweimal.
contactos (Beschreibung: Pessoas de contacto de cada conta):
| Spalte | Typ | NULL erlaubt | Wofür sie da ist |
|---|---|---|---|
id |
integer |
nein | Primärschlüssel, mit Auto-Inkrement |
nome |
text |
nein | Name der Person |
cargo |
text |
ja | Geschäftsführer, Einkaufsleiter… |
email |
text |
ja | |
telefone |
text |
ja | |
conta_id |
integer |
nein | Das Konto, zu dem die Person gehört |
oportunidades (Beschreibung: Negócios em curso, por fase):
| Spalte | Typ | NULL erlaubt | Wofür sie da ist |
|---|---|---|---|
id |
integer |
nein | Primärschlüssel, mit Auto-Inkrement |
titulo |
text |
nein | Der Name des Geschäfts |
conta_id |
integer |
nein | Das Konto des Geschäfts |
valor |
real |
ja | Wert in Euro — Zahl mit Nachkommastellen |
fase |
text |
nein | Die Phase des Geschäfts (siehe unten) |
data_fecho |
text |
ja | Voraussichtliches Abschlussdatum, als JJJJ-MM-TT |
responsavel |
text |
ja | Wer das Geschäft betreut |
Die Spalte fase ist eine geschlossene Liste von Werten. Sie wird als
Text gespeichert, und die möglichen Werte sind immer diese sechs:
| Gespeicherter Wert | Was er bedeutet |
|---|---|
prospecao |
Es gab noch kein ernsthaftes Gespräch |
qualificacao |
Es gibt Interesse und wir prüfen, ob es passt |
proposta |
Angebot abgegeben |
negociacao |
Konditionen werden verhandelt |
fechada_ganha |
Geschäft abgeschlossen |
fechada_perdida |
Geschäft verloren |
Nota
Wir speichern den „technischen“ Wert (fechada_ganha) und zeigen auf dem
Bildschirm das schöne Etikett („Gewonnen“). Genau diese Trennung lässt das
Kanban-Board der nächsten Etappe funktionieren: Jede Spalte des Boards ist
einer dieser Werte, mit seinem Etikett und seiner Farbe. Die Spalten
estado (der Konten) und fase folgen derselben Idee.
Die Struktur einer Tabelle prüfen und ändern
Sie haben sich in einem Typ vertan, eine Spalte fehlt, der Name ist nicht der beste. Nichts davon ist endgültig:
- Öffnen Sie im Baum das Menü ⋯ der Tabelle und wählen Sie Struktur bearbeiten.
- Der Dialog hat zwei Tabs: Spalten und Indizes. Oben stehen der Name in der DB, der Anzeigename (Apps) — der Name, den die Bildschirme zeigen werden — und die Beschreibung.
- Klicken Sie links auf eine Spalte, um sie rechts zu bearbeiten, oder nutzen Sie das +, um eine hinzuzufügen. Neue Spalten sind markiert mit „Neue Spalte — wird beim Anwenden der Änderungen erstellt.“; gelöschte Spalten stehen als „Zum Löschen (DROP) beim Anwenden markiert.“, und das Löschen lässt sich rückgängig machen, solange Sie nicht angewendet haben.
- Klicken Sie auf Änderungen anwenden.

Atenção
Eine Spalte zu löschen löscht ihre Daten. Die Plattform führt die Änderung erst aus, wenn Sie auf Änderungen anwenden klicken — bis dahin ist alles Entwurf, und den Dialog zu schließen macht nichts kaputt.
Die Daten ansehen und säen
Der Objektbaum hat unter dem Modell eine Konsole, und über sie schaut man in die Daten hinein (oder sät sie):
- Öffnen Sie das Menü ⋯ einer Tabelle und wählen Sie Daten anzeigen.
Die SQL-Konsole öffnet sich unten, bereits mit einem
selectfür diese Tabelle. - Klicken Sie auf Ausführen. Die Ergebnisse erscheinen rechts, mit der Zahl der Zeilen und einem Feld Filtern….
- Um die ersten Zeilen einzutragen, schreiben Sie die gewünschten
insertin die Konsole und führen sie aus. Das ist der schnellste Weg zu Beispieldaten, bevor es Bildschirme gibt, um sie anzulegen.

Die Tabellen ins Modell importieren
Die Tabellen existieren, aber die Plattform weiß noch nicht, dass sie sie verwenden soll. Genau das tut der Import:
- Klappen Sie im Baum Dados CRM ▸ Tabellen auf. Da sind alle drei.
- Öffnen Sie für jede das Menü ⋯ und wählen Sie Ins Modell importieren — oder ziehen Sie die Tabelle aus dem Baum auf den Canvas des Modells, was auf dasselbe hinausläuft.
- Jede Tabelle wird zu einer Karte auf dem Canvas: der Entität. Die Karte zeigt die Felder, den Typ jedes einzelnen und die Markierung PK am Primärschlüssel.

Die Namen der Entitäten stehen mit großem Anfangsbuchstaben — aus contas
wird Contas —, weil sie so in den APIs und in den Bildschirmen
erscheinen. Die Tabelle in der Datenbank heißt weiterhin contas.
Nota
Importieren kopiert keine Daten und erstellt nichts in der Datenbank. Und eine Entität aus dem Modell zu entfernen löscht die Tabelle ebenso wenig — „Die Tabelle in der Datenbank wird NICHT geändert.“, wie der Hinweis selbst sagt.
Die Entitäten verbinden — die zwei Beziehungen
Ein CRM ohne Beziehungen sind drei lose Listen. Es fehlen zwei Verbindungen: Jeder Kontakt gehört zu einem Konto, jede Verkaufschance gehört zu einem Konto.
Um eine Beziehung zu erstellen, ziehen Sie das Feld conta_id der Entität
Contactos auf das Feld id der Entität Contas — der Hinweis auf der
Karte erinnert daran: „Auf ein Feld einer anderen Tabelle ziehen, um zu
verknüpfen“. Es öffnet sich der Dialog Neue Beziehung, mit den Entitäten
und den Spalten bereits ausgefüllt:
| Feld | Was zu wählen ist | Warum |
|---|---|---|
| Kardinalität | One-to-many (1:N) | Ein Konto hat viele Kontakte; jeder Kontakt hat ein Konto. |
| Parent (referenziert) | Contas ▸ id |
Die „Eins“-Seite. |
| Child (hält den FK) | Contactos ▸ conta_id |
Die „Viele“-Seite — sie hält die Referenz. |
| Typ der Beziehung | Physisch — erstellt den FK in der Datenbank | Die Datenbank garantiert von nun an, dass es keine verwaisten Kontakte gibt. |
| Navigator in Contactos → Contas | conta |
Das virtuelle Feld, das von einem Kontakt aus dessen Konto liefert. |
| Navigator in Contas → Contactos | contactos |
Das virtuelle Feld, das von einem Konto aus dessen Kontakte liefert. |
| Beim Löschen des Parents (ON DELETE) | Nichts (blockiert, wenn es Children gibt) | Ein Konto mit Kontakten zu löschen wird von nun an abgelehnt — lieber ein Fehler als ein Loch. |
Bestätigen Sie mit Beziehung erstellen und wiederholen Sie die Geste
zwischen Oportunidades ▸ conta_id und Contas ▸ id, mit dem
umgekehrten Navigator oportunidades.

Die Navigators sind der Teil, der sich am meisten auszahlt. Es sind
Felder, die es in der Datenbank nicht gibt, im Modell aber schon: Mit ihnen
gibt eine Abfrage der Verkaufschancen conta.nome zurück, ohne dass jemand
einen join schreibt. Genau das wird die Tabelle des Dashboards in der
nächsten Etappe tun, in der Spalte Conta.
Dica
Physisch erstellt den Fremdschlüssel tatsächlich in der Datenbank; Virtuell — nur im Modell der Plattform dient für Datenbanken, in denen Sie das Schema nicht anfassen können (oder wollen). In diesem Leitfaden gehört die Datenbank uns, also physisch.
Was jetzt freigeschaltet ist
Mit dem fertigen Modell hat die App Dinge geschenkt bekommen:
- Die GraphQL-API der App kennt bereits Contas, Contactos und Oportunidades, samt den Beziehungen — siehe Die GraphQL-API des Modells.
- Die Tabellen-APIs können jetzt auf eine Entität zeigen und Lesen und Schreiben erzeugen, ohne eine Zeile SQL. Das ist der erste Schritt der nächsten Etappe.
- Die Bildschirme werden über Datastores aus diesen APIs lesen.
Warum nicht…?
- Warum erscheint meine Tabelle nicht im Baum? Der Objektbaum wird aus der Datenbank gelesen — nutzen Sie Objekte aktualisieren im Menü ⋯ der Datenquelle, nachdem Sie außerhalb der Plattform etwas geändert haben.
- Warum kann ich die Beziehung nicht erstellen? Die beiden Spalten müssen
kompatibel sein: Ein Primärschlüssel
integerverbindet sich mit eineminteger. Wenn Sie auf das falsche Feld gezogen haben, brechen Sie ab und wiederholen es — der Dialog sagt, dass die Spalten noch zu wählen sind. - Warum erscheint das Feld
contanicht in meinen Daten? Die Navigators sind keine Spalten: Es gibt sie nur über das Modell. Wenn Sie über die SQL-Konsole abfragen, sehen Sie die echten Spalten; in den APIs und in den Bildschirmen erscheinen die Navigators. - Warum lässt mich die Plattform ein Konto nicht löschen? Sie haben Nichts (blockiert, wenn es Children gibt) beim ON DELETE gewählt — und es gibt Kontakte oder Verkaufschancen, die darauf zeigen. Löschen Sie diese zuerst, oder ändern Sie die Regel der Beziehung.
Das Fundament steht. Nächste Etappe: die Bildschirme.