Проектирование базы данных инвентаризации - PullRequest
4 голосов
/ 12 сентября 2011

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

Итак, вот настройки:

Существует таблица с именем 'player' , и каждому игроку присваивается уникальный 'playerid' , который устанавливается в качестве основного индекса таблицы.

Каждый игрок может иметь до 24 предметов в своем инвентаре, и информация об этих предметах хранится в таблице под названием 'player_inventory' . Эта таблица имеет следующие поля:

playerid, slotid, uid, стек, использование, долговечность

'uid' - это идентификатор элемента, а 'stack' , 'использует' и 'durable' являются просто значения, которые нужны каждому предмету (например, один и тот же тип предмета в другом слоте может иметь меньшую «долговечность» ).

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

Так что я волнуюсь, когда в этой таблице есть запасы в 10000 игроков, в этой таблице может быть потенциально 240 000 записей без индекса, когда я иду на его запрос - что-то говорит мне, что это может быть очень медленно?

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

Ответы [ 3 ]

3 голосов
/ 12 сентября 2011

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

ALTER TABLE player_inventory ADD PRIMARY KEY (playerid, slotid);

Это означает, что комбинация значений в этих двух столбцах должна бытьуникальный.Но данный playerid может встречаться в нескольких строках, а данный slotid может встречаться в нескольких строках.

1 голос
/ 05 июля 2012

Это может быть хорошей идеей иметь 3 таблицы.

  1. tblPlayer (idPlayer INT PK NOT NULL AUTO_INCREMENT, имя пользователя, пароль и т. Д ...)
  2. tblItemInventory (idItemInventory INT PK NOT NULL AUTO_INCREMENT, idPlayer FK, idItem FK, ..)
  3. tblItem (idItem INT PK NOT NULL AUTO_INCREMENT, долговечность, использование,)

tblItem имеет до 24 (idItem = 24)

0 голосов
/ 12 сентября 2011

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

Еще один способ применения индекса - использовать комбинацию playerid и uid.Хотя, если у игрока может быть более одного стека одного и того же предмета (как в Diabo или в MMO), вы, вероятно, можете использовать комбинацию playerid и slotid в качестве индекса.Вы можете иметь составной ключ, состоящий из более чем одного ключа в MySQL.

...