Еще одна вещица, про которую хочу рассказать. Это про то что я наконец пощупал на этом проекте монгу.
Надеюсь получится донести эту мысль, но мне она кажется крутой в плане того, как это можно встроить в свой вижен по архитектуре систем.
Представьте себе такой домен, в котором:
1️⃣ Логика и хранимые данные часто меняются – добавляются новые таблицы, в самих структурах могут добавляться новые поля.
2️⃣ К примеру это какие-то временные акции, конкурсы итп.
3️⃣ Хранить такие данные нужно ограниченное время (год-два максимум, но может и больше).
А еще данные по каждому пользователю слабосвязанные и вам не нужны селекты через несколько таблиц
В общем, если это делать на реляционных базах данных то это будет чуть неудобно (ну может даже пиздец как неудобно), ибо миграции, и вот это все. А вот на монге это оказывается можно довольно удобно замутить!
У нас это реализовано вот как:
🏓 Есть огромная таблица OperationalData. Она хранит в себе вот такой дженериковый тип данных:
public class OperationalData<T>
{
string ShardKey {get; set;}
T Payload {get; set;}
int LifeTime {get; set;}
}
public class PromotionStatus
{
string UserName {get; set;}
Promotion CurrentPromotionType {get; set;}
DateTime NextPromotion {get; set;}
}
public class Discount
{
Guid Id {get; set;}
DateTime AvailableFrom {get; set;}
DateTime AvailableTo {get; set;}
}
И вот в такой приятной хранилке ты можешь делать вот такие штуки:
var userPromotionStatus = db.Collection.Find(x => x.ShardKey == $"PromotionStatus_{UserId}").ToPromotionStatus();
var userDiscount = db.Collection.Find(x => x.ShardKey == $"Discount_{UserId}").ToDiscount();
➕ Если вам нужно добавить новые данные, то никаких проблем, просто добавляете и пишете новые данные! Находтся такой объект супер-быстро. По одному шард-кею вы можете хранить и не только одну запись.
➕ Если нужно добавить новое поле, то просто добавляете его в модель и маппинг. На этом все. Никаких тебе миграций и болей с переписыванием запросов.
➖ Но есть минус, что делать селекты таких данных между пользователями вот так невозможно.
Я это очень удобно заюзал. Правда мне вот это как раз стрельнуло в ногу чутка. 🍌