Hoppa till innehåll

Rita relationerna

Finns även på 28 språk

English · Español · 日本語 · Português (Brasil) · Français · Deutsch · Italiano · 한국어 · 简体中文 · Português (Portugal) · 繁體中文 · Bahasa Indonesia · Türkçe · Polski · Tiếng Việt · ไทย · Nederlands · العربية · עברית · Українська · हिन्दी · Русский · Dansk · 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.
Bilden är skapad med AI

Modul 2 av 6 i kapitlet Modellera data för mening, kapitel 2 i kursen Data Architect. Varje modul står på egna ben. Föregående: Lyssna efter substantiven · Nästa: Bygg den logiska modellen

Frågan den här modulen besvarar: Hur gör jag kandidatentiteter till en konceptuell datamodell?

Vi har substantiv på tavlan. Nu vill jag veta mer om linjerna mellan rutorna, för en samling entiteter är egentligen inte en datamodell än. Det är i relationerna som mycket av meningen finns. En detaljhandelspartner driver distributionscentraler. Ett manifest listar leveranser. En leverans går till en mottagare. Ett team kör en lastbil. Vart och ett av de påståendena säger mig något om verksamheten, och vart och ett ger mig ännu en fråga att ställa.

Jag vill fortfarande inte prata om Salesforce. Jag frågar inte om det här ska vara en lookup-relation eller en master-detail-relation, jag funderar inte på kopplingsobjekt i Salesforce (Salesforce Junction Objects), och jag bestämmer inte vad som händer när en föräldrapost raderas. Jag försöker förstå affärsrelationen.

Ta ”en detaljhandelspartner driver distributionscentraler”. Det låter enkelt. Men kan en detaljhandelspartner ha en DC eller många? Hos Steve Trucking driver varje detaljhandelspartner en regional distributionscentral i varje region som Steve Trucking betjänar, alltså många. Kan en DC höra till mer än en detaljhandelspartner? Spelar en DC roll i sig själv, med egen personal och egen historik, eller är den bara en adress? Om en detaljhandelspartner slutar, bryr vi oss då fortfarande om dess DC:er?

Det är inga Salesforce-frågor. Det är affärsfrågor, och svaren kan ändra modellen helt.

Innan vi går djupare vill jag ge dig det språk vi kommer att använda i varje diagram från och med nu. Det är ett litet språk. En linje mellan två rutor säger att de två sakerna hör ihop, och markeringarna i ändarna säger hur många.

Börja med en vanlig linje, helt utan markeringar. Det är där jag börjar på whiteboarden: jag vet att de här två substantiven hör ihop, jag har bara inte frågat hur än. Sedan får ändarna markeringar. Ett enkelt streck tvärs över linjen betyder en. Kråkfoten, änden som delar sig i tre som en fågelfot, betyder många. Längre fram i den här modulen ser du en andra markering dyka upp bredvid den första, ett streck eller en cirkel, och den svarar på en annan fråga: kan det finnas ingen alls?

Den enda regeln att komma ihåg: du läser varje markering vid den ruta den rör. Markeringen närmast rutan är det högsta antalet; nästa markering utåt är det lägsta.

Att läsa linjerna Förklaringen till kursens diagramspråk. En enkel linje utan markeringar betyder att två saker hör ihop, men hur många är inte bestämt än. Ett enkelt streck i änden betyder en; en kråkfot betyder många. Med en andra markering för valfrihet: två streck betyder exakt en; en cirkel och ett streck betyder noll eller en; ett streck och en kråkfot betyder en eller många; en cirkel och en kråkfot betyder noll eller många. Varje markering läses vid rutan den rör. START: EN ENKEL LINJE En enkel linje de här två hör ihop; hur många är inte bestämt än SEDAN: EN ELLER MÅNGA En ett enkelt streck (korset): en av rutan den rör Många kråkfoten: många av rutan den rör SEDAN: KAN DET VARA NOLL? Exakt en två streck: minst en, högst en Noll eller en en cirkel, sedan ett streck: den kanske inte finns än En eller många ett streck, sedan kråkfoten: minst en Noll eller många en cirkel, sedan kråkfoten: ingen går bra Läs varje ände vid rutan den rör: markeringen närmast rutan är det högsta antalet; nästa markering utåt är det lägsta. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Innan vi går till Steve Trucking, tillbaka till hundarna från modul 1. Vi hade fem rutor: Ägare, Uppfödare, Hund, Ras och Trick. Nu frågar jag om linjerna mellan dem.

En eller många? En ägare kan ha mer än en hund; Ana har två. En hund har en ägare, åtminstone i vår modell. Det är en-till-många: ett streck vid Ägare, en kråkfot vid Hund. Uppfödaren har samma form: en uppfödare föder upp många hundar.

Kan det finnas ingen? Max kom från ett hundhem, så han har ingen uppfödare alls. Uppfödarens ände får en cirkel: en hund har noll eller en uppfödare. Varje hund har däremot en ägare, så den änden får ett andra streck: exakt en.

Många-till-många? En hund kan många trick, och ett trick, säg Sitt, kan många hundar. Det är många-till-många, och det är precis där jag letar efter ett dolt begrepp. Finns det något om att den här hunden kan det här tricket? Hur bra hon gör det, och när hon lärde sig det. Relationen har egna fakta, så den blir en egen sak: Hundtrick, med hundens namn först, eftersom det är hunden som driver den.

Vad betyder varje linje? En ägare äger en hund. En uppfödare föder upp den. En hund kan sina trick. Namnge linjerna, så kan vem som helst läsa modellen tillbaka för dig.

Nu, eller över tid? Bryr sig någon om hur bra Bella är på Sitt i dag, eller hur hon kom dit? Om en tränare kontrollerar henne med några månaders mellanrum blir varje kontroll en egen post: en Trickbedömning, med datum, färdighetsnivå och vem som gjorde kontrollen, under det hundtrick den hör till. Även en relation som blev en sak kan ha en egen historik.

Ras lämnar jag okopplad tills vidare. Det är fortfarande frågan från modul 1, en egen ruta eller ett ord på hunden, och modul 4 avgör den.

Hundmodellen med sina relationer Sju rutor. En ägare äger en eller många hundar, och varje hund har exakt en ägare. En uppfödare föder upp en eller många hundar, och en hund har noll eller en uppfödare. En hund kan noll eller många hundtrick, och ett trick kan av noll eller många hundtrick; varje hundtrick är en hund och ett trick. Varje hundtrick kontrolleras i noll eller många trickbedömningar. Ras står för sig själv, ännu inte kopplad. äger föder upp kan kan av kontrolleras i Ägare Uppfödare Hund Ras Hundtrick Trick Trickbedömning exakt en noll eller en en eller många noll eller många © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Var och en av de frågorna fungerar på samma sätt i en riktig verksamhet. Nu ställer vi dem till Steve Trucking.

En av de första sakerna jag vill förstå om en relation är dess kardinalitet. Det är databastermen; frågan är mycket enklare: hur många av de här kan höra ihop med hur många av de där? På konceptuell nivå finns det tre grundmönster.

Det här är ett viktigt steg i processen: ta två olika substantiv och förstå deras relation. I de flesta fall är det en-till-många, eller många-till-en. Bara i sällsynta fall stöter du på en-till-en.

En-till-många finns överallt. En detaljhandelspartner har många distributionscentraler. Ett manifest listar många leveranser. En rutt har ungefär tio stopp. När jag hör sådant språk börjar jag rita linjen.

Och nu får linjen sina markeringar. Varje ände säger hur många av den ruta den rör: strecket för en, kråkfoten för många. Läs den från varje ruta: en detaljhandelspartner har många distributionscentraler.

Grundkopplingen, en till många Två par rutor, vart och ett förenat med en linje i grundläggande kråkfotsnotation. En detaljhandelspartner driver många distributionscentraler: ett enkelt streck vid detaljhandelspartnern, en kråkfot vid distributionscentralen. Ett manifest listar många leveranser, markerat på samma sätt. Varje ände har en förklaring i ord. en/ett Detaljhandelspartner många Distributionscentraler driver en/ett Manifest många Leveranser listar Detaljhandelspartner Distributionscentral Manifest Leverans Ett enkelt streck är en. Kråkfoten är många. Läs varje ände från rutan den rör. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

En-till-en-relationer finns, men de är sällsynta, och när jag hittar en ställer jag några frågor. Är det här verkligen två olika substantiv, eller samma? Om de är olika, vad är då en-till-en-relationen mellan dem? Och kommer den alltid att vara en-till-en, eller bara en-till-en just nu? Det här är nyckelfrågor när du designar datamodellen. Ett team och en lastbil ser ut att vara en-till-en en given morgon: två personer, en lastbil, en rutt. Över en månad är de inte det, och det är där den mest intressanta relationen i den här modellen gömmer sig.

Många-till-många-relationer är särskilt intressanta, eftersom de ofta säger oss att det finns ännu ett begrepp i verksamheten. Kan ett team köra mer än en lastbil över tid? Ja. Kan en lastbil köras av mer än ett team? Under sin livstid, absolut. Så team och lastbilar har en många-till-många-relation. Men nu vill jag veta mer. Bryr sig verksamheten om när ett team hade en lastbil? För vilken rutt, vilken dag? Vem gjorde tilldelningen? Om själva relationen bär information vi bryr oss om har vi upptäckt ännu ett affärsbegrepp: teamtilldelningen (Crew Assignment).

Det är en viktig modelleringsvana. Ibland är det mest intressanta inte ett av substantiven vi hörde först. Det gömmer sig i relationen mellan två substantiv.

Det här är ett av ställena där jag vill att admins börjar tänka annorlunda. I Salesforce är vi vana vid att prata om objekt och fält, så det är lätt att se rutorna som det viktiga och linjerna som rörledningar. Men själva relationen kan ha en affärsmässig betydelse.

Tänk på en leverans och produkterna på den. En leverans kan innehålla flera produkter, säg en tvättmaskin och en torktumlare. En produkt, samma kylskåpsmodell, dyker upp på tusentals leveranser. Enkelt nog. Men tänk om jag behöver veta hur många av den produkten som finns på den här leveransen, om den ska installeras, eller om den gamla ska forslas bort? Då är jag inte längre bara intresserad av en relation mellan leverans och produkt. Jag är intresserad av en leveransrad (Delivery Item), och det begreppet förtjänar en egen entitet.

Om du kommer från Salesforce kanske du redan tänker: ”Det där är ett kopplingsobjekt.” Du har inte fel. Men jag vill inte börja där. En leveransrad är ett affärsbegrepp innan den är ett kopplingsobjekt i Salesforce (Salesforce Junction Object). Verksamheten först, implementationen sedan.

Några av mina vanor för de här relationsentiteterna, var de än byggs till slut.

Namnge den. Om verksamheten redan har ett ord för den, använd deras. Om den inte har det, ta namnen på de två föräldrarna och sätt ihop dem. Tänk på en order och en produkt. Saken mellan dem är orderraden (Order Item): ordern, och raden på ordern. Den är barn till båda föräldrarna, och i Salesforce kan den sluta som ett kopplingsobjekt i Salesforce. Men vilket namn kommer först: Item Order eller Order Item? Titta på vilken sorts data varje förälder är. Produkten är referensdata; ordern är transaktionsdata, och det är ordern som driver den. Så det blir Order Item, eller Order Product, på samma sätt som Salesforce har Opportunity Product. Hos Steve Trucking är det leveransraden (Delivery Item). Det drivande namnet kommer först, och posten sorteras bredvid sin ägare i varje lista du någonsin kommer att titta på.

Ge den en egen nyckel. Det är frestande att säga att en leveransrad identifieras av leverans plus produkt och stanna där. Det är en sammansatt nyckel, och sammansatta nycklar är mycket svårare att hantera: varje system som pekar på posten måste bära med sig båda halvorna. Ge relationsentiteten ett eget ID, och behåll leverans plus produkt som en regel om unikhet, inte som postens ID.

Två föräldrar, ett barn: ge det en egen nyckel Två föräldrar och ett barn. En leverans (post-ID Leverans-ID; leveransdatum, status) innehåller många leveransrader. En produkt (post-ID Produkt-ID; namn, modellnummer) finns på många leveransrader. Leveransraden sitter mellan dem: den har ett eget post-ID, Leveransrads-ID, och bär leverans-ID:t och produkt-ID:t från sina två föräldrar, plus ett antal. En anteckning under: leverans-ID plus produkt-ID är en regel om unikhet, inte post-ID:t. TRANSAKTIONSDATA REFERENSDATA innehåller finns på Leverans Leverans-ID POST-ID Leveransdatum Status Leveransrad Leveransrads-ID POST-ID Leverans-ID Produkt-ID Antal Produkt Produkt-ID POST-ID Namn Modellnummer Leverans-ID + Produkt-ID: en regel om unikhet, inte post-ID:t. en många © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Lägg märke till vad som inte finns där: ett serienummer. Ett antal och ett serienummer hör inte hemma på samma post. Ett antal räknar flera av en sak; ett serienummer identifierar en viss sak. Om verksamheten behöver serienummer blir varje enhet en egen post, och fem kylskåp är fem poster. Jag ser inget fall för en leveransrad med en Delivery Item Detail under sig. Det är det ena eller det andra: ett aggregat med ett antal, eller en post per enhet. Här blir det antalet.

Håll koll på attributen som vill ha historik. En del relationsentiteter är färdiga när de väl skapats: tvättmaskinen på den här leveransen förblir tvättmaskinen på den här leveransen. Andra ändras hela tiden. Ett team har lastbil 117 den här veckan, och nästa vecka går lastbilen till ett annat team. När relationen ändras och verksamheten bryr sig om hur den brukade vara behöver relationsentiteten datum, och det är teamtilldelningen du ska hålla koll på. Fråga tidigt om verksamheten bryr sig om nu eller över tid; vi återkommer till det om en stund.

”En-till-många” räcker inte för att förstå en relation. Jag vill också veta vad relationen betyder.

En leverans har en plats. Vilken? Distributionscentralen den lämnar? Mottagarens hem dit den ska? De är inte utbytbara. Två modeller kan ha exakt samma rutor och samma kardinalitet, och linjerna kan betyda helt olika saker. Därför är en bra modell inte bara rutor sammankopplade med linjer. Linjerna behöver namn. Om jag ger mitt diagram till en annan arkitekt ska hen inte behöva gissa vad en relation betyder, och om jag visar det för verksamheten ska det använda ett språk de känner igen.

Linjerna behöver namn Två paneler, var och en med en ruta Plats ovanför en ruta Leverans, förenade med två linjer, var och en markerad en plats till många leveranser. I den vänstra panelen, ”Inga namn på linjerna”, saknar de två linjerna namn och ser likadana ut. I den högra panelen, ”Linjer med namn”, heter den ena linjen ”lämnar från” och den andra ”levereras till”. Samma rutor, samma kardinalitet: bara namnen talar om vilken linje som är vilken. INGA NAMN PÅ LINJERNA LINJER MED NAMN lämnar från levereras till Plats Leverans Plats Leverans Samma rutor, samma kardinalitet. Bara namnen talar om vilken linje som är vilken. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Det finns en annan fråga gömd i ”hur många?”: är relationen obligatorisk? Kan en leverans finnas innan den har lagts på en rutt? Det måste den: manifestet kommer en eller två dagar före leveransen, och rutterna fastställs kvällen innan. Kan en leverans finnas utan en detaljhandelspartner? Nej; varje leverans kommer från en partners manifest. Det är valfrihet (optionality).

Återigen, hoppa inte direkt till en Required-kryssruta i Salesforce. Det är skillnad på att säga ”varje leverans måste ha en detaljhandelspartner” och att säga ”Salesforce ska kräva fältet för detaljhandelspartner när posten skapas”. De kan sluta som samma implementation, men de är inte samma påstående. Det första är en affärsregel; det andra är ett sätt att upprätthålla den. Som arkitekter vill vi förstå det första innan vi bestämmer det andra.

I diagrammet är valfriheten den andra markeringen i varje ände. Markeringen närmast rutan är det högsta antalet: strecket för en, kråkfoten för många. Nästa markering utåt är det lägsta: ännu ett streck betyder minst en, en cirkel betyder att det kan vara noll. Så varje leverans finns på exakt ett manifest, och ett manifest listar en eller många leveranser. En leverans hör till noll eller ett stopp, inget förrän den har ruttplanerats, och ett stopp lämnar av noll eller många leveranser.

Att läsa båda markeringarna i varje ände Tre rutor i rad: Manifest, Leverans, Stopp. Ett manifest listar en eller många leveranser, och varje leverans finns på exakt ett manifest: två streck vid manifestet, en kråkfot och ett streck vid leveransen. Ett stopp lämnar av noll eller många leveranser, och varje leverans finns vid noll eller ett stopp: en cirkel och en kråkfot vid leveransen, en cirkel och ett streck vid stoppet. Närmast rutan är högst; nästa markering utåt är minst. exakt en/ett Manifest en/ett eller många Leveranser listar noll eller en/ett Stopp noll eller många Leveranser lämnar av Manifest Leverans Stopp Närmast rutan: högst (en, eller många). Nästa markering utåt: minst (ett streck är minst en, en cirkel är noll). © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Här är en fråga jag ställer ofta: menar du nu, eller menar du över tid?

Ett team kör en lastbil. Just nu? För dagens rutt? Så länge de två personerna arbetar ihop? Det ger olika modeller. Om verksamheten bara bryr sig om vilken lastbil ett team har i dag kan modellen förbli enkel. Om den behöver varje lastbil ett team har kört, när och på vilken rutt, behöver vi historik, och den där teamtilldelningen vi upptäckte blir plötsligt väldigt viktig.

Teamtilldelningen: vilket team som har vilken lastbil Två föräldrar och ett barn. Ett team (post-ID Team-ID; namn, status) arbetar i många teamtilldelningar. En lastbil (post-ID Lastbils-ID, också känd under sitt enhetsnummer; märke, modell, status) används i många teamtilldelningar. Varje teamtilldelning har ett eget post-ID och bär team-ID:t och lastbils-ID:t, och inga datum. En anteckning under: vilket team som har vilken lastbil, men inte sedan när. arbetar används i Team Team-ID POST-ID Namn Status Teamtilldelning Teamtilldelnings-ID POST-ID Team-ID Lastbils-ID Lastbil Lastbils-ID POST-ID Enhetsnummer OCKSÅ KÄND SOM Märke Modell Status Vilket team som har vilken lastbil, men inte sedan när. en många © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Det här är en vanlig källa till modelleringsmisstag. Vi modellerar det aktuella läget, för det är det vi ser på skärmen. Sedan, några veckor senare, anmäler en detaljhandelspartner en skada och någon frågar: ”Vilket team hade lastbil 117 den 17 mars?” Och vi upptäcker att vi har skrivit över svaret varje gång tilldelningen ändrades.

Ett sätt att behålla den historiken är att göra tilldelningen till en egen post. När ett team tilldelas skapar vi en teamtilldelning med ett startdatum. När tilldelningen ändras sätter vi ett slutdatum på den gamla posten och skapar en ny med ett eget startdatum. Nu är ”vem hade den tilldelningen för sex månader sedan?” en enkel fråga att besvara, i stället för att gräva i fälthistorik eller en logg över dataändringar. Och när ett team väl har haft många tilldelningar kommer någon att fråga vilken som är den aktuella, så jag skulle lägga till en Active-flagga (aktiv) också.

Teamtilldelningen över tid: datum och en Aktiv-flagga Två föräldrar och ett barn, med datum. Ett team (post-ID Team-ID; namn, status) arbetar i många teamtilldelningar. En lastbil (post-ID Lastbils-ID, också känd under sitt enhetsnummer; märke, modell, status) används i många teamtilldelningar. Varje teamtilldelning har ett eget post-ID och bär team-ID:t och lastbils-ID:t, ett startdatum, ett slutdatum och en Aktiv-flagga. En anteckning under: varje ändring avslutar en tilldelning och startar nästa, och Aktiv markerar den nuvarande. arbetar används i Team Team-ID POST-ID Namn Status Teamtilldelning Teamtilldelnings-ID POST-ID Team-ID Lastbils-ID Startdatum Slutdatum Aktiv Lastbil Lastbils-ID POST-ID Enhetsnummer OCKSÅ KÄND SOM Märke Modell Status Varje ändring avslutar en tilldelning och startar nästa. Aktiv markerar den nuvarande. en många © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Så när någon berättar om en relation frågar jag inte bara hur sakerna hänger ihop. Jag frågar: ändras relationen, och bryr vi oss om dess historik?

Vår modell för Steve Trucking börjar bli användbar. Vi vet vilka relationer som är en-till-många, var en många-till-många döljer ett annat begrepp, vilka relationer som är valfria och vilka som ändras över tid. Och vi har fortfarande inte skapat ett enda Salesforce-objekt. Det är avsiktligt.

Den konceptuella modellen efter modul 1 och 2 Konceptuell modell för Steve Trucking, grupperad som kunddata, transaktionsdata och referensdata. En detaljhandelspartner skickar manifest som listar leveranser, och driver distributionscentraler. Varje leverans lämnar från en distributionscentral, går till en mottagare och innehåller leveransrader. Rutter har stopp som lämnar av leveranser. En teamtilldelning kopplar ett team och en lastbil till en rutt, så att modellen behåller vem som körde vilken lastbil, och när. KUNDDATA TRANSAKTIONSDATA REFERENSDATA driver skickar listar innehåller lämnar från levereras till har lämnar av kör arbetar används i Detaljhandelspartner återförsäljaren vi levererar åt Mottagare den som tar emot den Manifest partnerns leveranslista Leverans en order till en mottagare Leveransrad det som ligger på lastbilen Rutt en dags tur med stopp Stopp en adress på rutten Teamtilldelning vem som körde vilken lastbil, och när Distributionscentral där leveranserna utgår från Team två personer Lastbil fordonet exakt en noll eller en en eller många noll eller många © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Det här diagrammet ska vara något jag kan lägga fram för verksamheten, och de ska inte behöva kunna Salesforce för att säga om det stämmer. Om de inte kan validera det för att det är fullt av Salesforce-terminologi har jag gått för snabbt till den fysiska designen.

När jag arbetar igenom relationerna i en konceptuell modell bestämmer jag:

  • Hur verksamhetens viktigaste entiteter hänger ihop med varandra.
  • Om varje relation är en-till-en, en-till-många eller många-till-många, nu och över tid.
  • Om varje relation är obligatorisk eller valfri.
  • Om en många-till-många-relation döljer ett meningsfullt affärsbegrepp.
  • Om relationen ändras över tid, och om vi behöver dess historik.

Lookup eller master-detail, konfiguration av kopplingsobjekt, kaskadbeteende och delning är fysiska beslut; dit kommer vi. Just nu besvarar vi fortfarande den viktigare frågan: hur fungerar den här verksamheten egentligen? När vi förstår entiteterna och relationerna mellan dem kan vi börja lägga till detaljerna som beskriver dem. Det är då vår konceptuella modell börjar bli en logisk datamodell.