Связь между объектами (одиночная, многие ко многим) ELMA BPM

Создавая объекты в ELMA BPM — неизбежно придет момент когда нужно будет связать их между собой.

  • Как выбрать правильную связь?

Новичка этот вопрос поставит в тупик, а у опытного возникнут вопросы по неоднозначным вариантам предлагаемым ELMA BPM.

Я расскажу про нюансы и отличия связей, а также чего делать не стоит.

Типы связей

Существует 4 типа связей (на примере ELMA BPM):

  • 1-1 — один к одному (например в заказе указан один клиент)
  • 1-N — один ко многим (например у клиента много заказов, но у заказа один клиент )
  • N-N — многие ко многим (например пользователь и группа пользователей — у пользователя много групп и наоборот, в группах много пользователей)
  • N-N (инверсия) — многие ко многим инверсия (пользователь связан N-N c группой, эта же связь обратном направлении называется инверсией )
    • где примененять этот тип связи сложно понять сходу, читайте дальше и поймете — «что это и с чем это едят»

далее подробно рассмотрим каждый тип

Связь 1-1 один к одному

Вернемся к нашему примеру

  • Заказ (объект) относится к Клиенту (объект)- один к одному, в заказе нужно знать клиента
    • в одном заказе — один клиент

Настройка в ELMA:

  1. Создадим 2 сущности с наименованием — заказ и клиент
  2. Добавим свойство клиент в заказ

  • то что выделено желтым относится к обратной связи (со стороны клиента, это о том что у одного клиента много заказов), и почему разработчики написали сюда это — хотели облегчить понимание пользователям, но как по мне внесли неясность для новичков ELMA. Читайте дальше и поймете почему.

Как это выглядит в базе данных

Посмотрите на диаграмму которая получилась в базе данных.

  • Добавилось только одно поле в таблицу заказа

А вот и таблицы, в поле каждого заказа указан идентификатор клиента:

В справочнике ELMA выглядит так:

Связь 1-N — один ко многим

Помним:

  • у одного клиента — много заказов, нужен список заказов клиента

и тут нюанс — в заказе клиент уже указан:

  • зачем создавать и вручную заполнять список заказов..? пахнет костылем
  • решение — связь 1-N

Настройка в ELMA:

  1. Перейдем в клиента
  2. Добавим свойство заказы
  3. Укажем тип свойства «Множественная (1-N)» и укажем «ключевую колонку» Клиент из объекта Заказ

дальше интереснее

Посмотрим в базу данных

На диаграмме ничего не поменялось и вот почему:

  • база данных знала заранее и нарисовала связь 1-N
  • в направлении Заказ -> Клиент соответствие 1-1 , в обратном N-1 ( это пытались сказать разработчики ELMA в начале)

Таблицы выглядят по прежнему:

На этом чудеса не заканчиваются:

  1. Добавьте еще один заказ клиенту
  2. Теперь откройте карточку клиента

Что тут произошло:

  • ELMA не создавала новое поле в таблице а только создала список в объекте клиент который определяется по свойству клиент в поле объекта заказ

Нюансы работы со связями 1-1 и 1-N (также работает из кода)

  1. Если в заказе указать клиента — он отразится в списке заказов клиента (это известно)
  2. Если в список заказов клиента добавить заказ — в добавленном заказе изменится клиент (поэтому будьте уверены что нужна связь 1-N а не N-N, читайте о ней дальше)

Связь N-N — многие ко многим

Продолжим развивать нашу историю, условия:

  • добавим к заказу промокоды (скидки)
  • у заказов много промокодов, и наоборот промокод применяется в нескольких заказах

по условиям не подходят связи 1-1 и 1-N, попробуем что то новенькое

Настройка в ELMA:

  1. Создадим сущность промокод
  2. Добавим в заказ список промокодов и укажем тип свойства «Многие-ко-многим»

Посмотрим в базу данных

Изменения в базе данных :

  • Появилась развязочная таблица (M_Order_UsedPromocodes)
    • хранит каждое соответствие заказ -> промокод (1-1)
  • если присмотреться в базе данных всегда используется 1-N — так и есть, других связей в реляционных базах не бывает

Посмотрите как работает развязочная таблица:

В справочнике ELMA выглядит так:

Связь N-N (инверсия) — многие ко многим инверсия

Теперь в заказе применяются промокоды, а что если:

  • в объекте промокод должны отражаться заказы где применялся этот промокод
  • — нужен список заказов в промокоде

опять связь многие ко многим, но постоянно добавлять заказ в список заказов по промокоду (в объект промокод) — костыль,

снова нужно человеческое решение

Настройка в ELMA:

  1. Добавим в объект промокод свойство применен в заказах
  2. Укажем тип связи «Многие ко многим (инверсия)» и ключевую колонку примененные промокоды

Посмотрим в базу данных

Уже не стоит гадать :

  • в базе данных ничего не изменилось
  • теперь та же связь N-N из заказа — используется в обратном направлении

В таблицах ничего не поменялось:

В справочнике ELMA:

  • добавьте один и тот же промокод в 2 заказа
  • и в промокоде отобразится список заказов

Нюансы работы со связями N-N и N-N(инверсия) (также работает из кода)

  1. Если в заказе указать промокоды — заказы отразятся в промокодах (это уже известно, работает связь N-N)
  2. Если изменить список «применен в заказах» в промокоде (неважно, добавить или удалить) — список промокодов в заказе не изменится (неизвестно так задумано или это недоработка…)

Общие нюансы для связей

  1. В контексте процесса доступно только два варианта связей 1-1 и 1-N (особенность контекста процесса, потому что доступно редактирование контекста без перезагрузки ELMA, но это уже другая история)
  2. Будьте аккуратны с копированием свойств — списков:
    • 1-N — при копировании проверяйте ключевую колонку
      • если запустить «как есть» будет общая связь для разных свойств — что в последствии нарушит целостность базы данных (будут битые связи) и при перестроении базы данных — система не запустится — бомба замедленного действия (починить можно — как расскажу в следующий раз)
      • если открыть свойство на редактирование — ключевая колонка будет пустой и потребуется ее заполнить — тогда все будет хорошо
    • N-N — при копировании проверяйте название развязочной таблицы
      • если запустить «как есть» будет общая развязочная таблица для разных свойств — будут путаться списки и в последствии нарушится целостность базы данных и при перестроении базы данных ELMA не запустится — снова бомба замедленного действия
      • если открыть свойство на редактирование — система не даст сохранить развязочную таблицу с наименованием, которое уже есть в системе — тогда все будет хорошо
    • N-N (инверсия) — при копировании проверяйте ключевую колонку, как с 1-N — последствия те же
  3. Не приравнивайте в коде один список к другому
    • нельзя писать Клиент1.Заказы = Клиент2.Заказы, при сохранении будет ошибка — найдены общие связи коллекций
    • нужно писать Клиент1.Заказы.AddAll( Клиент2.Заказы)
  4. В объектах ELMA BPM разработчики решили даже в незаполненных объектах создавать пустые коллекции
    • не привыкайте к этому, так никто не делает и даже если свойство это список — проверяйте на null (пустоту)
  5. Для создания списков — старайтесь не использовать блоки, тем более если элемент списка — независимый объект.(иногда для создания списка новички создают блок с одним свойством (получается развязочная таблица) — знайте это костыль

Выводы:

  1. Чаще используются связи 1-1 и N-N
  2. 1-N и N-N (инверсия) -ипользуйте с умом

Бонус

Списки можно вывести таблицей — выведите на форму «Список связанных сущностей»

  • со связями 1-N и N-N(инверсия) можно указать ключевую колонку и получится удобная таблица:
  • со связью N-N придется заморочиться и придумать EQL вот из статья базы знаний

вопросы пишите в комментариях

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Связь между объектами (одиночная, многие ко многим) ELMA BPM: 1 комментарий

  • 08.08.2018 в 06:26
    Permalink

    Отличная статья, спасибо.

    Ответ

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

%d такие блоггеры, как:

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: