Денормализация ссылочных данных представляется довольно распространенной практикой при использовании MongoDB. Тем не менее, я не вижу встроенного способа справиться с Doctrine MongoDB ODM.
Скажем, у меня есть социальная сеть, где пользователи могут следовать друг за другом, вот два примера пользователей:
{
_id : id1,
name: "Malcolm Reynolds",
followed: []
}
{
_id : id2,
name: "Zoe Alleyne",
followed: [
{ _id: id1, name: "Malcolm Reynolds" }
]
}
Как вы можете видеть, я хочу, чтобы свойство name было денормализировано. Как я уже сказал, в Doctrine ODM нет встроенного способа сделать это. Поскольку последний вопрос по теме год назад, я постараюсь сделать это сам.
В то время как я нашел много статей в Интернете, объясняющих, в каком случае денормализация полезна и упоминает, как может быть болью, чтобы сохранить денормализованные данные согласованными, я не нашел объяснения, как реализовать процесс восстановления данных dernomalized.
В моем случае, в конечном итоге, согласованных данных достаточно, между обновлением имени пользователя и обновлением денормализованных данных может быть несколько часов. Я могу видеть 3 разных способа сделать это:
1 - Проверка целостности: Задайте задачу, которая регулярно обновляет денормализованные данные.
2 - Триггер обновления: Каждое обновление в поле имени обновляет все связанные денормализованные данные в одном потоке.
3 - Гибридное решение Для каждого пользователя, когда имя обновляется, запись добавляется в очередь с информацией об обновлении (обновление пользователя и вставка в очереди будут выполняться в одном флажке), и для выполнения задачи в фоновом режиме фактические обновления.
Первое решение, как представляется, проще всего реализовать, но, как я вижу, оно может быть очень ресурсоемким. Второе решение сделало бы запросы обновления смехотворно длинными, даже с высоким коэффициентом чтения/записи I, это может быть проблемой. Я думаю, что третье решение - это путь, я прав, чтобы так думать?
Также я хотел бы сделать это сухим способом, например. Я не хотел бы переписывать один и тот же код в обратном вызове preUpdate для каждого документа, данные которого денормализуются. Я думаю о создании пользовательской аннотации, это хорошая идея?