Как обрабатывать изменения в дублированных данных в NoSQL
Мы оцениваем NoSQL для предстоящего проекта. Я склонен думать о вещах в стиле РСУБД, и у меня возникают проблемы с концептуализацией отсутствия нормализации.
Я понимаю, что дублирование данных не считается неправильным в NoSQL. Что мне трудно понять, так это исправить изменения в данных, чтобы избежать аномалий.
Объяснение вопроса на примере:
Вы организовываете серию покерных турниров. У вас есть игроки, локации и турнирные события. Насколько я понимаю, турнирное событие может содержать местоположение и коллекцию игроков. Для этого не нужно иметь все данные игрока, но если вы хотите получить имена и домашние адреса всех, кто собирается на следующий турнир, эта информация должна быть в коллекции турнира.
Кто-то женился и переехал, сменив фамилию и адрес. Нужно ли приложению обновлять коллекцию игроков и коллекцию турниров? Или моя модель коллекций неверна? Как разработчики "отслеживают", где дублируется информация?
2 ответа
Модель, которую я использую в последнее время довольно часто, состоит в том, чтобы иметь неизменную "основную" коллекцию данных (в вашем случае, список игроков, список турниров с игроками в каждом турнире, смоделированный "реляционно", где турнир запись имеет список идентификаторов игроков) и денормализованный список (в вашем случае список турниров с полностью заполненными данными об игроках), который обновляется только при выполнении периодического процесса над "основными" данными.
Таким образом, приложению нужно только обновить основные данные, и процесс периодического обновления в конечном итоге восстановит денормализованный результат.
Единственное, что нужно сделать, - это иметь одну "систему записи" или мастер для каждого типа данных, который у вас есть. Не должно быть единого источника для всех данных, но у каждого должен быть один.
Другая мера, которую необходимо предпринять, - сделать данные версионными (сохранить исторические изменения), чтобы денормализованные данные могли быть неизменными - в вашем примере данные игрока для турнира, который происходил в прошлом, являются правильными для того времени. Если игрок перешел на новый адрес с тех пор, вы все равно можете получить его, перейдя в "систему записи" игрока, чтобы получить текущий адрес, но запись турнира отражает его / ее адрес в то время и т. Д.