Нотация описания неизменяемой модели данных

November 23, 2023

Эргономичная ER-модель

Общее описание

В основе моей нотации описания модели данных лежит классическая ER-модель и нотация вороньей лапки, с небольшими изменениями:

  1. В нотацию вороньей лапки добавлено понятие слабой сущности из классической нотации;
  2. В нотации вороньей лапки разделены владеющие (идентифицирующие в оригинальной терминологии) отношения (между стержневой и слабой сущностью) и невладеющие отношения (между стержневыми сущностями);
  3. Добавлено понятие контекста (а-ля DDD);
  4. Добавлено понятие импортированной стержневой сущности - это сущность из контекста А, на которую есть ссылка в сущности в контексте Б;
  5. Добавлено понятие логического агрегата (а-ля DDD) - это стержневая сущность и все её слабые сущности.

Таким образом, модель состоит из элементов:

  • Контексты. Обозначаются (большими) окрашенными прямоугольниками со скруглёнными углами;
  • Стержневые сущности (очень похожи на корни агрегатов в ДДД). Обозначаются (маленькими) окрашенными прямоугольниками со скруглёнными углами;
  • Слабые сущности (очень похожи на некорневые сущности и объекты-значения в ДДД). Обозначаются (маленькими) окрашенными прямоугольниками со скруглёнными углами и прерывистой границей;
  • Импортированные сущности. Обозначаются (маленькими) прямоугольниками, окрашенными в цвет отличный от цвета контекста, со скруглёнными углами и единственным атрибутом - ид;
  • Владеющие отношения. Могут существовать как между стержневой и слабой, так и между слабыми сущностями. Могут быть только 1-1 и 1-N. Обозначаются сплошной стрелкой от стержневой к слабой сущности;
  • Невладеющие отношения. Могут существовать между любыми типами сущностей. Могут быть любой кардинальности - 1-1, 1-N, N-M. Обозначаются прерывистой линией.

Пример

Для иллюстрации эргономичной ER-модели рассмотрим воображаемую блог-платформу. Ключевыми сущностями являются пользователи и посты. У пользователей есть фотография, у постов - авторы (множество) и комментарии.

Во имя иллюстрационных целей добавим ещё возможность авторам давать единственный ответ на комментарий.

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

Эргономичная ER-модель этой системы будет выглядеть так:

eerm example.drawio

Здесь фото и комментарии я сделал слабыми сущностями, потому что они не могут существовать без пользователя и поста соответственно. Также комментарий владеет другой слабой сущностью "Ответ".

С постами сложнее - они тоже не могут существовать без пользователя, но их жизнь не ограничена каким-то одним пользователем, а слабой сущностью может владеть только одна стержневая. Поэтому посты я также сделал стержневыми сущностями

Такая модель используется на этапе первичного анализа, но перед тем как перейти к реализации, её надо доработать для того, чтобы она хорошо легла на представление в виде деревьев неизменяемых структур данных, хранящихся в БД.

Неизменяемая ER-модель

Доработка ER-модели заключается в:

  1. Замене отношения N-M на связующую сущность, с отношениями 1-N с изначальными сущностями;
  2. Выявлении и обозначении отношения "1 к F(ew)". Это специализация отношения 1-N, в котором участвует небольшое количество небольших сущностей*;
  3. Превращении связующих сущностей в слабые, в случае если одно из отношений имеет кардинальность 1-F;
  4. Превращении владеющих отношений, которые остались с кардинальностью 1-N (а не стали 1-F) в невладеющие. И соответствующие слабые сущности превратить в стержневые. При этом атрибут-связь (список связей, если быть точным) надо перенести из бывшей владеющей сущности в бывшую слабую сущность (теперь в виде скаляра);
  5. Превращении владеющих отношений 1-1 в невладеющие, если слабая сущность имеет большой размер (длинный текст, файл и т.д.). В этом случае атрибут-ссылку можно как оставить в бывшей стержневой сущности, так и перенести в слабую. Как выбирать? По принципу стабильных зависимостей - зависимость должна быть от менее стабильной к более стабильной сущности. Стабильность сущности определяется методом гадания на кофейной гуще.

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

Пример

Давайте проделаем эти шаги с нашей демо-моделью.

Удаление отношений N-M

В модели у нас только одно отношение N-M - Пост-Пользователь. Его можно заменить на сущность Автор (со связями 1-N с постом и пользователем).

Поиск отношений 1-F

Теперь ищем отношения 1-F.

  1. Пост-Автор. Разумно предположить, что у поста будет не больше 20 авторов, так что обозначаем его как 1-F.
  2. Пользователь-Автор. А вот пользователь может написать неограниченное количество постов, поэтому оставляем отношение 1-N.
  3. Пост-комментарий. У поста может быть неограниченное количество комментариев - 1-N.
  4. Пользователь-ответ. Пользователь может ответить на неограниченное количество комментариев - 1-N.

Превращение сущностей-связей в слабые сущности

У нас есть только одна сущность-связь - Автор, и у неё есть отношение 1-F - Пост-Автор. Так что делаем её слабой сущностью поста.

Превращение владеющих отношений 1-N в невладеющие

У нас такое отношение одно - Пост-Комментарии. Удаляем из поста атрибут "комментарии", добавляем в комментарий атрибут "пост", превращаем пост в стержневую сущность, меняем отношение на невладеющее.

Превращение владеющих отношений 1-1 в невладеющие.

Комментарий владеет одним ответом и ответ - "лёгкая" сущность, поэтому тут можно оставить всё как есть.

А вот фото, которым владеет пользователь - "тяжёлая". Поэтому превращаем её в стержневую сущность.


После этого получаем модель, которая которую можно будет легко представить в виде неизменяемых структур данных, хранящихся в БД:

ieerm example.drawio

Заключение

В этом посте я представил нотацию, которую использую для моделирования данных и дополнительные ограничения на модель, которые делают её пригодной для реализации в виде неизменяемых структур данных, хранящихся в БД.