Ga naar inhoud

Steve Trucking, hoe ik het zou ontwerpen

Ook beschikbaar in 28 talen

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

A row of plain white delivery trucks ready at the loading doors at first light, a clipboard on the front of the nearest one.
Afbeelding gegenereerd met AI

Module 6 van 6 in het hoofdstuk Stamgegevens en identiteit, hoofdstuk 6 van de cursus Data Architect, en het einde van Deel 1. Vorige: Als zeggenschap gedeeld is · Volgende: Deel 2 begint met Ontwerpen voor schaal (coming soon)

De vraag die deze checkpoint beantwoordt: Kun je Deel 1 samenbrengen in een echt scenario?

Probeer eerst de opdracht. Dit is mijn uitwerking van de opdracht van Checkpoint 1. Als je je eigen ontwerp nog niet getekend hebt, doe dat dan voordat je verder leest. De waarde zit in het vergelijken van jouw redenering met de mijne, niet in het lezen van het antwoord.

Dit is “hoe ik het zou ontwerpen”: een mogelijke werkbare oplossing, niet het antwoord, met de afwegingen benoemd en mijn standpunten ingenomen. We hebben grote datavolumes, queryontwerp, integratiepatronen, migratie of transacties nog niet behandeld, en dat is bewust: architectuur ontwikkelt zich naarmate je meer leert. Maar Deel 1 geeft ons genoeg om het skelet neer te zetten.

Uit de briefing: ongeveer 3.300 leveringen per werkdag, een miljoen per jaar, met 30% groei per jaar. Ongeveer 1,6 regels per levering (1,6 miljoen per jaar); ongeveer acht statuswijzigingen per levering (8 miljoen per jaar); vier tot vijf miljoen foto’s per jaar; ongeveer 200.000 gps-metingen per dag; ongeveer 180.000 cases per jaar; drie retailpartners die vrachtlijsten op drie verschillende manieren sturen; negen distributiecentra; 330 vrachtwagens met tweemansploegen. En Steve Trucking draait al één Salesforce-org met Service Cloud, Field Service en een partnerportaal. Tel de nullen voordat je ook maar één vakje tekent. Ze beslissen hieronder meerdere dingen.

De kern van de leveringen: kijk naar het moederschip

Section titled “De kern van de leveringen: kijk naar het moederschip ”

De leveringen zijn het hart ervan, en Field Service doet al de planning. Dus begin ik met het standaardmodel van Field Service, zoals het stuk in hoofdstuk 3 deed:

BedrijfsbegripSalesforce-objectWaarom
RetailpartnerAccount (recordtype Retailpartner)Een bedrijf waarmee Steve Trucking een contract heeft; draagt contracten, cases en portaaltoegang
Medewerkers van de partner (DC-managers, winkelpersoneel)Contactpersoon (Contact)Portaalgebruikers moeten contactpersonen zijn
Eén levering: één ontvanger, één adres, één partnerorder, één dagWerkorder (Work Order)De werkeenheid van Field Service; planning, de mobiele app en servicerapporten hangen eraan
Elk artikel of elke dienst: de koelkast, de installatie, de afvoerWerkorderregel (Work Order Line Item)Verdeelt het werk, stuurt checklists en facturatie
Het soort stop: alleen levering, met installatie, met afvoerWerktype (Work Type)Bepaalt duur, vaardigheden en de installatiechecklist
Het geplande bezoek en zijn tijdvensterServiceafspraak (Service Appointment)Wat Field Service plant en de app van de ploeg toont
Ploegen en vrachtwagens; planningsgebieden van de distributiecentraService Resource, Service Crew, Service TerritoryField Service plant een ploeg als één resource
Vragen van ontvangers, claims van partnersCaseDe serviceconsole, entitlements, email-to-case
De lijst van de partner voor dinsdag in het distributiecentrum PhoenixManifest__c (aangepast)Niets standaards vertegenwoordigt de eenheid van ontvangst, afstemming en opnieuw afspelen

Al het andere blijft standaard. Me verzetten tegen meer aangepaste objecten is bewust: de vraag van hoofdstuk 1 was wanneer een architect zich moet verzetten tegen nog een object, en hier is het antwoord “bijna altijd”. De orderregel van de partner is bijvoorbeeld geen nieuw object. Het is de werkorder, herkend aan de referentie van de partner.

Checkpoint 1: de leveringskern De fysieke kern van Checkpoint 1 voor Steve Trucking. In de core: een retailpartner, een account met een recordtype, stuurt vrachtlijsten, het enige aangepaste object, en elke levering is voor één partner. Een vrachtlijst bevat leveringen. Een levering is een werkorder (Work Order) die de ontvanger als velden meedraagt; ze wordt ingepland als afspraken, serviceafspraken (Service Appointment), en bevat leveringsitems, werkorderregels (Work Order Line Item), elk beschreven door een soort stop, een werktype (Work Type). Een ploeg, een Service Crew, wordt aan afspraken toegewezen en werkt in een DC-planningsgebied, een Service Territory. Een vraag of claim, een case, kan over leveringen gaan. Buiten de core: de gps-pings van de ploeg gaan naar het datawarehouse, de levering linkt naar leveringsfoto's in een foto-opslag, en elke afspraak publiceert haar statushistorie als events naar het datawarehouse. Onderaan: kijk naar het moederschip: Field Service is de leveringskern. IN DE CORE BUITEN DE CORE stuurt is voor bevat gaat over ingepland als bevat beschrijft ploegen werken in toegewezen aan pingt linkt naar publiceert Retailpartner Account · recordtype Vrachtlijst Manifest__c · aangepast Vraag of claim Case Levering WorkOrder · ontvangervelden Leveringsitem WorkOrderLineItem Afspraak ServiceAppointment Soort stop WorkType DC-planningsgebied ServiceTerritory Ploeg ServiceCrew Statushistorie events, datawarehouse Leveringsfoto's foto-opslag, gelinkt Gps-pings datawarehouse, via verwijzing Kijk naar het moederschip: Field Service is de leveringskern. precies één nul of één één of veel nul of veel opzoeken © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Het groeit uit de finale van hoofdstuk 3 (Ontwerp het fysieke Salesforce-model): dezelfde objecten op dezelfde plekken, met de ploeg, het planningsgebied, de case en wat Checkpoint 1 buiten de core houdt erbij.

De sleutel die een partnerorder aan een levering koppelt

Section titled “De sleutel die een partnerorder aan een levering koppelt ”

Elke regel van een vrachtlijst wordt één werkorder, gekoppeld aan zijn vrachtlijst. De sleutel is de vraag waarop ik het liefst een antwoord wil: hoe weten we dat deze regel van de partner die levering is? Mijn antwoord: een externe ID op de werkorder, opgebouwd uit de retailpartner en de eigen order- en leveringsreferentie van de partner (iets als KEYSTONE-PHX-8843119-1), gemarkeerd als uniek. Eén veld per bron, één op één. Het is de identificator van de partner, niet die van ons: “meerdere identificatoren voor één ding” uit hoofdstuk 2, en “de partner is eigenaar van zijn orderreferentie” uit module 1.

Waarom het ertoe doet: vrachtlijsten komen één tot twee dagen vooraf binnen en worden op de dag zelf herzien. Met die sleutel upsert elke opnieuw verstuurde of herziene vrachtlijst in plaats van duplicaten te maken. De herziening werkt de werkorder bij, een veld legt haar vast, en een wijziging aan een levering die al gerouteerd is, waarschuwt de coördinator: de wijziging van de partner wordt doorgevoerd, maar gemarkeerd tot de planning haar bevestigt. Dit is ook wat er verandert ten opzichte van de tekening uit hoofdstuk 4. Vandaag komt elke vrachtlijst in RouteDesk terecht, en typen coördinatoren routes over in Salesforce en voltooide stops terug. In dit ontwerp komen de vrachtlijsten rechtstreeks in Salesforce binnen, ge-upsert op de sleutel van de partner; RouteDesk wordt uitgefaseerd, en het overtypen stopt. Het hoofdstuk over integratie ontwerpt de drie inkomende formaten. De databeslissing is de sleutel.

De ontvanger: persoonsaccount, contactpersoon, of geen van beide?

Section titled “De ontvanger: persoonsaccount, contactpersoon, of geen van beide? ”

Dit is de interessantste databeslissing van Deel 1, dus hier zijn de opties, en dan mijn keuze.

Optie A: persoonsaccounts. Elke ontvanger wordt een persoonsaccount, gekoppeld aan elke levering. Voor: standaard, werkt vanzelf met Service Cloud, messaging en de console, herkent terugkerende ontvangers. Tegen: ongeveer een miljoen nieuwe ontvangers per jaar, elk een persoonsaccount met ongeveer twee keer de opslag van een zakelijk account (Estimated Record Size by Object Type (opens in a new tab)), dus binnen twee jaar een van de grootste objecten in de org. En ontvangers zijn niet de klanten van Steve Trucking. Het zijn de klanten van elke retailpartner, en Steve Trucking mag de klant van de ene partner nooit vermengen met die van een andere (S2).

Optie B: contactpersonen onder het account van de retailpartner. Tegen: een miljoen contactpersonen onder drie of vier accounts is parent-child skew op enorme schaal, ver voorbij de richtlijn van Salesforce van ongeveer 10.000 children per parent (Considerations for Object Relationships (opens in a new tab); Parent-Child Data Skew (opens in a new tab)). Dit is de optie om te laten zien, en af te wijzen.

Optie C: de ontvanger staat op de levering. De naam, telefoon, e-mail, het adres en de leveringsnotities van de ontvanger zijn velden op de werkorder (de adresvelden zijn daar al standaard), overgenomen uit de vrachtlijst. Voor: geen nieuw groot object; de data leeft precies zo lang als de levering haar nodig heeft; verwijderen gebeurt per levering, volgens het schema van de partner; en de isolatie tussen partners krijg je gratis, omdat elke levering bij één partner hoort. Tegen: een terugkerende ontvanger wordt niet als dezelfde persoon herkend.

Dat is het evenwicht dat je moet vinden. Zal het ooit nodig zijn om meerdere leveringen te herkennen als dezelfde persoon, op dezelfde plek? Om die persoon een login te geven? Dat is de grens tussen een ontvanger die een eigen record nodig heeft en ontvangergegevens die gewoon data over de levering zijn. En er is een middenweg. Neem de eigen klant-ID van de retailpartner mee als veld op de levering, een klant-ID van de retailpartner (Retail Partner Customer ID). Het maakt geen ontvangerrecord aan, maar het verbindt de leveringen die een partner voor dezelfde klant stuurt, en dat is het begin van een meer geünificeerde klantervaring, en het leidt rechtstreeks terug naar het systeem van de retailpartner, waar die klant echt leeft. Het is hun identificatie, dus het betekent alleen iets samen met de partner: klant 4417 van de ene partner heeft niets te maken met die van een andere.

Naar mijn professionele mening is optie C de juiste keuze. Het niet-herkennen is acceptabel, zelfs wenselijk: Steve Trucking heeft met deze mensen geen relatie buiten de levering. Het is weer module 1: de ontvanger is de klant van de partner, en de partner heeft de zeggenschap over wie ze zijn. En het is hoofdstuk 5: persoonsgegevens die op één plek terechtkomen, verbonden met één levering, zijn veel makkelijker te beschermen, te bewaren en te verwijderen. En het houdt stand tegenover de normaalvormen uit hoofdstuk 2: de gegevens van de ontvanger zijn één-op-één met de levering, dus ze horen erop. Een apart onderliggend ontvangerobject zou een paar herhaalde waarden besparen ten koste van nog een object, nog een relatie en de overhead ervan, en de enige manier waarop het meer zou besparen, is door dezelfde persoon over retailpartners heen als één te behandelen, en dat doen we niet. Dus de levering draagt de ontvanger, met de klant-ID van de retailpartner als weg terug naar het eigen systeem van de partner.

Wie is de ontvanger? Drie opties voor de ontvanger, elk met argumenten voor en tegen. Optie A, een persoonsaccount per ontvanger: faalt op de relatie, omdat de ontvanger de klant van de partner is; faalt op volume, ongeveer een miljoen per jaar tegen twee keer de opslag van een zakelijk account; slaagt op skew, elk een eigen account; faalt op partnerisolatie, omdat het klanten van partners vermengt; faalt op verwijdering, omdat het de levering overleeft; slaagt op het herkennen van terugkerende ontvangers. Afgewezen. Optie B, contactpersonen onder de retailpartner: faalt op de relatie, want ze zijn geen personeel van de partner; faalt op volume; faalt op skew, een miljoen onder drie of vier accounts; slaagt op isolatie, onder het account van één partner; faalt op verwijdering; herkent terugkerende ontvangers binnen een partner. Tonen en afwijzen. Optie C, ontvangervelden op de werkorder, gemarkeerd als de keuze van Checkpoint 1: de enige relatie is de levering; geen nieuw object; geen nieuwe parent; één partner per levering; verwijderd volgens het schema van de partner; en een terugkerende ontvanger wordt niet herkend, en dat is prima. Onderaan: modelleer de persoon naar de relatie die je echt hebt. A: Persoonsaccount afgewezen VOOR Herkent een terugkerende ontvanger Geen parent-skew: elk is een eigen account TEGEN De klant van de partner, niet de onze Zo'n 1 mln. per jaar, tegen dubbele opslag Vermengt klanten van partners (S2) Overleeft de levering B: Contactpersoon onder de retailpartner: tonen en afwijzen VOOR Onder één partner gehouden (S2) Terugkeer bekend binnen een partner TEGEN Geen personeel van de partner 1 mln. onder 3 of 4 accounts: skew Overleeft de levering C: Op de levering velden op de werkorder: de keuze VOOR De enige relatie is de levering Geen nieuw object, geen nieuwe parent Eén partner per levering (S2) Verwijderd volgens het schema van de partner TEGEN Een terugkerende ontvanger wordt niet herkend: prima Modelleer de persoon naar de relatie die je echt hebt. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Zou ik ontvangers over partners heen unificeren?

Section titled “Zou ik ontvangers over partners heen unificeren? ”

John Smith, 123 Main Street, staat in de vrachtlijst van Redrock en in die van Brightwave. Waarschijnlijk dezelfde persoon. Moet Steve Trucking ze unificeren? Nee, bewust niet. Ontvangers over retailpartners heen unificeren zou S2 schenden: een partner mag nooit de ontvangers van een andere partner zien, en een geünificeerde identiteit is precies de brug waarlangs het lekt. Het is het standpunt van dit hoofdstuk, toegepast: match te weinig waar vermengen duur is, en hier is vermengen heel duur.

Als een retailpartner later terugkerende ontvangers binnen zijn eigen leveringen wil herkennen, is dat een taak voor een tool voor identiteitsresolutie, zoals die van Data 360, afgebakend tot die partner: een kaart in registrystijl, geen persoonsaccount, en nooit over partners heen. Een kaart van wie wie is, geeft geen eigenaarschap, en ook geen toegang.

Hoofdstuk 3 vroeg waar data hoort te staan. De nullen beantwoorden het hier:

  • De huidige status staat op de serviceafspraak en de werkorder. De historie van statuswijzigingen, ongeveer 8 miljoen per jaar en groeiend, hoeft niet in de core-org te staan. Elke wijziging wordt gepubliceerd als event en bewaard in het datawarehouse, Snowflake. De org houdt de huidige toestand bij; de historie is er nog steeds voor service, operations en analytics, alleen niet in de operationele database.
  • Foto’s (vier tot vijf miljoen per jaar, sommige met mensen of de binnenkant van een huis) staan buiten de core in opslag die voor dat volume gebouwd is, rechtstreeks geüpload vanuit de app van de ploeg. De org houdt alleen bij wat ze nodig heeft: een klein indexrecord per foto, of alleen een aantal en een markering “verplichte installatiefoto’s compleet”. Mijn voorkeur is de lichtere optie: houd de org slank, en laat de fotoopslag eigenaar zijn van haar index en bewaartermijn.
  • Gps-metingen (200.000 per dag) blijven in FleetLink en gaan naar Snowflake; de org heeft alleen de laatste positie nodig voor de trackingpagina en de kaart van de planner.
  • De acht jaar historie van RouteDesk (ongeveer 5 miljoen leveringen) gaan naar het datawarehouse of een archief, bereikbaar voor claims. Wat er eventueel in de org komt, is een migratiebeslissing voor Deel 2.
Checkpoint 1: hoe ik het zou ontwerpen Het landschap van Checkpoint 1, hoe ik het zou ontwerpen, op dezelfde plekken als het huidige landschap uit hoofdstuk 4. Mensen links: 45 planningscoördinatoren in 9 distributiecentra van partners, ongeveer 700 ploegleden op 330 vrachtwagens, en 100 medewerkers van klantenservice en kantoor, die allemaal Salesforce gebruiken; ongeveer 300 gebruikers bij 3 retailpartners, via het retailpartnerportaal; en ongeveer een miljoen ontvangers per jaar, die een trackingpagina openen via een link, zonder login, en klantenservicemedewerkers bellen. In het midden één Amerikaanse Salesforce-org met Field Service, de identiteitsprovider van het bedrijf erboven, alleen voor kantoorpersoneel, en email-to-case die cases binnenbrengt. De drie retailpartners rechtsonder, Redrock via REST API en webhooks, Keystone via CSV over SFTP, en Brightwave via EDI over een extern netwerk, sturen vrachtlijsten naar één integratielaag, ontworpen in Deel 2, die ze op de sleutel van de partner in Salesforce upsert en status terugstuurt naar elke partner. Rechts: Salesforce stuurt statusevents naar Snowflake, dat de statushistorie en analytics bewaart; FleetLink, waar de ruwe gps-data blijft, stuurt alleen de laatste positie naar Salesforce; Salesforce stuurt leveringsaantallen via de integratie naar het finance-ERP, dat partners factureert en ploegen betaalt; foto's, 4 tot 5 miljoen per jaar, gaan van de app van de ploegen naar foto-opslag buiten de core; en RouteDesk is uitgefaseerd naar een archief van zijn 8 jaar historie. Salesforce stuurt het bericht van de dag ervoor, met een link, via de sms- en e-mailprovider. Onderaan: hetzelfde bedrijf als in hoofdstuk 4; het overtypen en de spreadsheet zijn weg; de historie en de foto's staan buiten de core. BOVEN: IDENTITEIT, APPEXCHANGE, WEB MENSEN RECHTS: INTERNE SYSTEMEN ONDER: KLANTKANALEN RECHTSONDER: PARTNERS EN PROVIDERS Planningscoördinatoren 45, in 9 DC's van partners Ploegen ~700 op 330 vrachtwagens Klantenservice en kantoor 100: service, operations, finance Gebruikers van retailpartners ~300 bij 3 partners Ontvangers ~1 miljoen per jaar IdP van het bedrijf SSO alleen voor kantoorpersoneel Retailpartnerportaal Trackingpagina INTEGRATIE Snowflake statushistorie, analytics FleetLink ruwe gps-data blijft hier Finance-ERP factureert partners, betaalt ploegen Foto-opslag 4–5 miljoen per jaar, buiten de core RouteDesk-archief uitgefaseerd; 8 jaar historie Telefoon klantenservicemedewerkers E-mail email-to-case Sms- en e-mailprovider bericht de dag ervoor, met een link Redrock REST API, webhooks Keystone CSV via SFTP Brightwave EDI via een extern netwerk Salesforce Field Service, één Amerikaanse org een link, geen login alleen kantoorpersoneel belt cases in vrachtlijsten in status uit vrachtlijsten in status uit vrachtlijsten in status uit upserts, partnersleutel statusevents alleen laatste positie leveringsaantallen leveringsaantallen foto's, uit de app van de ploegen de dag ervoor, met een link Salesforce een community mensen identiteit, apps, web een intern systeem een klantkanaal de integratielaag begint bij het systeem dat de verbinding opent; het label zegt wat er beweegt een gedeeld certificaat: vertrouwen, geen directe aanroep Hetzelfde bedrijf als in hoofdstuk 4. Het overtypen en de spreadsheet zijn weg; de historie en de foto's staan buiten de core. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Checkpoint 1: hoe ik het zou ontwerpen. Dezelfde plekken als het landschap uit hoofdstuk 4 (Het landschap van Steve Trucking), zonder het overtypen en de spreadsheet.

Wie ziet wat, en wie heeft een licentie nodig

Section titled “Wie ziet wat, en wie heeft een licentie nodig ”
  • Retailpartners zien alleen hun eigen leveringen (S2). Elke werkorder draagt zijn retailpartner; portaalgebruikers zien de leveringen van hun partner, en DC-managers alleen die van hun distributiecentrum.
  • Partnergebruikers hebben een portaallicentie nodig die deelregels en rollen ondersteunt: Customer Community Plus of Partner Community. De stadionplaatsen uit hoofdstuk 3: de goedkoopste plaatsen krijgen niet de sharing die dit ontwerp nodig heeft. Beide licenties hebben rollen nodig voor de externe gebruikers, en Salesforce waarschuwt dat meer rollen de org vertragen (Experience Cloud User Licenses (opens in a new tab)). Een rol per partner en per distributiecentrum is prima; een rol voor elke winkel niet.

Examenkennis. Weet welke externe licenties standaard delen (standard sharing) meebrengen: Customer Community Plus en Partner Community (met rollen voor de externe gebruikers), niet Customer Community, dat sharing sets gebruikt.

  • Ontvangers hebben geen licentie nodig. De trackingpagina toont één levering via een link met een token dat verloopt (S3), geen login.
  • Let op de skew. Honderdduizenden werkorders per jaar die naar drie of vier partneraccounts wijzen, zijn account data skew. Eén optie is een child-account per distributiecentrum onder elke partner, wat de children over negen of meer parents verdeelt; afgeronde leveringen archiveren na de claimperiode houdt het aantal actieve children per parent laag. Deel 2 gaat daarop in.

Ik zou geen persoonsaccount aanmaken voor elke ontvanger omdat een ontvanger een individu is. Ik zou geen miljoen contactpersonen aan drie accounts hangen. Ik zou geen aangepast object Delivery bouwen naast de werkorder van Field Service. Ik zou ontvangers niet over partners heen unificeren. Ik zou geen miljoenen foto’s of gps-metingen in de core-opslag zetten. En ik zou een geünificeerde ontvanger geen golden record noemen, tenzij we echt een beheerbeslissing genomen hadden.

Deel 1 zette het skelet neer; Deel 2 test het. De LDV-meetlat in jaar drie (werkorders, serviceafspraken en regels zitten binnen twee tot drie jaar allemaal in het gebied van grote volumes), queryontwerp voor lijstweergaven per partner, de drie inkomende integraties en drie statusfeeds, de migratie van RouteDesk, transacties op de dag zelf, en het beveiligingsontwerp achter het portaal. Steve Trucking zal ook veranderen. Bewaar dit ontwerp; je komt erop terug.

  • Welke standaardobjecten de kern dragen (hier die van Field Service), en welke aangepaste objecten echt gerechtvaardigd zijn (hier één).
  • De sleutel die de orderregel van elke partner aan een levering koppelt, en waarom hij bij de partner hoort.
  • Wat de ontvanger is, op basis van de relatie die Steve Trucking echt met hem heeft.
  • Of je identiteiten unificeert, en waar vermengen te duur is om te riskeren.
  • Wat in de org blijft, wat buiten de core staat, en van welke licenties het ontwerp afhangt.