Перейти к содержимому

Воплотите модель в Salesforce

Также доступно на 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 white card model rising from the plan it was drawn on, built from repeated standard window pieces with one curved wooden wall, the rest of the plan still bare.
Изображение создано с помощью ИИ

Модуль 6 из 6 главы Моделирование данных ради смысла, глава 2 курса Data Architect. Каждый модуль самостоятелен. Назад: Проектируйте до третьей нормальной формы, затем отступите · Далее: учебное пособие главы, затем следующая глава: Архитектура данных Salesforce

Вопрос, на который отвечает этот модуль: Как логическая модель данных становится физической моделью данных Salesforce?

Наконец-то мы поговорим о Salesforce. Если вы сдерживали желание превратить каждый прямоугольник в объект, теперь можно. Но обратите внимание, в каком порядке мы шли: мы поняли бизнес, описали данные, поместили каждый факт туда, где ему место, и решили, где намеренно от этого отступим. Только теперь я спрашиваю, как это должен реализовать Salesforce. Вот последовательность, которую я хочу, чтобы вы запомнили: концептуальная → логическая → физическая. Концептуальная модель описывает бизнес. Логическая модель описывает данные. Физическая модель описывает, как мы на самом деле будем это строить.

Физический шаг легче всего увидеть на чем-то маленьком, поэтому питомцы идут первыми.

Кто здесь компании и люди? Заводчик — это компания, поэтому он становится организацией (Account) с типом записи «Заводчик». Владелец — тоже организация или персональная учетная запись, с типом записи «Владелец». Два вида одного и того же стандартного объекта, рядом в верхней части диаграммы, ровно там, где они были с модуля 1.

У чего нет стандартного дома? Питомец, Порода, Трюк, Трюк питомца и Оценка трюка становятся пользовательскими объектами. А помните вид, который мы скопировали в питомца в модуле 5? Здесь у него появляется работа: он становится типом записи Питомца — «Собака» или «Кошка». Один объект с двумя типами записей, у каждого свой макет страницы и свои значения списков выбора, вместо объекта Собака и объекта Кошка.

Какие связи — master-detail? Я использую master-detail только там, где дочернюю запись никогда не переподчинят другому родителю. Трюк питомца принадлежит своему питомцу на всю жизнь, а каждая Оценка трюка принадлежит своему Трюку питомца, так что обе связи — master-detail. Это сразу окупается: именно master-detail позволяет питомцу держать поле сводки (roll-up summary) по своим Трюкам питомца, и счетчик «Освоенные трюки» из модуля 5 сам идет в ногу с данными. А вот дом питомцы меняют, поэтому Владелец — это lookup.

Какие — lookup? Salesforce не рекомендует больше 10 000 дочерних записей у одного родителя. Популярный трюк вроде «Сидеть», распространенная порода или крупный заводчик легко превысят это число, поэтому Трюк питомца ссылается на свой Трюк через lookup, и так же питомец ссылается на свою Породу и Заводчика. И избегайте полиморфных связей, где это возможно, — тех, где одно поле может указывать на объекты нескольких типов. В первый день они удобны, а потом усложняют жизнь всему, что должно их читать: отчетам, интеграциям, а теперь и агентам.

Что остается за пределами платформы? Если питомец носит GPS-ошейник, который сообщает, где он находится, это местоположение вообще не нужно копировать внутрь. Оно может быть внешним объектом, который читается в реальном времени из системы отслеживания ошейника.

Модель питомцев в Salesforce Модель питомцев как объекты Salesforce. Вверху две организации: одна с типом записи «Владелец», другая с типом записи «Заводчик». Pet__c под ними имеет типы записей «Собака» и «Кошка», номер микрочипа как внешний ID, lookup на владельца, заводчика и Breed__c, а также Tricks_Known__c как поле сводки. Pet_Trick__c связан с Pet__c связью master-detail и имеет lookup на Trick__c, с уровнем навыка и датой освоения. Trick_Assessment__c связан с Pet_Trick__c связью master-detail. У Breed__c есть вид, название и размер; у Trick__c название и сложность. lookup lookup lookup master detail lookup master detail Организация (Владелец) Id ID ЗАПИСИ Тип записи: Владелец Название Телефон Организация (Заводчик) Id ID ЗАПИСИ Тип записи: Заводчик Название Pet__c Id ID ЗАПИСИ Типы записей: Собака, Кошка Microchip_Number__c ВНЕШНИЙ ID Owner__c LOOKUP Breeder__c LOOKUP Breed__c LOOKUP Название Birth_Date__c Tricks_Known__c СВОДКА Breed__c Id ID ЗАПИСИ Species__c Название Size__c Pet_Trick__c Id ID ЗАПИСИ Pet__c MASTER-DETAIL Trick__c LOOKUP Skill_Level__c Date_Learned__c Trick__c Id ID ЗАПИСИ Название Difficulty__c Trick_Assessment__c Id ID ЗАПИСИ Pet_Trick__c MASTER-DETAIL Date__c Skill_Level__c Assessed_By__c ровно один ноль или один один или много ноль или много © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Каждое решение на этой диаграмме восходит к тому, что мы решили раньше, и в этом весь смысл. Теперь тот же шаг для Steve Trucking.

Наша логическая модель Steve Trucking теперь содержит розничного партнера, распределительный центр, манифест, доставку, позицию доставки, получателя, маршрут, остановку, бригаду, грузовик и назначение бригады. Это бизнес-понятия, и теперь я могу начать сопоставлять их с Salesforce.

Розничный партнер может быть организацией (Account). Доставка может лечь на то, что в Salesforce уже есть для запланированных работ в поле, а может стать пользовательским объектом. Для манифеста подходящего стандартного объекта нет, так что он, вероятно, станет пользовательским. А получатель — по-настоящему трудный вопрос: персональная учетная запись (Person Account), контакт или просто информация в доставке? Как следует мы ответим на него в следующей главе.

Важное слово по-прежнему — может. Не предполагайте реализацию только потому, что бизнес-понятие звучит как объект Salesforce. Именно поэтому мы сначала построили логическую модель: она дает нам то, с чем можно сверять проект в Salesforce.

Бизнес-сущность не означает автоматически пользовательский объект

Заголовок раздела «Бизнес-сущность не означает автоматически пользовательский объект »

Вот ловушка, которой я хочу, чтобы администраторы избегали: «Мы выявили одиннадцать сущностей, значит, нам нужно одиннадцать пользовательских объектов». Нет. Логическая сущность говорит нам, что бизнес-понятие важно. Она не диктует, как Salesforce должен его хранить. Понятие может стать стандартным объектом, пользовательским объектом, связью между объектами, полем или несколькими полями, значением, которым управляют в конфигурации, или данными, которые живут вообще вне Salesforce (фотографии доставок Steve Trucking — хороший кандидат для этого). Эти решения принимаются в физической модели, и именно поэтому мы не принимали их на первом звонке.

Тот же переход происходит с атрибутами. У нашего логического грузовика есть бортовой номер, VIN, марка, модель, год выпуска, госномер и статус. Теперь мы решаем, как они существуют физически: какому объекту принадлежат, какие типы полей используют, какие обязательны, какие должны быть уникальными, какие являются внешними идентификаторами, каким нужна проверка, какие вычисляются, а не хранятся, и какие конфиденциальны. На логическом уровне мы спрашивали, что означает грузовик. На физическом уровне мы спрашиваем, как Salesforce будет представлять грузовик. Это разные вопросы.

Грузовик: от логической сущности к объекту Salesforce Две карточки, строка за строкой. Логическая, Грузовик, что значит Грузовик: ID грузовика, бортовой номер, VIN, марка, модель, год выпуска, госномер, статус. Физическая, Truck__c, как Salesforce его представит: Id, ID записи Salesforce; Name, текст с бортовым номером; VIN__c, текст на 17 символов, уникальный и внешний ID; Make__c, список выбора; Model__c, текст на 40; Model_Year__c, четырехзначное число; License_Plate__c, текст на 10; Status__c, список выбора, обязательное. Примечание внизу: логическая модель спрашивает, что значит Грузовик; физическая спрашивает, как Salesforce его представит. Логическая: Грузовик что значит Грузовик ID грузовика Бортовой номер VIN Марка Модель Год выпуска Госномер Статус Физическая: Truck__c как Salesforce его представит Id: ID записи Salesforce Name: текст, бортовой номер VIN__c: текст(17), уникальный, внешний ID Make__c: список выбора Model__c: текст(40) Model_Year__c: число(4) License_Plate__c: текст(10) Status__c: список выбора, обязательное Логическая модель спрашивает, что значит Грузовик. Физическая спрашивает, как Salesforce его представит. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Все время, которое мы потратили на связи, окупается здесь. Мы уже знаем, является ли каждая связь «один к одному», «один ко многим» или «многие ко многим», обязательна она или нет и важна ли ее история. Теперь мы решаем, как Salesforce ее реализует: lookup, master-detail или связующий объект Salesforce, а может, и связующий объект со своими атрибутами, потому что, как мы выяснили, у самой связи может быть бизнес-смысл.

Вспомните назначение бригады. Мы могли бы начать эту главу словами: «Давайте создадим связующий объект Salesforce между бригадой и грузовиком». Посмотрите, что бы мы пропустили: зачем существует эта связь, нужны ли ей дата и маршрут, есть ли у нее статус и нужна ли ее история для претензии о повреждении через несколько недель. Эти бизнес-вопросы говорят нам, что такое назначение бригады. Только после этого стоит решать, как Salesforce его построит и нет ли в Salesforce уже чего-то, что делает эту работу.

Диаграмма снова меняется. Концептуальная модель показывала бизнес-понятия и простые линии. Логическая модель добавила атрибуты, ключи, кардинальность и сущности, прятавшиеся в связях. Теперь физическая модель начинает выглядеть как Salesforce: стандартные объекты, пользовательские объекты, поля, типы связей и то, что живет за пределами платформы.

Один и тот же бизнес на трех уровнях Три панели, один и тот же срез на трех уровнях. Концептуальная, что существует: розничный партнер, ритейлер, для которого мы доставляем, отправляет доставки, а каждая доставка, один заказ одному получателю, содержит позиции доставки, продукт в доставке. Логическая, как устроены данные: те же три с ID записей и несколькими полями; доставка также известна по номеру заказа партнера; позиция доставки несет ID продукта и количество. Физическая, как Salesforce это построит: розничный партнер — стандартная организация (Account) с типом записи «Розничный партнер»; доставка — пользовательский объект Delivery__c с номером заказа партнера как внешним ID и lookup на организацию; позиция доставки — пользовательский объект Delivery_Item__c в связи master-detail со своей доставкой, с количеством. Примечание внизу: бизнес, концептуальная, логическая, физическая; укажите на что угодно справа и проследите это назад влево. КОНЦЕПТУАЛЬНАЯ: ЧТО СУЩЕСТВУЕТ? ЛОГИЧЕСКАЯ: КАК УСТРОЕНЫ ДАННЫЕ? ФИЗИЧЕСКАЯ: КАК SALESFORCE ЭТО ПОСТРОИТ? отправляет содержит отправляет содержит lookup master detail Розничный партнер ритейлер, для которого мы доставляем Доставка один заказ одному получателю Позиция доставки продукт в доставке Розничный партнер ID розничного партнера ID ЗАПИСИ Название Статус Доставка ID доставки ID ЗАПИСИ Номер заказа партнера ТАКЖЕ ИЗВЕСТЕН КАК Дата доставки Статус Позиция доставки ID позиции доставки ID ЗАПИСИ ID продукта Количество Организация (стандартный) Id ID ЗАПИСИ Тип записи: Розничный партнер Название Delivery__c Id ID ЗАПИСИ Partner_Order_Number__c ВНЕШНИЙ ID Retail_Partner__c LOOKUP Delivery_Item__c Id ID ЗАПИСИ Delivery__c MASTER-DETAIL Quantity__c Бизнес → концептуальная → логическая → физическая: укажите на что угодно справа и проследите это назад влево. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Я хочу, чтобы вы могли положить эти три диаграммы рядом и увидеть последовательность: не три несвязанные диаграммы, а один и тот же бизнес на трех уровнях.

Пару слов о том, как я их рисую, потому что расположение — часть сообщения. Главный объект я ставлю в середину, чуть ниже центра. Если у него есть родительские объекты, я ставлю их чуть выше, чтобы модель читалась сверху вниз и слева направо — так, как о ней думает бизнес. Справочные данные уходят в сторону. Цвет тоже что-то значит: Salesforce у меня всегда синий, а для собственных систем компании я выбираю цвет, обычно зеленый, потому что зеленый — приятный, дружелюбный цвет. Красный я не использую, а желтые немного резковаты. Когда модель разложена вот так, она для меня поет. Многие диаграммы, которые вам попадутся, — это на самом деле управление пространством: как припарковать все свои машины в тесном гараже? Я предпочитаю нарисовать логичную картину, которую ум может охватить.

Физическая модель должна уважать платформу

Заголовок раздела «Физическая модель должна уважать платформу »

Salesforce — не универсальная реляционная база данных. У него есть свое мнение о связях, владении, безопасности и отчетности. У него есть лимиты, поведение запросов и автоматизация, а также архитектура, которая влияет на то, как модель ведет себя в масштабе. Поэтому логическая модель, которая идеально выглядит на доске, может потребовать изменений, когда становится физической. Это не Salesforce мешает. Это значит, что у платформы есть форма, и хорошие архитекторы эту форму понимают. Именно об этом следующая глава.

Иногда физическая модель также будет намеренно отличаться от чистой логической из-за решений о денормализации, которые мы приняли в модуле 5. Это нормально, если мы можем объяснить почему.

Есть привычка, от которой я хочу, чтобы вы избавились, если она у вас есть: начинать архитектуру данных с Setup → Object Manager → New Custom Object и разбираться с моделью по ходу дела. Salesforce невероятно упрощает создание вещей; это одна из его сильных сторон и одна из причин, по которым слабые модели данных появляются так быстро. Несколько кликов — и у вас есть объект, еще несколько — поля и связь. Потом приходят данные, строятся flows, создаются отчеты, от этого начинают зависеть интеграции, и объект, который вы создали за пять минут, становится очень дорого менять. Это тест на обратимость из главы 1. Поэтому прежде чем нажать New Custom Object, нарисуйте модель.

Есть и еще одна причина, по которой я держу три модели раздельно: технологии меняются. Сегодня часть данных Steve Trucking живет в ядре Salesforce. Завтра часть из них может жить в Data 360, хранилище данных или системе, которую мы еще не выбрали, а ИИ-ассистенту нужно собственное представление. Физическая архитектура может меняться, а бизнес-понятия остаются удивительно стабильными: розничные партнеры, доставки и получатели по-прежнему существуют. Именно это делает логическую модель ценной. Это долговечное описание бизнеса, не привязанное к сегодняшней реализации.

Превращая логическую модель в физическую модель Salesforce, я решаю:

  • Какие бизнес-сущности ложатся на стандартные возможности Salesforce, а каким нужны пользовательские объекты или другое представление.
  • Как логические атрибуты становятся физическими полями и как связи реализуются на платформе.
  • Где в физическом проекте место намеренной денормализации.
  • Каким данным место в Salesforce, а каким — где-то еще.
  • Какие особенности платформы требуют, чтобы физическая модель отличалась от логической.

Самое главное — я хочу иметь возможность проследить каждое решение в обратную сторону. Если вы укажете на что-то в моей физической модели и спросите: «Почему это здесь?» — я должен суметь провести вас назад через логическую и концептуальную модели к чему-то, что действительно нужно бизнесу: бизнес → концептуальная → логическая → физическая.

За пределами экзамена: что меняет ИИ. Сегодня ИИ может одним прыжком пройти от документа с требованиями до объектов и полей Salesforce. Это делает последовательность не менее, а более важной: если он перескакивает от требований сразу к конфигурации, попросите его показать, что произошло между ними: что он счел сущностью, какие ключи выбрал, какие связи предположил и где денормализовал. Это архитектурные решения, и архитектору по-прежнему нужно их видеть.

Мы начали эту главу на первом звонке, прислушиваясь к существительным, а заканчиваем ее физической моделью, которую можно проследить до бизнеса. Теперь, когда мы решили строить на Salesforce, следующий вопрос идет глубже: на какой платформе данных мы на самом деле строим?

  • Designing Record Access for Enterprise Scale: Parent-Child Data Skew (opens in a new tab), Salesforce Developers, Winter ‘27 (на английском, проверено 2026-10-02): «настраивайте связи родитель–потомок так, чтобы у одной родительской записи было не больше 10 000 дочерних». Это рекомендация, связанная с data skew (перекосом данных), а не жесткий лимит; глава 7 разбирает это подробнее.
  • Roll-Up Summary Field (opens in a new tab), Salesforce Help (на английском, проверено 2026-10-12): поле сводки (roll-up summary) считает или суммирует подчиненные записи через связь master-detail.