Datamodellen
Att skapa appens databas, CRM:ets tre tabeller och modellen med relationerna som resten av plattformen kommer att använda.
Appen Kundhantering finns och är tom. Den här etappen ger den grunden:
databasen där posterna bor, tabellerna contas, contactos och
oportunidades, och modellen som binder ihop allt — kartan som API:erna,
skärmarna och skripten läser från och med nu.
I slutet av den här sidan har du riktiga data: tre tabeller skapade, kopplade till varandra, och en konsol där frågorna returnerar rader.
Två lager, och det lönar sig att inte blanda ihop dem
Keplin arbetar med data i två lager ovanpå varandra. De gör olika saker och ändras på olika ställen:
| Lager | Vad det är | Var det ändras |
|---|---|---|
| Datakälla | Själva databasen — anslutningen, tabellerna, kolumnerna, raderna. | Panelen Data ▸ Datakällor |
| Modell | Porträttet av den databasen inuti plattformen: entiteter, fält med vänliga namn och relationer. | Datakällans flik, i modellens canvas |
Skillnaden är praktisk. Att skapa en kolumn ändrar i databasen. Att importera en tabell till modellen ändrar ingenting i databasen — den talar bara om för plattformen ”den här tabellen intresserar mig, och så här läses den”. Det är modellen som matar appens GraphQL-API, tabell-API:erna och, genom dem, skärmarna.
Nota
I den här guiden skapas databasen från grunden, inuti appen. Om din organisation redan har en databas med kunderna i sig är vägen densamma från och med steget ”Importera tabellerna till modellen” — registrera anslutningen och importera de tabeller som finns. Kapitlet Ansluta databaser tar upp det fallet.
Skapa datakällan Dados CRM
Första steget är att registrera appens databas. Eftersom vi inte ska ansluta något externt använder vi den typ som plattformen skapar och sparar tillsammans med själva appen: den frågar varken efter server, port, användare eller lösenord.
På appens arbetsyta, välj panelen Data längst ned i sidofältet.
I avsnittet Datakällor, klicka på knappen + (Ny datakälla). Dialogrutan Ny datakälla öppnas — ”Anslut en databas till den här appen. Allt krypteras i vila.”
I Internt namn, skriv
Dados CRM. Det är med det namnet — exakt det — som API:erna och skripten kommer att hänvisa till anslutningen längre fram i guiden.Öppna listan Typ. Den visar alla motorer som stöds; välj den lokala databasen, den som sparas tillsammans med appen. Lägg märke till vad som händer sedan: fälten för server, port, användare och lösenord försvinner — det finns ingenting att ansluta till.

Listan över databastyper i dialogrutan Ny datakälla: de sex motorer som stöds. Ett fält blir kvar, Importera databas (valfritt). Lämna det tomt: ”Utan fil skapas en tom databas.” Det är vad vi vill ha.
Klicka på Testa anslutningen för att bekräfta — svaret är Anslutningen fungerar.
Klicka på Skapa. Datakällan dyker upp i trädet och dess flik öppnas direkt, med modellens canvas — ännu tom.

Atenção
Internt namn är en identifierare, inte en etikett. Att ändra det senare
tvingar dig att gå igenom skripten som anropar db("Dados CRM") och de
SQL-steg som valde anslutningen via det gamla namnet.
Skapa tabellen contas
Med datakällan skapad görs tabellerna utan att du lämnar plattformen.
- I trädet, öppna menyn ⋯ på datakällan Dados CRM och välj Ny tabell.
- I Tabellens namn, skriv
contas. Lämna Schema (valfritt) tomt. - I Tabellens beskrivning, skriv
Kundföretag och potentiella kunder. Det är valfritt, men det är det du kommer att läsa om ett år. - Listan KOLUMNER kommer redan med en kolumn
id, av typeninteger, med Primärnyckel (PK) och Autoinkrement påslagna. Låt den vara som den är — den är varje posts identitet. - Klicka på + i KOLUMNER för varje ny kolumn och fyll i Namn, Typ och reglagen. Tabellen nedan säger vad du ska skriva.
- Bekräfta med Skapa tabell. Tabellen föds i databasen och börjar synas i objektträdet.

Kolumnerna i tabellen contas:
| Kolumn | Typ | Tillåter NULL | Vad den används till |
|---|---|---|---|
id |
integer |
nej | Primärnyckel, med autoinkrement |
nome |
text |
nej | Företagets namn |
nif |
text |
ja | Organisationsnummer |
sector |
text |
ja | Livsmedel, Teknik, Hälsa… |
cidade |
text |
ja | Var företaget finns |
telefone |
text |
ja | Allmän kontakt |
email |
text |
ja | Allmän kontakt |
estado |
text |
nej | ativo, prospeto eller inativo |
Dica
Tillåter NULL avstängt betyder obligatoriskt i databasen. Spara det till det som verkligen är obligatoriskt — ett företags namn, kontot som en kontakt tillhör. Ett fält som i dag är valfritt och i morgon obligatoriskt ändras på ett ögonblick; motsatsen tvingar dig att städa data.
Skapa tabellerna contactos och oportunidades
Upprepa rörelsen — datakällans meny ⋯ ▸ Ny tabell — två gånger till.
contactos (beskrivning: Kontaktpersoner för varje konto):
| Kolumn | Typ | Tillåter NULL | Vad den används till |
|---|---|---|---|
id |
integer |
nej | Primärnyckel, med autoinkrement |
nome |
text |
nej | Personens namn |
cargo |
text |
ja | VD, Inköpsansvarig… |
email |
text |
ja | |
telefone |
text |
ja | |
conta_id |
integer |
nej | Kontot som personen tillhör |
oportunidades (beskrivning: Pågående affärer, per fas):
| Kolumn | Typ | Tillåter NULL | Vad den används till |
|---|---|---|---|
id |
integer |
nej | Primärnyckel, med autoinkrement |
titulo |
text |
nej | Affärens namn |
conta_id |
integer |
nej | Affärens konto |
valor |
real |
ja | Värde i euro — tal med decimaler |
fase |
text |
nej | Affärens fas (se nedan) |
data_fecho |
text |
ja | Förväntat avslutsdatum, i ÅÅÅÅ-MM-DD |
responsavel |
text |
ja | Den som följer upp affären |
Kolumnen fase är en sluten lista av värden. Den sparas som text, och de
möjliga värdena är alltid dessa sex:
| Sparat värde | Vad det betyder |
|---|---|
prospecao |
Det har ännu inte hållits något riktigt samtal |
qualificacao |
Det finns intresse och vi undersöker om det passar |
proposta |
Offert lämnad |
negociacao |
Villkoren diskuteras |
fechada_ganha |
Affären är avslutad |
fechada_perdida |
Affären är förlorad |
Nota
Vi sparar det ”tekniska” värdet (fechada_ganha) och visar den snygga
etiketten (”Vunnen”) på skärmen. Det är den uppdelningen som får nästa
etapps kanban-tavla att fungera: varje kolumn på tavlan är ett av de här
värdena, med sin etikett och sin färg. Kolumnerna estado (på kontona) och
fase följer samma idé.
Granska och ändra en tabells struktur
Du valde fel typ, en kolumn saknas, namnet är inte det bästa. Inget av det är slutgiltigt:
- I trädet, öppna tabellens meny ⋯ och välj Redigera struktur.
- Dialogrutan har två flikar: Kolumner och Index. Högst upp ligger Namn i databasen, Visningsnamn (appar) — namnet som skärmarna visar — och beskrivningen.
- Klicka på en kolumn till vänster för att redigera den till höger, eller använd + för att lägga till. Nya kolumner märks ”Ny kolumn — skapas när ändringarna tillämpas.”; borttagna kolumner märks ”Markerad för borttagning (DROP) vid tillämpning.”, och borttagningen går att ångra så länge du inte har tillämpat.
- Klicka på Tillämpa ändringar.

Atenção
Att ta bort en kolumn tar bort dess data. Plattformen utför ändringen först när du trycker på Tillämpa ändringar — fram till dess är allt utkast, och att stänga dialogrutan förstör ingenting.
Se och så in data
Objektträdet har en konsol under modellen, och det är genom den man kikar på (eller sår in) data:
- Öppna en tabells meny ⋯ och välj Visa data. SQL-konsol öppnas
nedtill, redan med en
selectfärdig för den tabellen. - Klicka på Kör. Resultaten visas till höger, med antalet rader och ett fält Filtrera….
- För att lägga in de första raderna, skriv de
insertdu vill ha i konsolen och kör. Det är det snabbaste sättet att få exempeldata innan det finns skärmar som kan skapa dem.

Importera tabellerna till modellen
Tabellerna finns, men plattformen vet ännu inte att den ska använda dem. Det är vad importen gör:
- I trädet, fäll ut Dados CRM ▸ Tabeller. Där ligger alla tre.
- För var och en, öppna menyn ⋯ och välj Importera till modell — eller dra tabellen från trädet till modellens canvas, vilket ger samma sak.
- Varje tabell blir ett kort på canvasen: entiteten. Kortet visar fälten, typen på var och en och märkningen PK på primärnyckeln.

Entiteternas namn får stor begynnelsebokstav — contas blir Contas —
eftersom det är så de dyker upp i API:erna och på skärmarna. Tabellen i
databasen heter fortfarande contas.
Nota
Att importera kopierar inga data och skapar ingenting i databasen. Och att ta bort en entitet från modellen tar inte heller bort tabellen — ”Det ändrar INTE tabellen i databasen”, som varningen själv säger.
Koppla ihop entiteterna — de två relationerna
Ett CRM utan relationer är tre lösryckta listor. Två kopplingar saknas: varje kontakt tillhör ett konto, varje affärsmöjlighet tillhör ett konto.
För att skapa en relation, dra fältet conta_id från entiteten Contactos
till fältet id på entiteten Contas — tipsen på kortet påminner om det:
”Dra till ett fält i en annan tabell för att koppla”. Dialogrutan Ny
relation öppnas, redan med entiteterna och kolumnerna ifyllda:
| Fält | Vad du väljer | Varför |
|---|---|---|
| Kardinalitet | One-to-many (1:N) | Ett konto har många kontakter; varje kontakt har ett konto. |
| Parent (refererad) | Contas ▸ id |
”Ett”-sidan. |
| Child (har FK:n) | Contactos ▸ conta_id |
”Många”-sidan — det är den som håller referensen. |
| Typ av relation | Fysisk — skapar FK:n i databasen | Databasen börjar garantera att det inte finns föräldralösa kontakter. |
| Navigator på Contactos → Contas | conta |
Det virtuella fältet som, från en kontakt, ger dess konto. |
| Navigator på Contas → Contactos | contactos |
Det virtuella fältet som, från ett konto, ger dess kontakter. |
| När föräldern tas bort (ON DELETE) | Ingenting (blockerar om det finns barn) | Att ta bort ett konto som har kontakter blir nekat — hellre ett fel än ett hål. |
Bekräfta med Skapa relation och upprepa rörelsen mellan Oportunidades
▸ conta_id och Contas ▸ id, med den omvända navigatorn
oportunidades.

Navigatorerna är den del som ger mest. De är fält som inte finns i
databasen men finns i modellen: med dem returnerar en fråga om
affärsmöjligheter conta.nome utan att någon skriver en join. Det är
precis vad dashboardens tabell kommer att göra i nästa etapp, i kolumnen
Konto.
Dica
Fysisk skapar verkligen främmande nyckeln i databasen; Virtuell — bara i plattformens modell är till för databaser där du inte kan (eller inte vill) röra schemat. I den här guiden är databasen vår, alltså fysisk.
Vad som nu är upplåst
Med modellen på plats har appen fått saker gratis:
- Appens GraphQL-API känner redan till Contas, Contactos och Oportunidades, med relationerna — se Modellens GraphQL-API.
- Tabell-API:erna kan nu peka på en entitet och generera läsning och skrivning utan en rad SQL. Det är första steget i nästa etapp.
- Skärmarna kommer att läsa från de här API:erna via datastores.
Varför inte…?
- Varför syns inte min tabell i trädet? Objektträdet läses från databasen — använd Uppdatera objekten i datakällans meny ⋯ efter att du har ändrat något utanför plattformen.
- Varför går det inte att skapa relationen? De två kolumnerna måste vara
kompatibla: en primärnyckel av typen
integerkopplas till eninteger. Om du drog till fel fält, avbryt och gör om — dialogrutan säger att kolumnerna inte är valda. - Varför syns inte fältet
contai mina data? Navigatorerna är inga kolumner: de finns bara genom modellen. Om du frågar via SQL-konsol ser du de verkliga kolumnerna; det är i API:erna och på skärmarna som navigatorerna dyker upp. - Varför låter plattformen mig inte ta bort ett konto? Du valde Ingenting (blockerar om det finns barn) i ON DELETE — och det finns kontakter eller affärsmöjligheter som pekar på det. Ta bort dem först, eller ändra relationens regel.
Grunden är lagd. Nästa etapp: skärmarna.