Нотация описания неизменяемой модели данных
November 23, 2023
Эргономичная ER-модель
Общее описание
В основе моей нотации описания модели данных лежит классическая ER-модель и нотация вороньей лапки, с небольшими изменениями:
- В нотацию вороньей лапки добавлено понятие слабой сущности из классической нотации;
- В нотации вороньей лапки разделены владеющие (идентифицирующие в оригинальной терминологии) отношения (между стержневой и слабой сущностью) и невладеющие отношения (между стержневыми сущностями);
- Добавлено понятие контекста (а-ля DDD);
- Добавлено понятие импортированной стержневой сущности - это сущность из контекста А, на которую есть ссылка в сущности в контексте Б;
- Добавлено понятие логического агрегата (а-ля DDD) - это стержневая сущность и все её слабые сущности.
Таким образом, модель состоит из элементов:
- Контексты. Обозначаются (большими) окрашенными прямоугольниками со скруглёнными углами;
- Стержневые сущности (очень похожи на корни агрегатов в ДДД). Обозначаются (маленькими) окрашенными прямоугольниками со скруглёнными углами;
- Слабые сущности (очень похожи на некорневые сущности и объекты-значения в ДДД). Обозначаются (маленькими) окрашенными прямоугольниками со скруглёнными углами и прерывистой границей;
- Импортированные сущности. Обозначаются (маленькими) прямоугольниками, окрашенными в цвет отличный от цвета контекста, со скруглёнными углами и единственным атрибутом - ид;
- Владеющие отношения. Могут существовать как между стержневой и слабой, так и между слабыми сущностями. Могут быть только 1-1 и 1-N. Обозначаются сплошной стрелкой от стержневой к слабой сущности;
- Невладеющие отношения. Могут существовать между любыми типами сущностей. Могут быть любой кардинальности - 1-1, 1-N, N-M. Обозначаются прерывистой линией.
Пример
Для иллюстрации эргономичной ER-модели рассмотрим воображаемую блог-платформу. Ключевыми сущностями являются пользователи и посты. У пользователей есть фотография, у постов - авторы (множество) и комментарии.
Во имя иллюстрационных целей добавим ещё возможность авторам давать единственный ответ на комментарий.
Наконец, предположим, что путём вдумчивого анализа, мы пришли к выводу, что в этой системе есть два контекста - пользователи и посты.
Эргономичная ER-модель этой системы будет выглядеть так:
Здесь фото и комментарии я сделал слабыми сущностями, потому что они не могут существовать без пользователя и поста соответственно. Также комментарий владеет другой слабой сущностью "Ответ".
С постами сложнее - они тоже не могут существовать без пользователя, но их жизнь не ограничена каким-то одним пользователем, а слабой сущностью может владеть только одна стержневая. Поэтому посты я также сделал стержневыми сущностями
Такая модель используется на этапе первичного анализа, но перед тем как перейти к реализации, её надо доработать для того, чтобы она хорошо легла на представление в виде деревьев неизменяемых структур данных, хранящихся в БД.
Неизменяемая ER-модель
Доработка ER-модели заключается в:
- Замене отношения N-M на связующую сущность, с отношениями 1-N с изначальными сущностями;
- Выявлении и обозначении отношения "1 к F(ew)". Это специализация отношения 1-N, в котором участвует небольшое количество небольших сущностей*;
- Превращении связующих сущностей в слабые, в случае если одно из отношений имеет кардинальность 1-F;
- Превращении владеющих отношений, которые остались с кардинальностью 1-N (а не стали 1-F) в невладеющие. И соответствующие слабые сущности превратить в стержневые. При этом атрибут-связь (список связей, если быть точным) надо перенести из бывшей владеющей сущности в бывшую слабую сущность (теперь в виде скаляра);
- Превращении владеющих отношений 1-1 в невладеющие, если слабая сущность имеет большой размер (длинный текст, файл и т.д.). В этом случае атрибут-ссылку можно как оставить в бывшей стержневой сущности, так и перенести в слабую. Как выбирать? По принципу стабильных зависимостей - зависимость должна быть от менее стабильной к более стабильной сущности. Стабильность сущности определяется методом гадания на кофейной гуще.
В результате превращения владеющих отношений в невладеющие в модели появляются новые стержневые сущности, которые также могут владеть слабыми сущностями. Такие сущности я называю физическими агрегатами.
Пример
Давайте проделаем эти шаги с нашей демо-моделью.
Удаление отношений N-M
В модели у нас только одно отношение N-M - Пост-Пользователь. Его можно заменить на сущность Автор (со связями 1-N с постом и пользователем).
Поиск отношений 1-F
Теперь ищем отношения 1-F.
- Пост-Автор. Разумно предположить, что у поста будет не больше 20 авторов, так что обозначаем его как 1-F.
- Пользователь-Автор. А вот пользователь может написать неограниченное количество постов, поэтому оставляем отношение 1-N.
- Пост-комментарий. У поста может быть неограниченное количество комментариев - 1-N.
- Пользователь-ответ. Пользователь может ответить на неограниченное количество комментариев - 1-N.
Превращение сущностей-связей в слабые сущности
У нас есть только одна сущность-связь - Автор, и у неё есть отношение 1-F - Пост-Автор. Так что делаем её слабой сущностью поста.
Превращение владеющих отношений 1-N в невладеющие
У нас такое отношение одно - Пост-Комментарии. Удаляем из поста атрибут "комментарии", добавляем в комментарий атрибут "пост", превращаем пост в стержневую сущность, меняем отношение на невладеющее.
Превращение владеющих отношений 1-1 в невладеющие.
Комментарий владеет одним ответом и ответ - "лёгкая" сущность, поэтому тут можно оставить всё как есть.
А вот фото, которым владеет пользователь - "тяжёлая". Поэтому превращаем её в стержневую сущность.
После этого получаем модель, которая которую можно будет легко представить в виде неизменяемых структур данных, хранящихся в БД:
Заключение
В этом посте я представил нотацию, которую использую для моделирования данных и дополнительные ограничения на модель, которые делают её пригодной для реализации в виде неизменяемых структур данных, хранящихся в БД.