Подтвердить что ты не робот

Как правильно обрабатывать денормализованную синхронизацию данных в Doctrine MongoDB ODM

Денормализация ссылочных данных представляется довольно распространенной практикой при использовании 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 для каждого документа, данные которого денормализуются. Я думаю о создании пользовательской аннотации, это хорошая идея?

4b9b3361