Перейти до вмісту

Steve Trucking, як я б це спроєктував

Також доступно 28 мовами

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 · 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.
Зображення згенеровано ШІ

Модуль 6 з 6 розділу Основні дані та ідентичність, розділ 6 курсу Data Architect, і кінець Частини 1. Попередній: Коли авторитетність спільна · Наступний: Частина 2 починається з розділу Проєктування для масштабу (coming soon)

Питання, на яке відповідає ця контрольна точка: Чи можете ви зібрати Частину 1 разом на справжньому сценарії?

Спершу спробуйте завдання. Це мій розбір завдання Контрольної точки 1. Якщо ви ще не намалювали власного дизайну, зробіть це, перш ніж читати далі. Цінність у порівнянні ваших міркувань із моїми, а не в читанні відповіді.

Це «як я б це спроєктував»: можливе життєздатне рішення, а не та сама відповідь, із названими компромісами і зайнятими позиціями. Ми ще не розглядали великих обсягів даних, дизайну запитів, інтеграційних шаблонів, міграції чи транзакцій, і це навмисно: архітектура розвивається, коли ви дізнаєтеся більше. Але Частина 1 дає достатньо, щоб поставити скелет.

З брифу: близько 3 300 доставок на робочий день, мільйон на рік, зростання 30% на рік. Близько 1,6 позиції на доставку (1,6 мільйона на рік); близько восьми змін статусу на доставку (8 мільйонів на рік); чотири-п’ять мільйонів фото на рік; близько 200 000 показань GPS на день; близько 180 000 звернень на рік; три роздрібні партнери, що надсилають маніфести трьома різними способами; дев’ять розподільчих центрів; 330 вантажівок із бригадами з двох людей. І Steve Trucking уже має одну org Salesforce із Service Cloud, Field Service і порталом партнерів. Порахуйте нулі, перш ніж малювати хоч один прямокутник. Нижче вони вирішать кілька речей.

Ядро доставок: дивіться на материнський корабель

Section titled “Ядро доставок: дивіться на материнський корабель ”

Доставки — серце всього, і Field Service уже займається диспетчеризацією. Тож я починаю зі стандартної моделі Field Service, як це зробив зріз у розділі 3:

Бізнес-поняттяОб’єкт SalesforceЧому
Роздрібний партнерAccount (тип запису Retail Partner)Компанія, з якою Steve Trucking має договір; несе договори, звернення й доступ до порталу
Персонал партнера (менеджери DC, працівники магазинів)ContactКористувачі порталу мають бути Contacts
Одна доставка: один отримувач, одна адреса, одне замовлення партнера, один деньРобоче замовлення (Work Order)Одиниця роботи Field Service; на ній висять планування, мобільний застосунок і сервісні звіти
Кожен предмет чи послуга: холодильник, встановлення, вивезенняРядок робочого замовлення (Work Order Line Item)Розділяє роботу, керує чек-листами й рахунками
Вид зупинки: лише доставка, зі встановленням, з вивезеннямТип робіт (Work Type)Встановлює тривалість, навички і чек-лист встановлення
Запланований візит і його вікноСервісний візит (Service Appointment)Те, що планує Field Service і показує застосунок бригади
Бригади й вантажівки; зони диспетчеризації DCService Resource, Service Crew, Service TerritoryField Service планує бригаду як один ресурс
Запити отримувачів, претензії партнерівCaseСервісна консоль, entitlements, email-to-case
Перелік партнера на вівторок для DC у ФініксіManifest__c (користувацький)Нічого стандартного не представляє одиницю отримання, звірки й повторного відтворення

Усе інше лишається стандартним. Опір іще більшій кількості користувацьких об’єктів — свідомий: запитання розділу 1 було, коли архітекторові варто опиратися ще одному, і тут відповідь — «майже завжди». Рядок замовлення партнера, наприклад, — не новий об’єкт. Це робоче замовлення, ідентифіковане номером партнера.

Контрольна точка 1: ядро доставок Фізичне ядро Контрольної точки 1 для Steve Trucking. В ядрі: роздрібний партнер, Account із типом запису, надсилає маніфести — єдиний користувацький об’єкт, — і кожна доставка належить одному партнеру. Маніфест перелічує доставки. Доставка — це Work Order, що несе отримувача у вигляді полів; її планують як візити (Service Appointment), вона містить позиції доставки (Work Order Line Item), кожну з яких описує вид зупинки (Work Type). Бригаду (Service Crew) призначають на візити, і вона працює в зоні диспетчеризації DC (Service Territory). Запит чи претензія (Case) може стосуватися доставок. Поза ядром: GPS-сигнали бригади йдуть у сховище даних, доставка посилається на фото доставок у сховищі фото, а кожен візит публікує свою історію статусів як події в сховище даних. Внизу: дивіться на материнський корабель: Field Service — це ядро доставок. В ЯДРІ ПОЗА ЯДРОМ надсилає має перелічує стосується планується як містить описує тут працюють бригади призначена на надсилає сигнали посилається на публікує Роздрібний партнер Account · тип запису Маніфест Manifest__c · користувацький Запит чи претензія Case Доставка WorkOrder · поля отримувача Позиція доставки WorkOrderLineItem Візит ServiceAppointment Вид зупинки WorkType Зона диспетчеризації DC ServiceTerritory Бригада ServiceCrew Історія статусів події, сховище даних Фото доставок сховище фото, за посиланням GPS-сигнали сховище даних, за посиланням Дивіться на материнський корабель: Field Service — це ядро доставок. рівно один нуль або один один або багато нуль або багато lookup © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Вона виростає з фіналу розділу 3 (Спроєктуйте фізичну модель Salesforce): ті самі об’єкти на тих самих місцях, а до них додано бригаду, зону диспетчеризації, звернення і те, що Контрольна точка 1 тримає поза ядром.

Ключ, що зіставляє замовлення партнера з доставкою

Section titled “Ключ, що зіставляє замовлення партнера з доставкою ”

Кожен рядок маніфесту стає одним робочим замовленням, пов’язаним зі своїм маніфестом. Ключ — запитання, на яке я найбільше хочу відповіді: як ми знаємо, що цей рядок від партнера — це та доставка? Моя відповідь: External ID на робочому замовленні, складений із роздрібного партнера і власного номера замовлення й доставки партнера (щось на кшталт KEYSTONE-PHX-8843119-1), позначений як унікальний. Одне поле на джерело, один до одного. Це ідентифікатор партнера, а не наш: «кілька ідентифікаторів для однієї речі» з розділу 2 і «партнер володіє своїм номером замовлення» з модуля 1.

Чому це важливо: маніфести приходять за день-два наперед і переглядаються в день доставки. З цим ключем кожен повторно надісланий чи переглянутий маніфест робить upsert, а не створює дублікати. Перегляд оновлює робоче замовлення, поле його фіксує, а зміна вже маршрутизованої доставки сповіщає координатора: зміну партнера застосовано, але позначено, доки диспетчеризація її не підтвердить. Саме це й змінюється порівняно з малюнком із розділу 4. Сьогодні кожен маніфест потрапляє в RouteDesk, а координатори вручну переносять маршрути в Salesforce, а завершені зупинки — назад. У цьому дизайні маніфести приходять просто в Salesforce через upsert за ключем партнера; RouteDesk виводять з ужитку, і ручне перенесення припиняється. Розділ про інтеграцію проєктує три вхідні формати. Рішення щодо даних — це ключ.

Отримувач: персональний акаунт, Contact чи ні те, ні інше?

Section titled “Отримувач: персональний акаунт, Contact чи ні те, ні інше? ”

Це найцікавіше рішення щодо даних у Частині 1, тож ось варіанти, а потім мій вибір.

Варіант A: персональні акаунти. Кожен отримувач стає персональним акаунтом, пов’язаним із кожною доставкою. За: стандартно, природно працює із Service Cloud, повідомленнями й консоллю, впізнає повторних отримувачів. Проти: близько мільйона нових отримувачів на рік, кожен — персональний акаунт, що займає приблизно вдвічі більше сховища, ніж бізнес-акаунт (Estimated Record Size by Object Type (opens in a new tab)), тож за два роки — один із найбільших об’єктів в org. І отримувачі — не клієнти Steve Trucking. Вони клієнти кожного роздрібного партнера, а Steve Trucking ніколи не має змішувати клієнта одного партнера з клієнтом іншого (S2).

Варіант B: Contacts під акаунтом роздрібного партнера. Проти: мільйон Contacts під трьома-чотирма акаунтами — це перекіс «батько — дочірній» у величезному масштабі, далеко за настановою Salesforce приблизно в 10 000 дочірніх записів на батька (Considerations for Object Relationships (opens in a new tab); Parent-Child Data Skew (opens in a new tab)). Цей варіант треба показати — і відкинути.

Варіант C: отримувач живе на доставці. Ім’я, телефон, пошта, адреса й нотатки до доставки отримувача — поля на робочому замовленні (поля адреси там уже стандартні), взяті з маніфесту. За: жодного нового великого об’єкта; дані живуть рівно стільки, скільки вони потрібні доставці; видалення відбувається для кожної доставки за графіком партнера; а ізоляція партнерів дістається безкоштовно, бо кожна доставка належить одному партнерові. Проти: повторного отримувача не впізнають як ту саму людину.

Ось баланс, якого треба досягти. Чи колись виникне потреба впізнати кілька доставок як ту саму людину за тією самою адресою? Дати цій людині вхід у систему? Це межа між отримувачем, якому потрібен власний запис, і даними отримувача, які є просто даними про доставку. І є середній шлях. Несіть власний ID клієнта роздрібного партнера як поле на доставці — Retail Partner Customer ID. Він не створює запису отримувача, але пов’язує доставки, які партнер надсилає для того самого клієнта, а це початок більш уніфікованого клієнтського досвіду, і він веде просто назад до системи роздрібного партнера, де цей клієнт насправді живе. Це їхній ідентифікатор, тож він має сенс лише разом із партнером: клієнт 4417 одного партнера не має нічого спільного з клієнтом 4417 іншого.

На мою професійну думку, варіант C — правильний вибір. Невпізнавання прийнятне, навіть бажане: Steve Trucking не має з цими людьми стосунків поза доставкою. Це знову модуль 1: отримувач — клієнт партнера, і партнер — авторитет щодо того, хто вони. І це розділ 5: персональні дані, що потрапляють в одне місце, прив’язані до однієї доставки, набагато легше захищати, зберігати й видаляти. І це витримує перевірку нормальними формами з розділу 2: дані отримувача один до одного з доставкою, тож їм місце на ній. Окремий дочірній запис отримувача заощадив би кілька повторюваних значень ціною ще одного об’єкта, ще одного зв’язку та їхніх накладних витрат, а заощадити більше він міг би, лише якби ми вважали ту саму людину однією між роздрібними партнерами, чого ми робити не будемо. Тож доставка несе отримувача, а Retail Partner Customer ID — шлях назад до власної системи партнера.

Хто такий отримувач? Три варіанти для отримувача, кожен зі своїми аргументами за і проти. Варіант A — персональний акаунт на кожного отримувача: не проходить за стосунками, бо отримувач — клієнт партнера; не проходить за обсягом — близько мільйона на рік із подвійним, порівняно з бізнес-акаунтом, сховищем; проходить за перекосом — кожен є окремим акаунтом; не проходить за ізоляцією партнерів, бо змішує клієнтів партнерів; не проходить за видаленням — переживає доставку; проходить за впізнаванням повторних отримувачів. Відкинуто. Варіант B — контакти під роздрібним партнером: не проходить за стосунками, бо це не персонал партнера; не проходить за обсягом; не проходить за перекосом — мільйон під трьома-чотирма акаунтами; проходить за ізоляцією — під акаунтом одного партнера; не проходить за видаленням; впізнає повторних отримувачів у межах партнера. Показати й відкинути. Варіант C — поля отримувача на Work Order, виділено як вибір Контрольної точки 1: єдині стосунки — це доставка; жодного нового об’єкта; жодного нового батька; один партнер на доставку; видаляється за графіком партнера; а повторного отримувача не впізнають, і це нормально. Внизу: моделюйте людину відповідно до стосунків, які у вас справді є. A: Персональний акаунт відкинуто ЗА Впізнає повторного отримувача Без перекосу: кожен — окремий акаунт ПРОТИ Клієнт партнера, не наш Близько 1 млн на рік, з подвійним сховищем Змішує клієнтів партнерів (S2) Переживає доставку B: Контакт під роздрібним партнером: показати й відкинути ЗА Тримається під одним партнером (S2) Повтори видно в межах партнера ПРОТИ Не персонал партнера 1 млн під 3–4 акаунтами: перекіс Переживає доставку C: На доставці поля на Work Order: вибір ЗА Єдині стосунки — це доставка Жодного нового об’єкта, жодного нового батька Один партнер на доставку (S2) Видаляється за графіком партнера ПРОТИ Повторного отримувача не впізнають: це нормально Моделюйте людину відповідно до стосунків, які у вас справді є. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Чи уніфікував би я отримувачів між партнерами?

Section titled “Чи уніфікував би я отримувачів між партнерами? ”

John Smith, 123 Main Street, з’являється в маніфесті Redrock і в маніфесті Brightwave. Мабуть, та сама людина. Чи має Steve Trucking їх уніфікувати? Ні, свідомо ні. Уніфікація отримувачів між роздрібними партнерами порушила б S2: партнер ніколи не має бачити отримувачів іншого партнера, а уніфікована ідентичність — саме той міст, через який усе витікає. Це позиція цього розділу на практиці: зіставляйте менше там, де змішування дороге, а тут змішування дуже дороге.

Якщо роздрібний партнер згодом захоче впізнавати повторних отримувачів у межах власних доставок, це робота для інструмента розпізнавання ідентичності, як-от у Data 360, з обмеженням цим партнером: карта в стилі registry, а не персональний акаунт, і ніколи між партнерами. Карта того, хто є хто, не дає власності і не дає доступу.

Що лишається в org, а що ні

Section titled “Що лишається в org, а що ні ”

Розділ 3 питав, де мають жити дані. Тут на це відповідають нулі:

  • Поточний статус живе на сервісному візиті й робочому замовленні. Історія змін статусу, близько 8 мільйонів на рік і більше, не мусить жити в core org. Кожна зміна публікується як подія і зберігається у сховищі даних, Snowflake. Org тримає поточний стан; історія досі доступна для сервісу, операцій і аналітики, просто не в операційній базі даних.
  • Фото (чотири-п’ять мільйонів на рік, деякі з людьми чи інтер’єром дому) живуть поза core у сховищі, збудованому для такого обсягу, і завантажуються просто із застосунку бригади. Org тримає лише потрібне: невеликий запис-індекс на кожне фото або лише лічильник і позначку «обов’язкові фото встановлення є». Я віддаю перевагу легшому варіанту: тримайте org худою, а сховище фото нехай володіє своїм індексом і зберіганням.
  • Показання GPS (200 000 на день) лишаються у FleetLink і йдуть у Snowflake; org потрібна лише остання позиція для сторінки відстеження й карти диспетчера.
  • Вісім років історії RouteDesk (близько 5 мільйонів доставок) ідуть у сховище даних чи архів, досяжні для претензій. Що, якщо взагалі щось, потрапить в org — рішення про міграцію для Частини 2.
Контрольна точка 1: що я б спроєктував Ландшафт Контрольної точки 1 — що я б спроєктував, — з тими самими місцями, що й поточний ландшафт розділу 4. Люди ліворуч: 45 координаторів диспетчеризації у 9 DC партнерів, близько 700 членів бригад доставки на 330 вантажівках, 100 працівників підтримки й офісу — усі працюють у Salesforce; близько 300 користувачів у 3 роздрібних партнерів, які працюють на порталі роздрібних партнерів; і близько мільйона отримувачів на рік, які відкривають сторінку відстеження через посилання, без входу в систему, і телефонують агентам підтримки. Посередині — одна org Salesforce у США з Field Service, над нею корпоративний постачальник ідентичності лише для офісу, а email-to-case приносить звернення. Три роздрібні партнери праворуч унизу — Redrock через REST API і webhooks, Keystone через CSV по SFTP і Brightwave через EDI у сторонній мережі — надсилають маніфести в один інтеграційний шар, який проєктується в Частині 2; він робить upsert у Salesforce за ключем партнера і надсилає статус назад кожному партнеру. Праворуч: Salesforce надсилає події статусу в Snowflake, де зберігаються історія статусів і аналітика; FleetLink, де лишаються сирі дані GPS, надсилає в Salesforce лише останню позицію; Salesforce надсилає кількість доставок через інтеграцію у фінансову ERP, яка виставляє рахунки партнерам і платить бригадам; фото, 4–5 мільйонів на рік, ідуть із застосунку бригад у сховище фото поза ядром; а RouteDesk виведено з ужитку в архів його 8-річної історії. Salesforce надсилає повідомлення напередодні, з посиланням, через провайдера SMS і пошти. Внизу: та сама компанія, що й у розділі 4; повторного введення й таблиці більше немає; історія та фото живуть поза ядром. УГОРІ: ІДЕНТИЧНІСТЬ, APPEXCHANGE, ВЕБ ЛЮДИ ПРАВОРУЧ: ВНУТРІШНІ СИСТЕМИ УНИЗУ: КАНАЛИ КЛІЄНТІВ ПРАВОРУЧ УНИЗУ: ПАРТНЕРИ Й ПРОВАЙДЕРИ Координатори диспетчеризації 45, у 9 DC партнерів Бригади доставки ~700 на 330 вантажівках Підтримка й офіс 100: сервіс, операції, фінанси Користувачі партнерів ~300 у 3 партнерів Отримувачі ~1 млн на рік Корпоративний IdP SSO лише для офісу Портал роздрібних партнерів Сторінка відстеження ІНТЕГРАЦІЯ Snowflake історія статусів, аналітика FleetLink сирі дані GPS лишаються тут Фінансова ERP рахунки партнерам, оплата бригадам Сховище фото 4–5 млн на рік, поза ядром Архів RouteDesk виведено з ужитку; 8 років історії Телефон агенти підтримки Ел. пошта email-to-case Провайдер SMS і пошти повідомлення напередодні, з посиланням Redrock REST API, webhooks Keystone CSV через SFTP Brightwave EDI через сторонню мережу Salesforce Field Service, одна org у США посилання, без входу лише офіс дзвінки звернення маніфести на вхід статус на вихід маніфести на вхід статус на вихід маніфести на вхід статус на вихід upsert, ключ партнера події статусу лише остання позиція кількість доставок кількість доставок фото із застосунку бригад напередодні, з посиланням Salesforce спільнота люди ідентичність, застосунки, веб внутрішня система канал клієнтів інтеграційний шар починається в системі, що відкриває з’єднання; підпис каже, що передається спільний сертифікат: довіра, без прямого виклику Та сама компанія, що й у розділі 4. Повторного введення й таблиці більше немає; історія та фото живуть поза ядром. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Контрольна точка 1: що я б спроєктував. Ті самі місця, що й на ландшафті з розділу 4 (Ландшафт Steve Trucking), але без ручного перенесення і без таблиці.

Хто що бачить і кому потрібна ліцензія

Section titled “Хто що бачить і кому потрібна ліцензія ”
  • Роздрібні партнери бачать лише свої доставки (S2). Кожне робоче замовлення несе свого роздрібного партнера; користувачі порталу бачать доставки свого партнера, а менеджери DC — лише свого DC.
  • Користувачам партнерів потрібна ліцензія порталу, що підтримує правила спільного доступу й ролі: Customer Community Plus чи Partner Community. Місця на стадіоні з розділу 3: найдешевші місця не отримують спільного доступу, потрібного цьому дизайну. Обидві ліцензії потребують ролей для зовнішніх користувачів, і Salesforce попереджає, що більше ролей уповільнює org (Experience Cloud User Licenses (opens in a new tab)). Роль на кожного партнера і кожен DC — нормально; роль на кожен магазин — ні.

Варто знати для іспиту. Знайте, які зовнішні ліцензії мають стандартний спільний доступ: Customer Community Plus і Partner Community (з ролями для зовнішніх користувачів), а не Customer Community, яка використовує sharing sets (набори спільного доступу).

  • Отримувачам ліцензія не потрібна. Сторінка відстеження показує одну доставку через посилання з токеном, що має строк дії (S3), а не через вхід у систему.
  • Стежте за перекосом. Сотні тисяч робочих замовлень на рік, що вказують на три-чотири акаунти партнерів, — це перекіс даних акаунтів. Один варіант — дочірній акаунт для кожного DC під кожним партнером, що розподіляє дочірні записи на дев’ять і більше частин; архівування завершених доставок після вікна претензій тримає кількість активних дочірніх на батька низькою. Частина 2 за це береться.

Я не створював би персональний акаунт для кожного отримувача лише тому, що отримувач — окрема людина. Я не вішав би мільйон Contacts на три акаунти. Я не будував би користувацький об’єкт Delivery поруч із робочим замовленням Field Service. Я не уніфікував би отримувачів між партнерами. Я не клав би мільйони фото чи показань GPS у сховище core. І я не називав би уніфікованого отримувача golden record, якщо ми насправді не ухвалили рішення про керування.

Що лишається відкритим

Section titled “Що лишається відкритим ”

Частина 1 поставила скелет; Частина 2 його випробовує. Мірило LDV на третій рік (робочі замовлення, сервісні візити й рядки — усі на території великих обсягів за два-три роки), дизайн запитів для подань списків у межах партнера, три вхідні інтеграції й три потоки статусів, міграція з RouteDesk, транзакції в день доставки і дизайн безпеки за порталом. Steve Trucking теж зміниться. Збережіть цей дизайн; ви до нього повернетеся.

Що тут вирішує архітектор

Section titled “Що тут вирішує архітектор ”
  • Які стандартні об’єкти несуть ядро (тут — Field Service) і які користувацькі об’єкти справді виправдані (тут — один).
  • Ключ, що зіставляє рядок замовлення кожного партнера з доставкою, і чому він належить партнерові.
  • Що таке отримувач, виходячи зі стосунків, які Steve Trucking справді з ним має.
  • Чи уніфікувати ідентичності і де змішування надто дороге, щоб ризикувати.
  • Що лишається в org, що живе поза core і від яких ліцензій залежить дизайн.