Лучший способ хранить инвентарь в базе данных: каждый экземпляр предмета получает свой список, или у каждого игрока есть поле «инвентарь»? - PullRequest
2 голосов
/ 13 марта 2012

Я делаю MMO для браузера, используя PHP и MySQL.Я колеблюсь между двумя способами реализации инвентаря игрока:

  1. , когда созданный / брошенный из монстра / найденный предмет создает новую строку в таблице Предметов , сохраняя его тип (экземпляр кинжала, зелья ...), его местоположение (на земле у плитки X: Y? в инвентаре игрока Z?) и, возможно, дополнительное поле или два.Список предметов должен выглядеть следующим образом:
    id=728 ; type=14 ; location="i426" ; special="e8"
    (где «i426» будет означать «в инвентаре игрока № 426», а «е8» будет означать, что предмет имеет чары № 8).
    Плюсы: Я могу хранить данные о каждом отдельном предмете - зачарование, долговечность, предыдущий владелец ... Кроме того, предметы легко размещаются в любом месте;помещение предметов, скажем, в аукционные дома, предоставляется бесплатно с этой системой - не говоря уже о сумасшедших возможностях, таких как предметы внутри предметов и т. д.день, это быстро создает огромный стол, и это кажется довольно расточительным.Я боюсь, что это может замедлить всю игру (я использую много AJAX вуду) в любое время, когда участвуют предметы.

  2. или: , когда игрок кладетпредмет в их инвентаре, поле инвентаря игрока в базе данных обновляется с добавлением типа нового предмета (целое число) в конце с разделителем.Типичное поле инвентаря будет выглядеть так: "|11|8|27|58|58"
    Плюсы: гораздо менее расточительно.Экземпляр элемента - это всего несколько цифр и разделитель.
    Минусы: нет дополнительных данных по элементам;каждый экземпляр одинаков.Кроме того, сброс элемента на плитку означает, что плитке нужно свое собственное поле инвентаря - и так далее для каждого возможного местоположения элемента.Кроме того, этот метод включает в себя манипулирование строками в любое время, когда элемент должен быть добавлен / удален, вместо простого удаления строки из таблицы.Другое дело, что в инвентаре игрока может храниться переменное количество предметов, поэтому эта строка не имеет предсказуемой длины.

В предыдущем проекте я использовал второй метод.Первый метод выглядит забавно, но я не уверен, что он будет соответствовать нашему пространству хранения и скорости нашего сервера.Какой из этих методов чаще всего используется в MMO?Это вообще еще один?Есть ли плюсы или минусы, которые я пропустил?(Извините, если этот вопрос немного субъективен!)

1 Ответ

3 голосов
/ 14 марта 2012

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

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

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

...