2015-06-06 3 views
2

Я работаю над игрой, в которой игрок переключается между серверами на основе их местоположения в игровом мире, чтобы создать иллюзию единого сервера, сохраняя при этом масштабируемость. Когда игрок присоединяется к серверу, их данные загружаются из базы данных (MongoDB), а когда они покидают или меняют сервер, их данные сохраняются.Сохранение только измененных полей

Проблема возникает из-за того, что данные игроков изменяются с отдельного сервера от игрока, что должно происходить изредка. Данные в базе данных изменяются, но когда игрок покидает или меняет сервер, данные переписываются: Example Image

Для решения этой проблемы я думал хранить только измененные данные, так как обычно данные, которые вы хотите, совсем недавно изменили. Однако, пытаясь найти способы сделать это, я заметил отсутствие случаев, когда это было сделано. Есть ли веские причины не делать этого и использовать другой метод для того, чтобы измененные данные не были перезаписаны? Единственная проблема, о которой я мог думать, - это согласованность данных, когда поля обновляются, и только некоторые из них перезаписываются, что потенциально может привести к неверному состоянию игрока, чего можно было бы избежать довольно легко, обновив все зависимые поля вместе.

Если есть какие-либо другие причины, препятствующие сохранению только одного объекта или любых других способов решения этой проблемы, которые не представляют никаких серьезных проблем, я хотел бы услышать о них.

+1

Возможно, вам стоит подумать, что, хотя вы правильно объяснили свое дело, это все еще слишком широкий вопрос в целом. То, что вы просите действительно (и можете искать), является общей «грязной» концепцией. Это означает, что данные, которые фактически «изменены», являются «единственными» данными, которые вы хотите изменить. В концепции конечного хранилища MongoDB и другие двигатели имеют способы «только» модифицировать эти данные. Как только вы определили, что вы хотите изменить, конечно. –

+0

Просто для комментариев. На «милой» стороне. Если вы отправили «объект» в MongoDB, который фактически ничем не отличается от существующего объекта, то на самом деле ничего не будет сделано как операция записи. Но то, что вы, кажется, задаете именно здесь, - это способ увидеть, «какие данные» действительно изменились, а затем только передать их как операцию изменения. Как говорилось ранее, немного шире. –

+0

@ user3561036 Этот вопрос был скорее о возможных проблемах с только сохраняющимися частями объектов и альтернативами для этого, чем о реальной реализации. – user2248702

ответ

2

Это классический пример базового изменения состояния между БД и кодом.

Добавить целое число в профиль вашего игрока/документ данных; назовите его v. Предположим, что v = 6.

Когда игрок присоединяется, сервер загружает запись. Сервер знает, что это «локальный» вид данных v = 6. Когда игрок покидает, код будет вызывать

findAndModify({query: {"userID":"ID1","v":6}, update: {"$inc": { v: 1}, "$set": { fldtochange: newval, anotherfldtochange: newval2 } } }); 

Мы показываем буквальные 6 здесь для простоты, но это будет переменным заполняются во время загрузки сервера , Эта команда будет успешной ТОЛЬКО, если исходное значение v = 6 не повреждено. Если кто-то изменил его, обновление не произойдет. Вы можете использовать множество путей для восстановления, включая перечитывание данных и выполнение дельта состояния на локальном сервере. Если v = 6 все еще существует, оно атомарно увеличивается +1 (например, до 7), а остальные поля устанавливаются с новыми значениями.

+0

Немного позднего комментария, но иногда при обновлении объекта я использую обновление с помощью upsert. Если запрос содержит номер версии, который ничего не соответствует, создается документ. Можно ли использовать обновление с upsert без создания дополнительных документов? – user2248702

Смежные вопросы