Это распространенная проблема, обычно связанная с обслуживанием различных иерархических настроек / конфигураций. Итак, я думаю, что решение этой проблемы можно считать «шаблоном».
В любом случае, с точки зрения внутренней архитектуры у вас есть 2 основных варианта:
- нормализованная структура
- денормализованная структура
«Нормазлед» - это тот, который реализован с помощью рекурсии. Определенный фрагмент данных всегда хранится в одном месте, все другие места имеют ссылки на него (например, на родительский элемент). Структура легко обновляется, но чтение из нее может быть проблемой.
«Денормализованный» означает, что каждый узел будет хранить весь набор настроек для своего уровня, и всякий раз, когда вы обновляете узел, требуется некоторое время, чтобы перейти вниз по иерархии и объединить все дочерние узлы. Но операция чтения происходит мгновенно.
И поэтому «денормализованная» версия кажется более широко используемой, потому что общий сценарий с настройками заключается в том, что вы обновляете их редко, а читаете их часто, поэтому вам нужна лучшая производительность чтения. Например, Модель безопасности Windows ACL использует «денормализованный» подход для быстрой проверки безопасности. Вы можете прочитать, как они разрешают конфликты между "унаследованными" и явными разрешениями (ACE), проверяя их в определенном порядке . Это может быть излишним для вашей конкретной системы, хотя вы можете просто указать, что определенное значение было переопределено, или, наоборот, сбросить на «по умолчанию» ...
Дальнейшие подробности зависят от потребностей вашей системы. Возможно, вам понадобится «гибридная» архитектура, в которой некоторые поля будут «нормализованы», а некоторые - нет. Но вы, кажется, на правильном пути.