Схема повторяющихся событий с MongoDB
Я читал некоторые статьи, описывающие методы хранения данных для повторяющихся событий, но я все еще пытаюсь обдумать лучшие практики, особенно в отношении MongoDB.
Моя главная задача состоит в том, чтобы дешево получить все события, которые происходят в течение определенного периода времени. Моя вторичная задача состоит в том, чтобы модифицировать и изменять отдельные события, не выводя из строя всю цепочку событий.
Глядя на тех, кто задавал подобные вопросы, я придумал возможность. Я не полностью продан на этом, и хотел бы некоторые указатели в правильном направлении.
Моя идея: в каждом документе мероприятия есть...
- повторяющееся строковое поле, которое близко соответствует стандарту iCal
- вложенный документ или поле массива "экземпляры", которое содержит изменения / редактирование для определенных экземпляров (например, изменение описания или времени начала или отмена одного вхождения).
- поле начала и конца вхождения для определения легко запрашиваемых границ правила повторения
Плюсы:
- возможность сохранять изменения и сохранять связь с другими событиями
- легко спросить, моя модель на стороне бизнеса должна была бы построить каждое событие, хотя
Минусы / Потенциальные проблемы:
- если редактирует событие, и пользователь решает пометить изменения как относящиеся ко "всем событиям" - как предотвратить изменение уже прошедших событий
1 ответ
Это кажется хорошим подходом для меня. Чтобы "сохранить события, которые уже прошли, от изменения", просто пометьте их логическим флагом, который говорит об этом. Вы легко сможете использовать этот флаг и дату начала / окончания при запросах и обновлении.
Кроме того, вы можете: - установить дату окончания исходного события - клонировать событие и установить новую дату начала и окончания нового события. - очистить поле вхождений в клонированном событии
Примерно так:
До:
{
'title' : "Gin O'Clock",
'recurrance' : 'DAILY',
'start_date' : '2012-01-01 17:00',
'end_date' : false,
'occurences' : [
{ 'date' : '2012-06-03 17:00', 'title' : "Jubilee Gin O'Clock" }
]
}
После:
{
'title' : "Gin O'Clock",
'recurrance' : 'DAILY',
'start_date' : '2012-01-01 17:00',
'end_date' : '2012-06-05 17:00,
'occurences' : [
{ 'date' : '2012-06-03 17:00', 'title' : "Jubilee Gin O'Clock" }
]
},
{
'title' : "Gin O'Clock an our earlier",
'recurrance' : 'DAILY',
'start_date' : '2012-06-06 16:00',
'end_date' : false,
'occurences' : [
]
}
Надеюсь, это поможет!