Лучший способ хранить инвентарь в базе данных: каждый экземпляр предмета получает свой список или у каждого игрока есть поле инвентаря?

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

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

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

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


person Orteil    schedule 13.03.2012    source источник
comment
Я предполагаю, что почти все системы используют что-то более похожее на тип 1, поскольку тип 2 - это антипаттерн по имени Jaywalking. Это происходит из-за боязни перекрестков.   -  person Marcus Adams    schedule 13.03.2012
comment
Ограничен ли инвентарь игрока? Говорят, доступно 10 слотов? Или это ограничено по весу или что-то в этом роде?   -  person Michael Fredrickson    schedule 13.03.2012
comment
@MarcusAdams, черт возьми! И я подумал, что нашел кое-что умное.   -  person Orteil    schedule 13.03.2012
comment
@MichaelFredrickson - ограничения есть, но они не установлены. Они могут меняться от навыков, сумок и т. Д.   -  person Orteil    schedule 13.03.2012
comment
На данном этапе разработки я бы не стал особо беспокоиться о пропускной способности хранилища. Остерегайтесь ранней оптимизации. Предполагая, что вы ожидаете большого объема транзакций за короткий период времени, вы, вероятно, будете выполнять большинство этих транзакций в кеше памяти, который будет сброшен в базу данных по мере необходимости, чтобы не блокировать запросы пользовательского интерфейса игрока.   -  person Jim H.    schedule 13.03.2012


Ответы (1)


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

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

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

person D Mac    schedule 14.03.2012
comment
Что ж, тогда решено, что я буду использовать! - person Orteil; 14.03.2012