Gå til indhold

Tegn relationerne

Findes også på 28 sprog

English · Español · 日本語 · Português (Brasil) · Français · Deutsch · Italiano · 한국어 · 简体中文 · Português (Portugal) · 繁體中文 · Bahasa Indonesia · Türkçe · Polski · Tiếng Việt · ไทย · Nederlands · العربية · עברית · Українська · हिन्दी · Русский · Svenska · Norsk bokmål · Suomi · Español (México) · Français (Canada) · Deutsch (Schweiz)

A card model of a region from above: one distribution center joined by red threads to many small stores, and a second center with its own.
Billedet er lavet med AI

Modul 2 af 6 i kapitlet Modellér data for betydning, kapitel 2 i kurset Data Architect. Hvert modul står på egne ben. Forrige: Lyt efter navneordene · Næste: Byg den logiske model

Spørgsmålet, dette modul besvarer: Hvordan gør jeg kandidater til entiteter til en konceptuel datamodel?

Vi har navneord på tavlen. Nu vil jeg vide noget om stregerne mellem kasserne, for en samling entiteter er ikke rigtig en datamodel endnu. Det er i relationerne, meget af betydningen bor. En detailpartner driver distributionscentre. Et manifest oplister leveringer. En levering går til en modtager. Et team kører en lastbil. Hvert af de udsagn fortæller mig noget om forretningen, og hvert af dem giver mig endnu et spørgsmål at stille.

Jeg vil stadig ikke tale om Salesforce. Jeg spørger ikke, om det her skal være en lookup-relation eller en master-detail-relation, jeg tænker ikke på forbindelsesobjekter i Salesforce (Salesforce Junction Objects), og jeg beslutter ikke, hvad der sker, når en overordnet post bliver slettet. Jeg prøver at forstå forretningsrelationen.

Tag »en detailpartner driver distributionscentre«. Det lyder enkelt. Men kan en detailpartner have ét DC eller mange? Hos Steve Trucking driver hver detailpartner et regionalt distributionscenter i hver region, Steve Trucking betjener, så mange. Kan et DC høre til mere end én detailpartner? Betyder et DC noget i sig selv, med sit eget personale og sin egen historik, eller er det bare en adresse? Hvis en detailpartner stopper, går vi så stadig op i dens DC’er?

Det er ikke Salesforce-spørgsmål. Det er forretningsspørgsmål, og svarene kan ændre modellen fuldstændigt.

Før vi går dybere, vil jeg give dig det sprog, vi bruger på hvert eneste diagram herfra. Det er et lille sprog. En streg mellem to kasser siger, at de to ting hænger sammen, og markeringerne i enderne siger hvor mange.

Start med en ren streg uden markeringer. Det er der, jeg starter på tavlen: jeg ved, at de to navneord hænger sammen, jeg har bare ikke spurgt hvordan endnu. Så får enderne markeringer. En enkelt tværstreg over stregen betyder én. Kragefoden, enden der deler sig i tre som en fuglefod, betyder mange. Senere i dette modul ser du en anden markering dukke op ved siden af den første, en tværstreg eller en cirkel, og den besvarer et andet spørgsmål: kan der være ingen?

Den ene regel, du skal huske: du læser hver markering ved den kasse, den rører. Markeringen nærmest kassen er det højeste antal, der kan være; den næste markering længere ude er det laveste.

At læse stregerne Forklaringen til kursets diagramsprog. En enkel streg uden markeringer betyder, at to ting hænger sammen, men hvor mange er ikke besluttet endnu. En enkelt tværstreg i enden betyder én; en kragefod betyder mange. Med en anden markering for valgfrihed: to tværstreger betyder præcis én; en cirkel og en tværstreg betyder nul eller én; en tværstreg og en kragefod betyder én eller mange; en cirkel og en kragefod betyder nul eller mange. Hver markering læses ved den kasse, den rører. START: EN ENKEL STREG En enkel streg de to hænger sammen; hvor mange er ikke besluttet endnu SÅ: ÉN ELLER MANGE Én en enkelt tværstreg (krydset): én af den kasse, den rører Mange kragefoden: mange af den kasse, den rører SÅ: KAN DET VÆRE NUL? Præcis én to tværstreger: mindst én, højst én Nul eller én en cirkel, så en tværstreg: den findes måske ikke endnu Én eller mange en tværstreg, så kragefoden: mindst én Nul eller mange en cirkel, så kragefoden: ingen er fint Læs hver ende ved den kasse, den rører: markeringen nærmest kassen er det højeste antal; næste markering udad er det laveste. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Før Steve Trucking går vi tilbage til hundene fra modul 1. Vi havde fem kasser: Ejer, Opdrætter, Hund, Race og Trick. Nu spørger jeg til stregerne mellem dem.

Én eller mange? En ejer kan have mere end én hund; Ana har to. En hund har én ejer, i hvert fald i vores model. Det er én-til-mange: en tværstreg ved Ejer, en kragefod ved Hund. Opdrætteren har samme form: én opdrætter opdrætter mange hunde.

Kan der være ingen? Max kom fra internatet, så han har slet ingen opdrætter. Opdrætter-enden får en cirkel: en hund har nul eller én opdrætter. Til gengæld har hver hund en ejer, så den ende får en ekstra tværstreg: præcis én.

Mange til mange? En hund kan mange tricks, og et trick, for eksempel Sit, kan mange hunde. Det er mange-til-mange, og det er præcis der, jeg går på jagt efter et skjult begreb. Er der noget ved, at denne hund kan dette trick? Hvor godt hun gør det, og hvornår hun lærte det. Relationen har sine egne fakta, så den bliver en ting for sig: Hundetrick, med hunden først i navnet, fordi det er hunden, der driver den.

Hvad betyder hver streg? En ejer ejer en hund. En opdrætter opdrætter den. En hund kan sine tricks. Giv stregerne navne, og så kan alle læse modellen tilbage for dig.

Nu eller over tid? Går nogen op i, hvor god Bella er til Sit i dag, eller hvordan hun nåede dertil? Hvis en træner tjekker hende med et par måneders mellemrum, er hvert tjek en post for sig: en Trickvurdering med datoen, færdighedsniveauet og hvem der tjekkede, under det Hundetrick, den hører til. Selv en relation, der er blevet til en ting, kan have sin egen historik.

Race lader jeg stå uden forbindelse indtil videre. Det er stadig spørgsmålet fra modul 1, en kasse for sig eller et ord på hunden, og modul 4 afgør det.

Hundemodellen med sine relationer Syv kasser. En ejer ejer én eller mange hunde, og hver hund har præcis én ejer. En opdrætter opdrætter én eller mange hunde, og en hund har nul eller én opdrætter. En hund kan nul eller mange hundetricks, og et trick kendes i nul eller mange hundetricks; hvert hundetrick er én hund og ét trick. Hvert hundetrick tjekkes i nul eller mange trickvurderinger. Race står for sig selv, endnu ikke forbundet. ejer opdrætter kan kendes i tjekkes i Ejer Opdrætter Hund Race Hundetrick Trick Trickvurdering præcis én nul eller én én eller mange nul eller mange © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Hvert af de spørgsmål virker på samme måde i en rigtig virksomhed. Lad os nu stille dem til Steve Trucking.

Noget af det første, jeg vil forstå ved en relation, er dens kardinalitet. Det er databaseordet; spørgsmålet er meget enklere: hvor mange af dem her kan hænge sammen med hvor mange af dem der? På det konceptuelle niveau er der tre grundmønstre.

Det er et vigtigt skridt i processen: tag to forskellige navneord, og forstå deres relation. I de fleste tilfælde er det én-til-mange eller mange-til-én. Kun i sjældne tilfælde møder du en én-til-én.

Én-til-mange er overalt. Én detailpartner har mange distributionscentre. Ét manifest oplister mange leveringer. Én rute har cirka ti stop. Når jeg hører den slags sprog, begynder jeg at tegne stregen.

Og nu får stregen sine markeringer. Hver ende fortæller dig, hvor mange der er af den kasse, den rører: tværstregen for én, kragefoden for mange. Læs den fra hver kasse: én detailpartner har mange distributionscentre.

Den grundlæggende forbindelse, én til mange To par kasser, hvert forbundet med en streg i grundlæggende kragefodsnotation. Én detailpartner driver mange distributionscentre: en enkelt tværstreg ved detailpartneren, en kragefod ved distributionscentret. Ét manifest oplister mange leveringer, markeret på samme måde. Hver ende har en forklaring i ord. én/ét Detailpartner mange Distributionscentre driver én/ét Manifest mange Leveringer oplister Detailpartner Distributionscenter Manifest Levering En enkelt tværstreg er én. Kragefoden er mange. Læs hver ende fra den kasse, den rører. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Én-til-én-relationer findes, men de er sjældne, og når jeg finder en, stiller jeg nogle spørgsmål. Er det virkelig to forskellige navneord, eller det samme? Hvis de er forskellige, hvad er så én-til-én-relationen mellem dem? Og vil den altid være én-til-én, eller kun én-til-én lige nu? Det er nøglespørgsmål, når man designer datamodellen. Et team og en lastbil ligner én-til-én på en given morgen: to personer, én lastbil, én rute. Over en måned er de det ikke, og det er der, den mest interessante relation i denne model gemmer sig.

Mange-til-mange-relationer er særligt interessante, fordi de ofte fortæller os, at der findes et andet begreb i forretningen. Kan et team køre mere end én lastbil over tid? Ja. Kan en lastbil blive kørt af mere end ét team? I løbet af dens levetid, helt sikkert. Så teams og lastbiler har en mange-til-mange-relation. Men nu vil jeg vide mere. Går forretningen op i, hvornår et team havde en lastbil? Til hvilken rute, på hvilken dag? Hvem lavede tildelingen? Hvis selve relationen bærer information, vi går op i, har vi opdaget endnu et forretningsbegreb: teamtildelingen (Crew Assignment).

Det er en vigtig vane, når man modellerer. Nogle gange er det mest interessante ikke et af de navneord, vi hørte først. Det gemmer sig i relationen mellem to navneord.

Det er et af de steder, hvor jeg gerne vil have admins til at begynde at tænke anderledes. I Salesforce er vi vant til at tale om objekter og felter, så det er nemt at behandle kasserne som den vigtige del og stregerne som rørføring. Men selve relationen kan have forretningsmæssig betydning.

Tag en levering og produkterne på den. En levering kan indeholde flere produkter, for eksempel en vaskemaskine og en tørretumbler. Et produkt, den samme køleskabsmodel, optræder på tusindvis af leveringer. Nemt nok. Men hvad nu, hvis jeg skal vide, hvor mange af det produkt der er på denne levering, om det skal installeres, eller om det gamle skal køres bort? Så er jeg ikke længere kun interesseret i en relation mellem levering og produkt. Jeg er interesseret i en leveringslinje (Delivery Item), og det begreb fortjener sin egen entitet.

Hvis du kommer fra Salesforce, tænker du måske allerede: »Det er et forbindelsesobjekt.« Du tager ikke fejl. Men jeg vil ikke starte der. En leveringslinje er et forretningsbegreb, før den er et forbindelsesobjekt i Salesforce (Salesforce Junction Object). Forretningen først, implementeringen bagefter.

Et par af mine vaner for den slags relationsentiteter, uanset hvor de ender med at blive bygget.

Giv den et navn. Hvis forretningen allerede har et ord for den, så brug deres. Hvis ikke, så tag navnene på de to forældre og sæt dem sammen. Tænk på en ordre og et produkt. Tingen mellem dem er ordrelinjen (Order Item): ordren og linjen på ordren. Den er barn af begge forældre, og i Salesforce ender den måske som et forbindelsesobjekt i Salesforce. Men hvilket navn kommer først: linjeordre eller ordrelinje? Se på, hvilken slags data hver forælder er. Produktet er referencedata; ordren er transaktionsdata, og det er ordren, der driver den. Så det er ordrelinje, eller ordreprodukt (Order Product), på samme måde som Salesforce har Opportunity Product. Hos Steve Trucking er det leveringslinjen. Det drivende navn kommer først, og posten havner ved siden af sin ejer i hver eneste liste, du nogensinde kommer til at kigge på.

Giv den sin egen nøgle. Det er fristende at sige, at en leveringslinje identificeres ved levering plus produkt, og stoppe der. Det er en sammensat nøgle, og sammensatte nøgler er meget sværere at håndtere: hvert system, der peger på posten, skal have begge halvdele med. Giv relationsentiteten sit eget id, og behold levering plus produkt som en regel om entydighed, ikke som post-id’et.

To overordnede, ét underordnet: giv det sin egen nøgle To overordnede og ét underordnet. En levering (post-id leverings-id; leveringsdato, status) indeholder mange leveringslinjer. Et produkt (post-id produkt-id; navn, modelnummer) optræder på mange leveringslinjer. Leveringslinjen sidder mellem dem: den har sit eget post-id, leveringslinje-id'et, og bærer leverings-id'et og produkt-id'et fra sine to overordnede plus et antal. En note nedenunder: leverings-id plus produkt-id er en regel om unikhed, ikke post-id'et. TRANSAKTIONSDATA REFERENCEDATA indeholder optræder på Levering Leverings-id POST-ID Leveringsdato Status Leveringslinje Leveringslinje-id POST-ID Leverings-id Produkt-id Antal Produkt Produkt-id POST-ID Navn Modelnummer Leverings-id + produkt-id: en regel om unikhed, ikke post-id'et. én mange © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Læg mærke til, hvad der ikke står på den: et serienummer. Et antal og et serienummer hører ikke hjemme på den samme post. Et antal tæller flere af en ting; et serienummer identificerer én bestemt ting. Hvis forretningen har brug for serienumre, bliver hver enhed sin egen post, og fem køleskabe er fem poster. Jeg kan ikke se en situation, hvor en leveringslinje skal have en leveringslinjedetalje under sig. Det er det ene eller det andet: en samlet post med et antal, eller én post pr. enhed. Her er det antallet.

Hold øje med de attributter, der vil have historik. Nogle relationsentiteter ligger fast, når de først er oprettet: vaskemaskinen på denne levering forbliver vaskemaskinen på denne levering. Andre ændrer sig hele tiden. Et team har lastbil 117 i denne uge, og i næste uge går lastbilen til et andet team. Når relationen ændrer sig, og forretningen går op i, hvad den plejede at være, har relationsentiteten brug for datoer, og teamtildelingen er den, du skal holde øje med. Spørg tidligt, om forretningen går op i nu eller over tid; vi vender tilbage til det om lidt.

Relationer har betydning ud over kardinaliteten

Sektion kaldt “Relationer har betydning ud over kardinaliteten ”

»Én-til-mange« er ikke nok til at forstå en relation. Jeg vil også vide, hvad relationen betyder.

En levering har en lokation. Hvilken? Distributionscentret, den kører fra? Modtagerens hjem, den skal til? De kan ikke bruges i flæng. To modeller kan have præcis de samme kasser og den samme kardinalitet, og stregerne kan betyde helt forskellige ting. Derfor er en god model ikke bare kasser forbundet med streger. Stregerne skal have navne. Hvis jeg giver en anden arkitekt mit diagram, skal vedkommende ikke gætte på, hvad en relation betyder, og hvis jeg viser det til forretningen, skal det bruge et sprog, de kan genkende.

Stregerne skal have navne To paneler, hvert med en kasse Sted over en kasse Levering, forbundet med to streger, hver markeret ét sted til mange leveringer. I det venstre panel, »Ingen navne på stregerne«, har de to streger intet navn og ser ens ud. I det højre panel, »Navngivne streger«, hedder den ene streg »udgår fra« og den anden »leveres til«. Samme kasser, samme kardinalitet: kun navnene fortæller, hvilken streg der er hvilken. INGEN NAVNE PÅ STREGERNE NAVNGIVNE STREGER udgår fra leveres til Sted Levering Sted Levering Samme kasser, samme kardinalitet. Kun navnene fortæller, hvilken streg der er hvilken. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Der gemmer sig endnu et spørgsmål inde i »hvor mange?«: er relationen påkrævet? Kan en levering eksistere, før den er sat på en rute? Det er den nødt til: manifestet kommer en dag eller to før leveringen, og ruterne bliver lagt fast aftenen før. Kan en levering eksistere uden en detailpartner? Nej; hver levering kommer fra en partners manifest. Det er optionalitet.

Igen: spring ikke direkte til et Required-flueben i Salesforce. Der er forskel på at sige »hver levering skal have en detailpartner« og at sige »Salesforce skal kræve feltet for detailpartner, når posten oprettes«. De ender måske som den samme implementering, men de er ikke det samme udsagn. Det første er en forretningsregel; det andet er én måde at håndhæve den på. Som arkitekter vil vi forstå det første, før vi beslutter det andet.

På diagrammet er optionaliteten den anden markering i hver ende. Markeringen nærmest kassen er det højeste antal, der kan være: tværstregen for én, kragefoden for mange. Den næste markering længere ude er det laveste: endnu en tværstreg betyder mindst én, en cirkel betyder, at det kan være nul. Så hver levering står på præcis ét manifest, og et manifest oplister én eller mange leveringer. En levering hører til nul eller ét stop, intet før den er lagt på en rute, og ved et stop afleveres nul eller mange leveringer.

At læse begge markeringer i hver ende Tre kasser på række: Manifest, Levering, Stop. Et manifest oplister én eller mange leveringer, og hver levering er på præcis ét manifest: to tværstreger ved manifestet, en kragefod og en tværstreg ved leveringen. Et stop afleverer nul eller mange leveringer, og hver levering er ved nul eller ét stop: en cirkel og en kragefod ved leveringen, en cirkel og en tværstreg ved stoppet. Nærmest kassen er højst; næste markering udad er mindst. præcis én/ét Manifest én/ét eller mange Leveringer oplister nul eller én/ét Stop nul eller mange Leveringer afleverer Manifest Levering Stop Nærmest kassen: højst (én eller mange). Næste markering udad: mindst (en tværstreg er mindst én, en cirkel er nul). © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Her er et spørgsmål, jeg stiller tit: mener du nu, eller mener du over tid?

Et team kører en lastbil. Lige nu? Til dagens rute? Så længe de to personer arbejder sammen? Det giver forskellige modeller. Hvis forretningen kun går op i, hvilken lastbil et team har i dag, kan modellen forblive enkel. Hvis den har brug for hver lastbil, et team har kørt, hvornår og på hvilken rute, har vi brug for historik, og den teamtildeling, vi opdagede, bliver pludselig meget vigtig.

Teamtildelingen: hvilket team har hvilken lastbil To overordnede og ét underordnet. Et team (post-id team-id; navn, status) arbejder i mange teamtildelinger. En lastbil (post-id lastbil-id, også kendt under sit enhedsnummer; mærke, model, status) bruges i mange teamtildelinger. Hver teamtildeling har sit eget post-id og bærer team-id'et og lastbil-id'et og ingen datoer. En note nedenunder: hvilket team har hvilken lastbil, men ikke siden hvornår. arbejder bruges i Team Team-id POST-ID Navn Status Teamtildeling Teamtildelings-id POST-ID Team-id Lastbil-id Lastbil Lastbil-id POST-ID Enhedsnummer OGSÅ KENDT SOM Mærke Model Status Hvilket team har hvilken lastbil, men ikke siden hvornår. én mange © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Det er en almindelig kilde til fejl i modellering. Vi modellerer den nuværende tilstand, fordi det er den, vi kan se på skærmen. Så, uger senere, indgiver en detailpartner et skadeskrav, og nogen spørger: »Hvilket team havde lastbil 117 den 17. marts?« Og vi opdager, at vi har overskrevet svaret, hver gang tildelingen ændrede sig.

En måde at bevare den historik på er at gøre tildelingen til en post for sig. Når et team bliver tildelt, opretter vi en teamtildeling med en startdato. Når tildelingen ændrer sig, sætter vi en slutdato på den gamle post og opretter en ny med sin egen startdato. Nu er »hvem havde den tildeling for seks måneder siden?« et enkelt spørgsmål at besvare, i stedet for en udgravning i felthistorikken eller en log over dataændringer. Og når et team først har haft mange tildelinger, vil nogen spørge, hvilken der er den aktuelle, så jeg ville også tilføje et Active-flag (aktiv).

Teamtildelingen over tid: datoer og et Aktiv-flag To overordnede og ét underordnet, med datoer. Et team (post-id team-id; navn, status) arbejder i mange teamtildelinger. En lastbil (post-id lastbil-id, også kendt under sit enhedsnummer; mærke, model, status) bruges i mange teamtildelinger. Hver teamtildeling har sit eget post-id og bærer team-id'et og lastbil-id'et, en startdato, en slutdato og et Aktiv-flag. En note nedenunder: hver ændring afslutter én tildeling og starter den næste, og Aktiv markerer den nuværende. arbejder bruges i Team Team-id POST-ID Navn Status Teamtildeling Teamtildelings-id POST-ID Team-id Lastbil-id Startdato Slutdato Aktiv Lastbil Lastbil-id POST-ID Enhedsnummer OGSÅ KENDT SOM Mærke Model Status Hver ændring afslutter én tildeling og starter den næste. Aktiv markerer den nuværende. én mange © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Så når nogen fortæller mig om en relation, spørger jeg ikke bare, hvordan tingene hænger sammen. Jeg spørger: ændrer den relation sig, og går vi op i dens historik?

Vores model for Steve Trucking begynder at blive nyttig. Vi ved, hvilke relationer der er én-til-mange, hvor en mange-til-mange gemmer på et andet begreb, hvilke relationer der er valgfrie, og hvilke der ændrer sig over tid. Og vi har stadig ikke oprettet et eneste Salesforce-objekt. Det er med vilje.

Den konceptuelle model efter modul 1 og 2 Konceptuel model for Steve Trucking, grupperet som kundedata, transaktionsdata og referencedata. En detailpartner sender manifester, der oplister leveringer, og driver distributionscentre. Hver levering udgår fra et distributionscenter, går til en modtager og indeholder leveringslinjer. Ruter har stop, der afleverer leveringer. En teamtildeling forbinder et team og en lastbil med en rute, så modellen bevarer, hvem der kørte hvilken lastbil, og hvornår. KUNDEDATA TRANSAKTIONSDATA REFERENCEDATA driver sender oplister indeholder udgår fra leveres til har afleverer kører arbejder bruges i Detailpartner forhandleren, vi leverer for Modtager den, der modtager den Manifest partnerens leveringsliste Levering én ordre til én modtager Leveringslinje det, der er på lastbilen Rute en dags tur med stop Stop én adresse på ruten Teamtildeling hvem der kørte hvilken lastbil, og hvornår Distributionscenter hvor leveringerne udgår fra Team to personer Lastbil køretøjet præcis én nul eller én én eller mange nul eller mange © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Det her diagram skal være noget, jeg kan lægge foran forretningen, og de skal ikke kende Salesforce for at fortælle mig, om det er rigtigt. Hvis de ikke kan validere det, fordi det er fyldt med Salesforce-terminologi, er jeg gået for hurtigt over i det fysiske design.

Når jeg arbejder mig igennem relationerne i en konceptuel model, beslutter jeg:

  • Hvordan de vigtigste forretningsentiteter hænger sammen med hinanden.
  • Om hver relation er én-til-én, én-til-mange eller mange-til-mange, nu og over tid.
  • Om hver relation er påkrævet eller valgfri.
  • Om en mange-til-mange-relation gemmer på et meningsfuldt forretningsbegreb.
  • Om relationen ændrer sig over tid, og om vi har brug for dens historik.

Lookup eller master-detail, opsætning af forbindelsesobjekter, kaskadeadfærd og deling er fysiske beslutninger; dem kommer vi til. Lige nu besvarer vi stadig det vigtigere spørgsmål: hvordan fungerer den her forretning egentlig? Når vi forstår entiteterne og relationerne mellem dem, kan vi begynde at tilføje de detaljer, der beskriver dem. Det er der, vores konceptuelle model begynder at blive til en logisk datamodel.