Побудуйте логічну модель
Також доступно 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)

Модуль 3 з 6 розділу Моделювання даних заради змісту, розділ 2 курсу Data Architect. Кожен модуль самостійний. Попередній: Намалюйте зв’язки · Наступний: Розмістіть дані там, де їм місце
Питання, на яке відповідає цей модуль: Як перетворити концептуальну модель на логічну модель даних?
Концептуальна модель сказала нам, що існує в Steve Trucking і як воно пов’язане: роздрібні партнери та їхні розподільчі центри, маніфести й доставки, отримувачі, маршрути й зупинки, бригади, вантажівки й призначення бригад. Цього достатньо для дуже продуктивної розмови з бізнесом. Але зрештою мені потрібно більше деталей. Що нам треба знати про доставку? Чим один розподільчий центр відрізняється від іншого? Як ідентифікувати отримувача? Що належить до призначення бригади, а не до бригади чи вантажівки? Ці запитання ведуть нас від концептуальної моделі до логічної моделі даних, і ми все ще не будуємо Salesforce.
Сидіти, чекати, моделювати
Section titled “Сидіти, чекати, моделювати ”Спершу повернімося до собак. У нас є прямокутники й лінії. Тепер два нові запитання: що ми знаємо про кожну річ і як відрізнити одну від іншої?
Що її описує? У собаки є кличка і дата народження. У власника — ім’я, номер телефону й адреса. У трюку — назва і складність. Кожен факт іде на той прямокутник, який він описує.
Потім об’єкт-з’єднувач. Наскільки добре Bella виконує «Сидіти» і коли вона цього навчилася: це описує Bella? Не зовсім; одні трюки вона виконує краще за інші. Це описує «Сидіти»? Ні; кожна собака виконує «Сидіти» по-своєму. Це описує Bella і «Сидіти» разом, тож належить до Трюку собаки: рівень навички і дата навчання. Ось навіщо існує з’єднувач: деякі факти належать лише парі.
Яка собака яка? Спершу спробуйте кличку. Собак на ім’я Max дуже багато, тож кличка не унікальна. Телефон власника? У Marcus дві собаки на одному номері, люди змінюють номери, і це чиїсь персональні дані, які копіювалися б у кожну систему, що колись посилається на собаку. Номер мікрочипа виглядає краще: він унікальний і не змінюється. Але нове цуценя може ще не мати чипа, а ключ не може бути порожнім. Тож мікрочип лишається як те, під чим собака також відома, а собака отримує власний ID собаки: номер, що виконує одну нудну роботу — відрізняє одну собаку від іншої.
Це ті самі запитання, які ми зараз поставимо Steve Trucking, а причини, з яких кличка, телефон і мікрочип не годяться, складаються в правило, якого я дотримуюся роками.
Концептуальна модель каже, що існує; логічна — що це означає як дані
Section titled “Концептуальна модель каже, що існує; логічна — що це означає як дані ”Візьміть Вантажівку. Що мені треба знати про вантажівку? Можливо, її бортовий номер, VIN, марку, модель, рік випуску, номерний знак, поточний пробіг і статус. Це атрибути Вантажівки.
Тепер візьміть Доставку. Можливо, номер замовлення роздрібного партнера, дату доставки, обіцяне вікно, фактичний час прибуття, статус і чи входить у неї встановлення або вивезення старого. Знову атрибути.
Концептуальна модель сказала нам, що Доставка існує. Логічна модель починає казати, що доставка означає як дані. Простий прямокутник на кшталт Вантажівки чи Доставки може позначати цілий набір полів.
Попри це, на більшості наших діаграм прямокутники лишаються простими — з трьох причин. Кількість полів зростає. Поля швидко застарівають. І кожне поле має деталі, які важко показати в об’єктній моделі: API-ім’я, мітку, тип даних і довжину. Ці деталі неодмінно зафіксують, просто не в першій моделі даних. Коли показ кількох ключових полів справді допомагає розповісти історію, я малюю детальну модель даних: сфокусований зріз лише з тими полями, що важливі для цього моменту.
Атрибути мають описувати сутність
Section titled “Атрибути мають описувати сутність ”Ось просте запитання, яке я ставлю, дивлячись на атрибут: що це описує? Марка вантажівки явно описує вантажівку. А імена членів бригади на доставці? Вони описують доставку? Чи бригаду, яка мала призначення, що покривало маршрут, до якого входила ця зупинка?
Саме тут модель даних починає викривати речі, що на екрані виглядають цілком розумно. Координатор каже: «Я хочу бачити імена бригади на доставці». Це обґрунтована вимога до користувацького досвіду. Але це не обов’язково вимога зберігати імена бригади на доставці. Це дві різні речі, і ми повернемося до цього з нормалізацією. Поки що звикайте питати, яку саме річ описує цей факт. Це запитання вбереже вас від багатьох проблем.
Далі треба поговорити про унікальні ID
Section titled “Далі треба поговорити про унікальні ID ”Атрибути описують речі. Але є ще одна задача: як мені знати, яка річ яка?
Двох отримувачів звуть John Smith. Це та сама людина? Можливо; а можливо, ні. Імені недостатньо. Адреса? Люди переїжджають. Номери телефонів змінюються. Адреси електронної пошти змінюються. Навіть назва роздрібного партнера може змінитися.
Це підводить нас до ключів: того, що дає змогу унікально ідентифікувати щось у моделі. Це сфера, де за роки в мене склалася досить тверда думка. Від ідентифікатора я хочу чотирьох речей:
Унікальний. Незмінний. Без змісту. Ніколи не персональні дані.
Унікальний. Ідентифікатор має ідентифікувати рівно одну річ. Якщо дві доставки можуть мати однакове значення, це ненадійний ідентифікатор доставки. Імена зазвичай не унікальні, адреси не обов’язково унікальні, а номерами телефонів діляться. Навіть значення, що здаються унікальними сьогодні, можуть такими не бути, коли даних стане достатньо. Тож питайте: чи можуть дві такі речі колись мати однакове значення? Якщо так, будьте дуже обережні з використанням його як унікального ID запису.
Незмінний. Цей пункт часто пропускають. Якщо ми ідентифікуємо роздрібного партнера за назвою, а партнер перейменовується, чи з’явився в нас новий партнер? Ні. Бізнес-сутність лишилася тією самою; змінився один з її атрибутів. Унікальний ID запису має переживати зміни речі, яку він ідентифікує, а це виключає імена, адреси електронної пошти, номери телефонів, адреси й імена користувачів, хоч би якими зручними вони здавалися, коли ми тільки будуємо систему.
Без змісту. Почувши це вперше, ви здивуєтеся. Навіщо мені ідентифікатор без змісту? Бо зміст змінюється. Уявіть, що хтось будує ID доставки, який кодує DC, роздрібного партнера, дату доставки і порядковий номер: PHX-KEY-20261002-0042. Виглядає кмітливо. А потім отримувач переносить доставку на п’ятницю. Ми змінюємо ідентифікатор? Якщо ні, він нам бреше. Якщо так, ми змінили унікальний ID доставки, бо змінився один з її атрибутів, і кожна система, що зберегла старий ID, щойно її загубила. Ідентифікатор намагався виконувати дві роботи: ідентифікувати доставку і описувати її. Я волію, щоб доставку описували атрибути, а ідентифікатор виконував одну нудну роботу: ідентифікував її. Нудні ідентифікатори — добрі ідентифікатори.
Ніколи не персональні дані. Цей пункт настільки важливий, що я тримаю його окремо. Не використовуйте персональні дані як ідентифікатор лише тому, що вони здаються унікальними. У Steve Trucking спокусливо впізнавати отримувача за номером телефону. Але ключ копіюється всюди, де системам треба пов’язати записи: інтеграції, експорти, журнали, файли статусів назад до роздрібних партнерів, сховище даних, тестові дані. Зробіть номер телефону ключем — і ви розповсюдили персональні дані отримувача по всій архітектурі.
Ключ також має бути в кожному записі: ніколи не null і не порожній. Якщо деякі люди не дадуть вам значення або не повинні його давати, це значення не може бути ключем. Тому системи видають власні внутрішні ідентифікатори, а персональні дані, якщо вони взагалі потрібні, стають захищеним атрибутом.
Тож моє правило: унікальний, незмінний, без змісту, ніколи не персональні дані.
Природні й сурогатні ключі
Section titled “Природні й сурогатні ключі ”У людей із баз даних є назви для частини цього. Природний ключ уже існує в бізнес-даних: VIN вантажівки — добрий приклад. Наш застосунок його не вигадав, і він уже має зміст. Сурогатний ключ створюють спеціально для ідентифікації запису; він нічого не описує, він лише ідентифікує.
У більшості архітектур я віддаю перевагу сурогатному ключу як внутрішньому ID запису, а важливі природні ідентифікатори тримаю як атрибути. Це не робить природні ідентифікатори поганими; часто вони надзвичайно важливі. Просто я не роблю їх автоматично унікальним ID запису. Запитайте, що станеться, якщо значення виправлять, переформатують, замінять, використають повторно, якщо його не буде або якщо воно надійде з кількох систем-джерел. Саме тут простецьке на вигляд рішення стає архітектурним.
Одна річ може мати кілька корисних ідентифікаторів
Section titled “Одна річ може мати кілька корисних ідентифікаторів ”Внутрішній ID запису — не обов’язково той ідентифікатор, яким користуються всі інші системи. Steve Trucking може внутрішньо ідентифікувати доставку згенерованим ID. Кожен роздрібний партнер знає ту саму доставку за власним номером замовлення: Keystone — у своєму CSV-маніфесті, Redrock — у своєму API, Brightwave — у своїх EDI-повідомленнях. А вісім років історії в RouteDesk, застарілому інструменті диспетчеризації, використовують власні ID доставок RouteDesk.
Ці ідентифікатори важливі. Нам треба їх зберігати й правильно зіставляти, бо оновлення статусу має повертатися кожному партнерові під його номером. Але не всі вони мають ставати унікальним ID доставки. На запитання «який у неї ID?» може бути більше однієї відповіді, і архітектор має знати, який ID авторитетний у якому контексті. Ми повернемося до цього з основними даними та інтеграцією.
Зв’язки залежать від унікальних ID
Section titled “Зв’язки залежать від унікальних ID ”Тепер поверніться до намальованих ліній. Маніфест містить доставки. Отримувач отримує доставки. Бригада має призначення. Ці зв’язки працюють лише тому, що ми можемо надійно ідентифікувати речі на обох кінцях.
Ось де це боляче кусає в Steve Trucking. Роздрібний партнер переглядає маніфест у день доставки: замовлення скасовано, позицію замінено, нова адреса. Якщо ми не можемо зіставити переглянутий рядок із доставкою, яка вже є, за номером замовлення партнера, ми створюємо другу доставку для того самого холодильника, і бригада може приїхати двічі. Прямокутники, атрибути, ключі й зв’язки — не окремі ідеї. Усе це частини однієї моделі.
Зараз ви, можливо, думаєте: «Salesforce дає кожному запису ID». Правильно, і ми до цього дійдемо. Якщо дані живуть у Salesforce, кожен запис отримує ID, згенерований Salesforce. Він загадковий і важко читається, тож зазвичай ми ще й показуємо поле з ID, яким можуть користуватися люди, як номер доставки D-000184227 — поле Auto Number. Люди часто думають, що цей номер і є ID запису, але це не так: ID Salesforce досі під ним. Зовнішня система чи база даних, Oracle чи SQL Server, теж має власні унікальні ID. Але архітектура зрештою може включати Salesforce, фінансову ERP, Snowflake, Data 360, системи партнерів і системи, яких ще не існує. Логічна модель описує бізнес-дані, не прив’язуючи кожне рішення до однієї технології. Як Salesforce фізично це реалізує — пізніший крок.
Що тут вирішує архітектор
Section titled “Що тут вирішує архітектор ”Перетворюючи концептуальну модель на логічну, я вирішую:
- Які атрибути справді описують кожну сутність.
- Як кожна сутність унікально ідентифікується і чи достатньо стабільний цей ідентифікатор, щоб бути її унікальним ID.
- Які бізнес-ідентифікатори (номери замовлень партнерів, застарілі ID) треба зберігати й зіставляти.
- Чи не використовується чутлива інформація як ключ.
- Чи пов’язують зв’язки сутності через надійні унікальні ID.
Тепер у нас є сутності, зв’язки, атрибути й унікальні ID: зачатки справжньої логічної моделі даних. Але проблема ще лишається. Дуже легко покласти цілком коректні дані не в те місце. Тут і з’являється нормалізація.
Додаткові матеріали
Section titled “Додаткові матеріали ”- Custom Field Types (opens in a new tab), Salesforce Help (англійською, перевірено 2026-10-09): Auto Number призначає кожному запису унікальний номер із форматом відображення, наприклад префіксом і провідними нулями; це не ID запису Salesforce. Див. також Auto-Number Fields Are Not Always Sequential (opens in a new tab) (англійською, перевірено 2026-10-09).
