Как правильно сделать иерархию данных по домам, помещениям, абонентам?

Рейтинг: 3Ответов: 1Опубликовано: 12.08.2025

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

Абоненты лежат в отдельной БД (перс. данные и прочее), дома в другой, а приборы в 3-ей.

Как это можно сделать, чтобы еще и через EF Core было адекватно управлять этим? Планируем модульный монолит + ddd по возможности.

Пока 1 из вариантов - некая таблица locations, которая будет лежать копией в каждой бд, где она нужна, там хранить такие колонки: id|house_id|non_res_group_id|res_group_id|non_res_id|res_id|room_id либо id|parent_type|parent_id

В каждой сущности, которая может быть привязана к узлу назначать только location_id из этой таблицы, т.е. абонент привязан к локации с id = 5, которая привязана к дому с id = 1

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

Есть ли варианты лучше?

Очень схематично выглядит так (но тут забыли добавить комнату в жил. помещение, которое в группе), на блоках внизу показано какая доп. информация может быть на каждом узле:

иерархия

Ответы

▲ 1

Ну таблица для дерева nodes может выглядеть так:

id type parent_id

Значения просто числа

Таблица типов node_types может выглядеть так:

id name group_id

В таблицу типов сваливаете всё в кучу (абоненты, счётчики, помощения, дома, улицы, города и т.д.), где делаете дополнительный индекс по name+group_id. Группа это для удобства выборки, например счётчики бывают разные: вода, электричество, газ - у них одна группа на всех.

Получится одно большое дерево.

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

Здесь главное - не мудрить и не дубировать данные. И вспомнить про 3 НФ при проектировании таблиц.