Этот вопрос предназначен для всех экспертов по 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 более реляционен, когда в таблице пользователей есть только монеты других таблиц.Преимущество этой опции заключается в том, что обновление битвы или предмета не требует больших затрат, так как ссылки на строки не копируются.С другой стороны, когда пользователь входит в систему, нам нужно будет найти все ссылочные юниты, битвы, предметы и локации, чтобы ответить полным объектом пользователя.
Вариант 3 противоположен варианту 2, где mongoIds таблицы пользователейхранятся в других таблицах.Этот вариант мне не очень нравится.
Я был бы очень признателен, если бы кто-то смог мне помочь или придумал лучшую модель.
Редактировать:
По сути этоигра mmorpg, где несколько клиентских приложений будут подключаться к серверу через веб-сервисы.У нас есть локальная база данных на клиенте для хранения данных.Мне нужна модель, через которую сервер может ответить полным пользовательским объектом, а затем обновить или вставить данные, измененные в клиентских приложениях.