Pular para o conteúdo

Steve Trucking, o que eu arquitetaria

Também em 28 idiomas

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

Módulo 6 de 6 do capítulo Dados mestres e identidade, capítulo 6 do curso Data Architect, e o fim da Parte 1. Anterior: Quando a autoridade é partilhada · Próximo: a Parte 2 começa com Designing for Scale (coming soon)

A pergunta que este checkpoint responde: Consegue juntar a Parte 1 num cenário real?

Tente primeiro o desafio. Esta é a minha resolução comentada do desafio do Checkpoint 1. Se ainda não desenhou o seu próprio design, faça-o antes de continuar a ler. O valor está em comparar o seu raciocínio com o meu, não em ler a resposta.

Isto é «O que eu arquitetaria»: uma solução viável possível, não a resposta, com os trade-offs nomeados e as minhas posições tomadas. Ainda não tratámos de grandes volumes de dados, design de consultas, padrões de integração, migração nem transações, e isso é de propósito: a arquitetura desenvolve-se à medida que aprende mais. Mas a Parte 1 dá-nos o suficiente para montar o esqueleto.

Do briefing: cerca de 3.300 entregas por dia útil, um milhão por ano, a crescer 30% ao ano. Cerca de 1,6 itens de linha por entrega (1,6 milhões por ano); umas oito mudanças de estado por entrega (8 milhões por ano); quatro a cinco milhões de fotografias por ano; cerca de 200 mil leituras de GPS por dia; cerca de 180 mil casos por ano; três Parceiros retalhistas a enviar manifestos de três formas diferentes; nove centros de distribuição; 330 camiões com equipas de duas pessoas. E a Steve Trucking já corre uma org Salesforce com Service Cloud, Field Service e um portal de parceiros. Conte os zeros antes de desenhar uma única caixa. Vão decidir várias coisas a seguir.

As entregas são o coração disto, e o Field Service já faz a expedição. Por isso começo pelo modelo padrão do Field Service, como fez o recorte do capítulo 3:

Conceito de negócioObjeto SalesforcePorquê
Parceiro retalhistaAccount (tipo de registo Retail Partner)Uma empresa com a qual a Steve Trucking tem contrato; carrega contratos, casos e acesso ao portal
Pessoal do parceiro (gestores de CD, pessoal das lojas)ContactOs utilizadores do portal têm de ser Contactos
Uma entrega: um Destinatário, uma morada, uma encomenda do parceiro, um diaWork OrderA unidade de trabalho do Field Service; o agendamento, a aplicação móvel e os relatórios de serviço dependem dela
Cada artigo ou serviço: o frigorífico, a instalação, a recolhaWork Order Line ItemDivide o trabalho, orienta as checklists e a faturação
O tipo de paragem: só entrega, com instalação, com recolhaWork TypeDefine a duração, as competências e a checklist de instalação
A visita agendada e a sua janelaService AppointmentO que o Field Service agenda e a aplicação da equipa mostra
Equipas e camiões; áreas de expedição dos CDService Resource, Service Crew, Service TerritoryO Field Service agenda uma equipa como um único recurso
Dúvidas dos Destinatários, reclamações dos parceirosCaseA consola de atendimento, direitos (entitlements), e-mail para caso
A lista do parceiro para terça-feira no CD de PhoenixManifest__c (personalizado)Nada padrão representa a unidade de receção, reconciliação e reprocessamento

Todo o resto continua padrão. Resistir a mais objetos personalizados é deliberado: a pergunta do capítulo 1 era quando deve um arquiteto resistir a mais um, e aqui a resposta é «quase sempre». A linha de encomenda do parceiro, por exemplo, não é um objeto novo. É a Ordem de trabalho, identificada pela referência do parceiro.

Checkpoint 1: o núcleo das entregas O núcleo físico do Checkpoint 1 para a Steve Trucking. No núcleo: um Parceiro retalhista, uma Conta com um tipo de registo, envia Manifestos, o único objeto personalizado, e cada Entrega é de um parceiro. Um Manifesto lista Entregas. Uma Entrega é uma Ordem de trabalho que leva o Destinatário como campos; é agendada como Marcações, Marcações de serviço, e contém Itens de entrega, Itens de linha da ordem de trabalho, cada um descrito por um Tipo de paragem, um Tipo de trabalho. Uma Equipa, uma Service Crew, é atribuída a Marcações e trabalha numa Área de expedição do CD, um Service Territory. Uma Consulta ou reclamação, um Caso, pode referir-se a Entregas. Fora do núcleo: os sinais de GPS da Equipa vão para o data warehouse, a Entrega liga-se às Fotografias de entrega num armazenamento de fotografias, e cada Marcação publica o seu Histórico de estados como eventos no data warehouse. Por baixo: olhe para a nave-mãe: o Field Service é o núcleo das entregas. NO NÚCLEO FORA DO NÚCLEO envia é dono da lista refere se a agendada como contém descreve equipas trabalham em atribuída a emite sinais liga se a publica Parceiro retalhista Account · tipo de registo Manifesto Manifest__c · personalizado Consulta ou reclamação Case Entrega WorkOrder · campos do Destinatário Item de entrega WorkOrderLineItem Marcação ServiceAppointment Tipo de paragem WorkType Área de expedição do CD ServiceTerritory Equipa ServiceCrew Histórico de estados eventos, data warehouse Fotografias de entrega armazenamento de fotografias, associado Sinais de GPS data warehouse, por referência Olhe para a nave-mãe: o Field Service é o núcleo das entregas. exatamente um zero ou um um ou muitos zero ou muitos pesquisa © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Cresce a partir do final do capítulo 3 (Projete o modelo físico Salesforce): os mesmos objetos nos mesmos lugares, com a equipa, a área de expedição, o caso e o que o Checkpoint 1 mantém fora do núcleo acrescentados.

A chave que faz corresponder a encomenda de um parceiro a uma entrega

Seção intitulada “A chave que faz corresponder a encomenda de um parceiro a uma entrega ”

Cada linha do manifesto torna-se uma Ordem de trabalho, ligada ao seu Manifesto. A chave é a pergunta a que mais quero resposta: como sabemos que esta linha do parceiro é aquela entrega? A minha resposta: um ID externo na Ordem de trabalho construído a partir do Parceiro retalhista e da própria referência de encomenda e de entrega do parceiro (algo como KEYSTONE-PHX-8843119-1), marcado como único. Um campo por fonte, um-para-um. É o identificador do parceiro, não o nosso: o «vários identificadores para uma coisa» do capítulo 2, e o «o parceiro é dono da sua referência de encomenda» do módulo 1.

Porque importa: os manifestos chegam com um a dois dias de antecedência e são revistos no próprio dia. Com esta chave, cada manifesto reenviado ou revisto faz upsert em vez de criar duplicados. A revisão atualiza a Ordem de trabalho, um campo regista-a, e uma mudança numa entrega já com rota alerta o coordenador: a mudança do parceiro é aplicada, mas assinalada até a expedição a confirmar. É também isto que muda em relação ao desenho do capítulo 4. Hoje cada manifesto cai no RouteDesk, e os coordenadores voltam a escrever as rotas no Salesforce e as paragens concluídas de volta. Neste design, os manifestos entram diretamente no Salesforce, com upsert pela chave do parceiro; o RouteDesk é desativado, e acaba a reintrodução manual. O capítulo de integração projeta os três formatos de entrada. A decisão de dados é a chave.

O Destinatário: conta pessoal, Contacto ou nenhum dos dois?

Seção intitulada “O Destinatário: conta pessoal, Contacto ou nenhum dos dois? ”

Esta é a decisão de dados mais interessante da Parte 1, então aqui estão as opções, e depois a minha escolha.

Opção A: contas pessoais. Cada Destinatário torna-se uma conta pessoal, ligada a cada entrega. A favor: padrão, funciona naturalmente com o Service Cloud, as mensagens e a consola, reconhece Destinatários recorrentes. Contra: cerca de um milhão de novos Destinatários por ano, cada um uma conta pessoal com cerca do dobro do armazenamento de uma conta empresarial (Estimated Record Size by Object Type (opens in a new tab), em inglês), por isso, em dois anos, um dos maiores objetos da org. E os Destinatários não são clientes da Steve Trucking. São clientes de cada Parceiro retalhista, e a Steve Trucking nunca pode misturar o cliente de um parceiro com o de outro (S2).

Opção B: Contactos sob a conta do Parceiro retalhista. Contra: um milhão de Contactos sob três ou quatro contas é desequilíbrio pai-filho a uma escala gigantesca, muito além da orientação da Salesforce de cerca de 10 mil filhos por pai (Considerations for Object Relationships (opens in a new tab); Parent-Child Data Skew (opens in a new tab), em inglês). Esta é a opção para mostrar, e rejeitar.

Opção C: o Destinatário vive na entrega. O nome, o telefone, o e-mail, a morada e as notas de entrega do Destinatário são campos na Ordem de trabalho (os campos de morada já são padrão ali), capturados do manifesto. A favor: nenhum objeto grande novo; os dados vivem exatamente enquanto a entrega precisa deles; a eliminação acontece por entrega, no prazo do parceiro; e o isolamento entre parceiros vem de graça, porque cada entrega pertence a um parceiro. Contra: um Destinatário recorrente não é reconhecido como a mesma pessoa.

Esse é o equilíbrio a encontrar. Alguma vez vai ser preciso reconhecer várias entregas como sendo da mesma pessoa, no mesmo lugar? Dar um login a essa pessoa? Essa é a linha entre um Destinatário que precisa de um registo próprio e os dados do Destinatário que são simplesmente dados sobre a entrega. E existe um caminho do meio. Leve o próprio ID de cliente do Parceiro retalhista como um campo na entrega, um Retail Partner Customer ID (ID de cliente do Parceiro retalhista). Não cria um registo de Destinatário, mas liga entre si as entregas que um parceiro envia para o mesmo cliente, o que é o início de uma experiência do cliente mais unificada, e leva diretamente de volta ao sistema do Parceiro retalhista, onde esse cliente realmente vive. É o identificador deles, por isso só significa algo em conjunto com o parceiro: o cliente 4417 de um parceiro não tem nada a ver com o de outro.

Na minha opinião profissional, a Opção C é a escolha certa. A parte do não reconhecimento é aceitável, até desejável: a Steve Trucking não tem relação com estas pessoas para além da entrega. É outra vez o módulo 1: o Destinatário é cliente do parceiro, e o parceiro é a autoridade sobre quem ele é. E é o capítulo 5: dados pessoais que ficam num só lugar, ligados a uma entrega, são muito mais fáceis de proteger, reter e eliminar. E resiste às formas normais do capítulo 2: os dados do Destinatário são um para um com a entrega, por isso pertencem-lhe. Um filho Destinatário separado pouparia alguns valores repetidos à custa de mais um objeto, mais uma relação e a respetiva sobrecarga, e a única forma de poupar mais seria tratar a mesma pessoa como uma só entre Parceiros retalhistas, o que não vamos fazer. Por isso a entrega transporta o Destinatário, com o Retail Partner Customer ID como o caminho de volta ao próprio sistema do parceiro.

Quem é o Destinatário? Três opções para o Destinatário, cada uma com os seus prós e contras. Opção A, uma conta pessoal por Destinatário: falha na relação, porque o Destinatário é cliente do parceiro; falha no volume, cerca de um milhão por ano com o dobro do armazenamento de uma conta comercial; passa no desequilíbrio, cada um é a sua própria conta; falha no isolamento entre parceiros, porque mistura os clientes dos parceiros; falha na eliminação, sobrevivendo à entrega; passa no reconhecimento de recorrências. Rejeitada. Opção B, Contactos sob o Parceiro retalhista: falha na relação, já que não são funcionários do parceiro; falha no volume; falha no desequilíbrio, um milhão sob três ou quatro contas; passa no isolamento, sob a conta de um único parceiro; falha na eliminação; reconhece recorrências dentro de um parceiro. Mostrar e rejeitar. Opção C, campos do Destinatário na Ordem de trabalho, destacada como a escolha do Checkpoint 1: a única relação é a entrega; nenhum objeto novo; nenhum pai novo; um parceiro por entrega; eliminados no prazo do parceiro; e um Destinatário recorrente não é reconhecido, e não faz mal. Por baixo: modele a pessoa de acordo com a relação que realmente tem. A: Conta pessoal rejeitada A FAVOR Reconhece um Destinatário recorrente Sem desequilíbrio de pai: cada um é a sua própria conta CONTRA O cliente é do parceiro, não nosso Cerca de 1 milhão por ano, com o dobro do armazenamento Mistura os clientes dos parceiros (S2) Sobrevive à entrega B: Contacto sob o Parceiro retalhista: mostrar e rejeitar A FAVOR Fica sob um único parceiro (S2) Recorrências reconhecidas dentro de um parceiro CONTRA Não são funcionários do parceiro 1 milhão sob 3 ou 4 contas: desequilíbrio Sobrevive à entrega C: Na entrega campos na Ordem de trabalho: a escolha A FAVOR A única relação é a entrega Nenhum objeto novo, nenhum pai novo Um parceiro por entrega (S2) Eliminados no prazo do parceiro CONTRA Um Destinatário recorrente não é reconhecido: não faz mal Modele a pessoa de acordo com a relação que realmente tem. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

João Silva, Rua Principal, 123, aparece no manifesto da Redrock e no da Brightwave. Provavelmente a mesma pessoa. A Steve Trucking deve unificá-los? Não, de propósito. Unificar Destinatários entre Parceiros retalhistas violaria o S2: um parceiro nunca pode ver os Destinatários de outro, e uma identidade unificada é exatamente a ponte por onde isso escaparia. É a posição deste capítulo aplicada: faça correspondências a menos onde misturar custa caro, e aqui misturar custa muito caro.

Se mais tarde um Parceiro retalhista quiser o reconhecimento de Destinatários recorrentes dentro das suas próprias entregas, esse é um trabalho para uma ferramenta de resolução de identidade, como a do Data 360, limitada a esse parceiro: um mapa ao estilo registry, não uma conta pessoal, e nunca entre parceiros. Um mapa de quem é quem não concede propriedade, e não concede acesso.

O capítulo 3 perguntou onde os dados devem viver. Aqui os zeros respondem:

  • O estado atual vive na Marcação de serviço e na Ordem de trabalho. O histórico das mudanças de estado, cerca de 8 milhões por ano e a crescer, não precisa de viver na org do núcleo. Cada mudança é publicada como um evento e guardada no data warehouse, o Snowflake. A org guarda o estado atual; o histórico continua lá para atendimento, operações e análise, só que não na base de dados operacional.
  • As fotografias (quatro a cinco milhões por ano, algumas a mostrar pessoas ou o interior de uma casa) vivem fora do núcleo, num armazenamento feito para esse volume, enviadas diretamente da aplicação da equipa. A org guarda só o que precisa: um pequeno registo de índice por fotografia, ou só uma contagem e um indicador de «fotografias obrigatórias da instalação completas». A minha preferência é a opção mais leve: manter a org enxuta, e deixar o repositório de fotografias ser dono do seu índice e da sua retenção.
  • As leituras de GPS (200 mil por dia) ficam no FleetLink e vão para o Snowflake; a org só precisa da última posição para a página de seguimento e o mapa do expedidor.
  • Os oito anos de histórico do RouteDesk (cerca de 5 milhões de entregas) vão para o data warehouse ou um arquivo, acessíveis para reclamações. O que entra na org, se alguma coisa entrar, é uma decisão de migração para a Parte 2.
Checkpoint 1: o que eu arquitetaria O panorama do Checkpoint 1, o que eu arquitetaria, nos mesmos lugares do panorama atual do capítulo 4. As pessoas à esquerda: 45 coordenadores de expedição dentro de 9 CDs dos parceiros, cerca de 700 membros das equipas de entrega em 330 camiões, 100 pessoas de atendimento e escritório, todos a usar o Salesforce; cerca de 300 utilizadores dos Parceiros retalhistas em 3 parceiros, a usar o portal dos Parceiros retalhistas; e cerca de um milhão de Destinatários por ano, que abrem uma página de seguimento por um link, sem login, e telefonam aos agentes de atendimento. No meio, uma única org Salesforce nos EUA com o Field Service, o fornecedor de identidade empresarial acima dela só para o pessoal de escritório, e o e-mail para caso a trazer os casos. Os três Parceiros retalhistas, em baixo à direita, a Redrock por API REST e webhooks, a Keystone por CSV via SFTP e a Brightwave por EDI através de uma rede de terceiros, enviam manifestos para uma única camada de integração, projetada na Parte 2, que faz upsert deles no Salesforce pela chave do parceiro e devolve o estado a cada parceiro. À direita: o Salesforce envia eventos de estado ao Snowflake, que guarda o histórico de estados e a análise de dados; o FleetLink, onde fica o GPS bruto, envia só a última posição ao Salesforce; o Salesforce envia as contagens de entregas pela integração ao ERP financeiro, que fatura os parceiros e paga as equipas; as fotografias, de 4 a 5 milhões por ano, vão da aplicação das equipas para um armazenamento de fotografias fora do núcleo; e o RouteDesk é desativado, ficando como arquivo dos seus 8 anos de histórico. O Salesforce envia a mensagem da véspera, com um link, através do fornecedor de SMS e e-mail. Por baixo: a mesma empresa do capítulo 4; a reintrodução manual e a folha de cálculo acabaram; o histórico e as fotografias vivem fora do núcleo. ACIMA: IDENTIDADE, APPEXCHANGE, WEB PESSOAS DIREITA: SISTEMAS INTERNOS ABAIXO: CANAIS DE CLIENTES EM BAIXO À DIREITA: PARCEIROS E FORNECEDORES Coordenadores de expedição 45, dentro de 9 CDs dos parceiros Equipas de entrega ~700 em 330 camiões Atendimento e escritório 100: serviço, operações, finanças Utilizadores dos Parceiros retalhistas ~300 em 3 parceiros Destinatários ~1 milhão por ano IdP empresarial SSO só para o pessoal de escritório Portal dos Parceiros retalhistas Página de seguimento INTEGRAÇÃO Snowflake histórico de estados, análise de dados FleetLink o GPS bruto fica aqui ERP financeiro fatura os parceiros, paga as equipas Armazenamento de fotografias 4–5 milhões por ano, fora do núcleo Arquivo do RouteDesk desativado; 8 anos de histórico Telefone agentes de atendimento E-mail e-mail para caso Fornecedor de SMS e e-mail mensagem na véspera, com um link Redrock API REST, webhooks Keystone CSV por SFTP Brightwave EDI por uma rede de terceiros Salesforce Field Service, uma org nos EUA um link, sem login só pessoal de escritório chamadas casos entram manifestos entram estado sai manifestos entram estado sai manifestos entram estado sai upserts, chave do parceiro eventos de estado só a última posição contagens de entregas contagens de entregas fotografias, da aplicação das equipas na véspera, com um link Salesforce uma comunidade pessoas identidade, aplicações, web um sistema interno um canal de clientes a camada de integração parte do sistema que abre a ligação; o rótulo diz o que se move um certificado partilhado: confiança, sem chamada direta A mesma empresa do capítulo 4. A reintrodução manual e a folha de cálculo acabaram; o histórico e as fotografias vivem fora do núcleo. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Checkpoint 1: o que eu arquitetaria. Os mesmos lugares do panorama do capítulo 4 (O panorama da Steve Trucking), sem a reintrodução manual e sem a folha de cálculo.

  • Os Parceiros retalhistas veem só as suas próprias entregas (S2). Cada Ordem de trabalho carrega o seu Parceiro retalhista; os utilizadores do portal veem as entregas do seu parceiro, e os gestores de CD só as do seu CD.
  • Os utilizadores parceiros precisam de uma licença de portal que suporte regras de partilha e funções: Customer Community Plus ou Partner Community. Os lugares no estádio do capítulo 3: os lugares mais baratos não recebem a partilha de que este design precisa. As duas licenças precisam de funções para os utilizadores externos, e a Salesforce avisa que mais funções tornam a org mais lenta (Experience Cloud User Licenses (opens in a new tab), em inglês). Uma função por parceiro e por CD não faz mal; uma função para cada loja, não.

Conhecimento para o exame. Saiba que licenças externas trazem partilha padrão: Customer Community Plus e Partner Community (com funções para os utilizadores externos), não a Customer Community, que usa conjuntos de partilha.

  • Os Destinatários não precisam de licença. A página de seguimento mostra uma entrega através de um link com um token que expira (S3), não de um login.
  • Cuidado com o desequilíbrio. Centenas de milhares de Ordens de trabalho por ano a apontar para três ou quatro contas de parceiros é desequilíbrio de dados na conta. Uma opção é uma conta filha por CD sob cada parceiro, o que espalha os filhos por nove ou mais pais; arquivar as entregas concluídas depois do prazo de reclamações mantém baixo o número de filhos ativos por pai. A Parte 2 enfrenta isto.

Não criaria uma conta pessoal para cada Destinatário só porque um Destinatário é um indivíduo. Não penduraria um milhão de Contactos em três contas. Não construiria um objeto Entrega personalizado ao lado da Ordem de trabalho do Field Service. Não unificaria Destinatários entre parceiros. Não poria milhões de fotografias ou leituras de GPS no armazenamento do núcleo. E não chamaria golden record a um Destinatário unificado a menos que tivéssemos de facto tomado uma decisão de dados mestres.

A Parte 1 montou o esqueleto; a Parte 2 põe-no à prova. A fasquia de grandes volumes de dados no terceiro ano (Ordens de trabalho, Marcações de serviço e itens de linha estão todos em território de grande volume dentro de dois ou três anos), o design de consultas para vistas de lista limitadas por parceiro, as três integrações de entrada e os três feeds de estado, a migração do RouteDesk, as transações no próprio dia, e o design de segurança por trás do portal. A Steve Trucking também vai mudar. Guarde este design; vai voltar a ele.

  • Quais objetos padrão carregam o núcleo (aqui, os do Field Service), e quais objetos personalizados são realmente justificados (aqui, um).
  • A chave que faz corresponder a linha de encomenda de cada parceiro a uma entrega, e porque é que pertence ao parceiro.
  • O que é o Destinatário, com base na relação que a Steve Trucking realmente tem com ele.
  • Se identidades devem ser unificadas, e onde misturar é caro demais para arriscar.
  • O que fica na org, o que vive fora do núcleo, e de que licenças depende o design.