Относится к базе данных NoSQL

Этот вопрос для всех экспертов по NoSQL и специально для специалистов по mongoDB. Я начал с разработки реляционной БД для проекта, но клиент хочет, чтобы мы использовали БД, которая может легко масштабироваться. Для достижения этой цели мы решили использовать mongoDB. В эти дни у меня возникают проблемы с отображением моей реляционной модели для NoSQL. У меня есть таблица пользователей, которая имеет отношение «многие ко многим» со многими другими таблицами, как показано ниже:

У меня есть несколько вариантов при конвертации для mongoDB:

Вариант 1 (с полными строками в пользователях):

users:{
  _id:<user_id>,
  battles:{[battle1, battle2, ...]},
  items:{[item1, item2, ...]},
  locations:{[location1, location2, ...]},
  units:{[unit1, unit2, ...]},
}

battles:{
  <battle_info>
}

locations:{
  <location_info>
}

units:{
  <units_info>
}

items:{
  <items_info>
}

Вариант 2 (только с внешними ключами у пользователей):

users:{
  _id:<user_id>,
  battles:{[battle1_id, battle2_id, ...]},
  items:{[item1_id, item2_id, ...]},
  locations:{[location1_id, location2_id, ...]},
  units:{[unit1_id, unit2_id, ...]},
}

battles:{
  <battle_info>
}

locations:{
  <location_info>
}

units:{
  <units_info>
}

items:{
  <items_info>
}

Вариант 3 (идентификаторы пользователей в других таблицах):

users:{
  _id:<user_id>,
}

battles:{
  <battle_info>,
  user:{[user1_id, user2_id, ...]}
}

locations:{
  <location_info>,
  user:{[user1_id, user2_id, ...]}
}

units:{
  <units_info>,
  user:{[user1_id, user2_id, ...]}
}

items:{
  <items_info>,
  user:{[user1_id, user2_id, ...]}
}

Вариант 1 имеет много дубликатов, так как мы добавляем полные строки других таблиц. Одна проблема, которую я вижу в этом, заключается в том, что, если определенный предмет или битва обновляются, нам нужно будет найти все их вхождения в таблице пользователей и обновить их. Но это дает нам преимущество, заключающееся в том, что мы всегда имеем полный объект пользователя, который можно передать клиентскому приложению во время входа в систему.

Вариант 2 является более реляционным, когда в таблице пользователей у нас есть только mongoIds других таблиц. Преимущество этой опции заключается в том, что обновление битвы или предмета не требует больших затрат, так как ссылки на строки не копируются. С другой стороны, когда пользователь входит в систему, нам нужно будет найти все упомянутые юниты, битвы, предметы и локации, чтобы ответить полным объектом пользователя.

Вариант 3 противоположен варианту 2, где mongoIds таблицы пользователей хранятся в других таблицах. Этот вариант мне не очень нравится.

Я был бы очень признателен за то, что кто-то может мне помочь или придумать лучшую модель.

Редактировать:

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

Ответы на вопрос(2)

Ваш ответ на вопрос