Я пытаюсь найти лучший способ сохранить пользователя в хранилище данных Google (используя nodejs).У меня есть userId и объект userData:
userId: "some-random-string"
userData: {
info: {
name: "name",
email: "test@email.com"
},
profile: {
username: "user",
status: "using"
},
stats: {
stuffDone: 12,
stuffNotDone: 20
},
inventory: {
money: 100,
items: ["first", "second", "third"]
}
}
Я знаю, что могу хранить все это как одну сущность, но стоило бы разделить ее на группу сущностей, если я буду обновлять всевложенные объекты отдельно (информация, профиль, статистика, инвентарь).
Таким образом, у меня будет корневая сущность (которая, вероятно, не будет существовать):
datastore.key(["Users", userId])
, тогда я создам 4 детейсохранить userData:
datastore.key(["Users", userId, "UserData", "Info"); --> userData.info
datastore.key(["Users", userId, "UserData", "Profile"); --> userData.profile
datastore.key(["Users", userId, "UserData", "Stats"); --> userData.stats
datastore.key(["Users", userId, "UserData", "Inventory"); --> userData.inventory
Только пользователь будет обновлять данные, поэтому конфликт не должен быть проблемой.Как только пользователь создан, мне не нужно обновлять более одного ребенка за раз.
Итак, скажем, статистика обновляется каждую минуту, я могу просто обновить ее напрямую с помощью ключа:
datastore.key(["Users", userId, "UserData", "Stats");
Не лучше ли разделить его на части вместо перезаписи всего пользовательского объекта в одну сущность и переписать все индексы?
С группой сущностей я все еще могу запроситьвсе пользовательские данные одновременно с:
query = datastore.createQuery().hasAncestor(datastore.key(["Users", userId]));
Тогда мне просто нужно обработать их, чтобы вернуть обратно в объект userData выше.Мне нужно будет сделать это только один раз, когда пользователь войдет в систему, в остальное время мне нужно будет получить пользовательские данные, это будет только один ребенок, и я могу просто получить ребенка по ключу.
Если бы мне не нужно было использовать группу объектов, подобную этой, то я мог бы сделать то же самое, сохранив каждую часть пользователя в отдельных объектах, таких как:
datastore.key(["UsersInfo", userId); --> userData.info
datastore.key(["UsersProfile", userId); --> userData.profile
datastore.key(["UsersStats", userId); --> userData.stats
datastore.key(["UsersInventory", userId); --> userData.inventory
Тогда я мог бы обновить их по отдельности, но я думаю,было бы сложнее получить все данные, поскольку мне нужно было бы выполнить 4 запроса вместо запроса предка.
Будут ли необходимы эти группы объектов или несколько объектов, если я обновляю только userData.statsи userData.profile примерно раз в минуту, или я должен просто использовать одну сущность.Объекты статистики и профиля будут больше, чем пара свойств.