Проектирование баз данных: хранение пользовательской статистики в играх (то есть собственных денег) и 32-битное целочисленное переполнение - PullRequest
0 голосов
/ 08 января 2010

Я создаю небольшую браузерную игру на основе базы данных для хобби и наткнулся на эту проблему: я храню деньги, принадлежащие пользователям, как 32-битное целочисленное поле (если быть точным: два поля. Одно хранит деньги в руках игроков, другое - деньги хранятся в банке). Все мы знаем, что максимальное значение, которое может быть сохранено в 32 битах, равно 2 ^ 32-1.

Я абсолютно уверен, что 95% игроков не смогут достичь верхнего предела, но с другой стороны (и после некоторых сегодняшних вычислений) хорошие игроки смогут накопить так много.

Имея это в виду, я пришел со следующими идеями:

  • хранит деньги в 64 битах, что удваивает пространство каждой записи.
  • хранить деньги в виде строки и конвертировать в / из long long во время выполнения.
  • Измените игровую механику, чтобы игроки не могли получить такое количество богатства.

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

Есть ли другие способы решения подобных проблем? Кого бы Вы выбрали?

Ответы [ 4 ]

2 голосов
/ 08 января 2010

Взяв пример из реального мира, почему бы не иметь разные типы монет, например, столбец для миллиона единиц валюты.

1 голос
/ 09 января 2010

Переход к более крупному типу данных, вероятно, является самым простым решением, и соображения относительно дискового пространства / памяти вряд ли будут значительными, если ваша игра не имеет больших масштабов. 5 000 пользователей играют в вашу игру? Переход с 32-разрядного на 64-разрядный режим потребляет дополнительно около 20 тыс. Этого недостаточно, чтобы потерять сон.

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

0 голосов
/ 08 января 2010

Почему бы не хранить деньги так, как они должны храниться, как тип данных Money? Это предполагает, конечно, что вы используете SQL Server. Тип данных money не будет иметь этого ограничения и не будет зависеть от проблем округления.

0 голосов
/ 08 января 2010

Пространство в памяти не должно быть проблемой в зависимости от количества игроков, которые у вас есть одновременно, но хранение в виде строки определенно потребует больше дискового пространства.

А если серьезно, 4 294 967 296 рупий / симолеонов / фарлонгов? Кто они? Сим Гейтс?

...