Это только частичный ответ, но в отношении числа 2 (структура таблицы) разбейте его и примите во внимание, что все игровые активы являются картами.
Создайте таблицу с колонкой для игры,карта, ее стоимость (если применимо), текущий владелец (который будет значением, указывающим либо конкретного игрока, либо колоду, либо колоду сброса).Для управления сформированными коллекциями создайте две дополнительные таблицы: одну для групп или наборов карт и таблицу связывания, чтобы показать членство карт в игре для данной группы (это также может быть достигнуто с помощью строкового столбца в базовой таблице).и немного логики, но для чистого подхода rdbms разделите таблицы).
Редактировать:
Вопрос 1 - Опция базы данных
ЕстьЗдесь много вопросов о производительности MySQL и оптимизации.Самая большая характеристика, которую следует учитывать для вашей игры, - это частота операций чтения по сравнению с операциями записи.Стандартная конфигурация MySQL оптимизирует производительность чтения - что, вероятно, лучше всего основано на том, как вы описываете свою игру.
Вопрос 2 - Конфигурация таблицы
Чтобы расширить мои предыдущие комментарии, я предлагаю следующее (не стесняйтесь адаптировать имена таблиц - они только для пояснения):
- a
game_cards
таблица со столбцами (game_id
, card_id
, value
, owner
) - a
game_sets
стол с (set_id
, game_id
, owner
) - a
card_set_membership
стол с (set_id
, card_id
)
Таблица game_cards
должна быть изначально заполнена полной колодой (сколько бы карт у вас не было, это количество строк, которые вы добавляете в таблицу).Все карты должны быть обозначены card_id
, где каждая представляет уникальную карту в колоде , и для данной игры все должны иметь одинаковое значение для game_id
(поскольку они являются частью одного и того жеигра).
- Столбец
game_cards.value
будет представлять точки, присущие карте, если это применимо к вашей игре. - столбец
game_cards.owner
будет содержать значение, указывающее, гдекарта есть;примером из вашей игры могут быть «колода», «сброс», «p1», «p2», «p3», «p4»
Это позволяет вам хранить, какие карты у вас есть, какие онистоят, и где они находятся (кто или что владеет каждый).По умолчанию, если все карты начинаются с колоды , вы можете установить значение game_cards.owner = 'deck'
.Когда карта «вытягивается», то вы, скажем, игроком 3, можете обновить значение для вытянутой карты до game_cards.owner = 'p3'
.
Следующий фрагмент головоломки собирает карты в произвольные наборы .Чтобы справиться с этим в обычных rdbms, я использую одну таблицу для создания списка наборов (game_sets
), а другую - для привязки карт в игре к наборам (card_set_membership
).Когда пользователь начинает собирать карты в набор, создайте запись в таблице game_sets
с новым set_id
, game_id
из основного поля game_cards.game_id
и owner
для игрока (или другого объекта).Если возможно в вашей игре), который имеет набор.Если вы уже определили set , добавьте запись в таблицу card_set_membership
с set_id
и card_id
.Вам не нужно хранить game_id
здесь, потому что вы знаете это через таблицу game_sets
.
Примечание: Эта конфигурация позволяет одной карте быть частью нескольких наборов.Если вам это не нужно (т.е. карта может быть только частью одного набора), то вы можете добавить game_id
к таблице card_set_membership
и вообще не использовать game_sets
.
Надеюсьэто делает это немного более ясным!
Вопрос 3 - Обновления базы данных
Краткий ответ: вы должны стремиться минимизировать трафик между клиентом и сервером.Если вы используете ajax, то постарайтесь убедиться, что заголовок сообщения (упаковка) как можно меньше.Посмотрите на действия , которые ваши пользователи могут выполнять на стороне клиента, а затем подумайте, как это преобразуется в действия на стороне сервера.Разработайте набор сообщений, которые выполняют эти действия, и посмотрите на данные, которые им требуются (например, карта или карты, какой игрок сделал ход и т. Д.).Если вы беспокоитесь о мошенничестве, рассмотрите возможность встраивания ключа (а не просто «p1» или «p2» и т. Д.), Который не может быть легко подделан клиентом (возможно, связанный с его логином сеанса?).