Четверг, 18 Апреля 2024, 04:34

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » Скриптовые языки программирования » Реализация инветнаря (Проблема с проектированием базы данных)
Реализация инветнаря
QuieteroksДата: Понедельник, 29 Апреля 2013, 23:46 | Сообщение # 1
частый гость
Сейчас нет на сайте
Здравствуйте.

Имеется таблица Инвентаря (item) и поскольку инвентарь штука капризная, то таблица с автоинкриментом может быстро закончиться, т.е. превысить свой лимит по int полю. В связи с чем, хочу от него отказаться. И тогда будет новая проблема, в запросе будет по 3-4 ключевых поля, которые смогут как либо гарантировать нахождение конкретного предмета в базе.

Структура такая:
guid | itemid | slot | baglot | icount

guid - ID пользователя
itemid - ID премета
slot - место в инвентаре (0 - сумка, 1 - штаны и т.д.)
baglot - слот в сумке
icount - количество предметов

Для чего слот в сумке? Дабы позволить игрокам сортировать предметы и разбивать/собирать пачки. Соответственно имеется ограничение на количество предметов в одном слоте.

Выборка всей сумки достаточно простая, нужны только guid и slot = 0.

А вот как тогда обновлять?
Нужны как минимум 3-4 поля для опознания строки...
Подскажите, может какие то индексы составные прикрутить?
Какие есть варианты с такой реализацией структуры?

З.Ы. bigint не предлагать...


Если вам все равно где вы находитесь, значит вы еще не заблудились.
TiendilДата: Вторник, 30 Апреля 2013, 10:41 | Сообщение # 2
участник
Сейчас нет на сайте
Цитата
А вот как тогда обновлять?

Не совсем понял, что обновлять?

Цитата
З.Ы. bigint не предлагать...

Почему? Если в вопросе без объяснения встречается «не предлагайте это», значит в нём перечислены не все аспекты проблемы.


Участвовал в разработке Order of War (C++ UI & логика) и WoT (Python портал worldoftanks.ru почти всё :-) )

Текущий проект: the-tale.org - indie mmozpg
QuieteroksДата: Вторник, 30 Апреля 2013, 11:33 | Сообщение # 3
частый гость
Сейчас нет на сайте
Tiendil, обновлять строку. Ведь предмет могут перемещать по сумке, могут использовать его (все в слоте или только один из), могут одеть, что повлечет перенос из сумки в экипировку, хоть и в одной таблице.

Цитата (Tiendil)
Почему? Если в вопросе без объяснения встречается «не предлагайте это», значит в нём перечислены не все аспекты проблемы.

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


Если вам все равно где вы находитесь, значит вы еще не заблудились.
lvovandДата: Вторник, 30 Апреля 2013, 12:07 | Сообщение # 4
старожил
Сейчас нет на сайте
INT(20) сделать и хватит инкрементов на долгое-долгое время,
а потом userid и itemid разве не определяют строку?


Разработка и продвижение сайтов. Дизайн
QuieteroksДата: Вторник, 30 Апреля 2013, 13:33 | Сообщение # 5
частый гость
Сейчас нет на сайте
lvovand, в том то и дело, что не определяют. Не буду же я запрещать игрокам иметь одинаковые предметы в инвентаре.
На каждый слот сумки будет конкретное количество одинаковых предметов, при превышении, открывается еще один слот.

Я думал что guid (userid) и bagslot могут как то это гарантировать для сумки, а у экипировки этот показатель слота нужно будет отслеживать и удалять ячейку с слотом.
А для экипировки возможно будут гарантировать guid (userid) и slot, и контролировать, что бы не было одинаковых слотов в экипировке.

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


Если вам все равно где вы находитесь, значит вы еще не заблудились.
lvovandДата: Вторник, 30 Апреля 2013, 15:29 | Сообщение # 6
старожил
Сейчас нет на сайте
так и что если и одинаковые
вот юзер id 100 и id предмета 200

ставить limit 1,

и при поиске и при обновлении указать id 100 и id предмета 200 и limit 1
обновится одна строка и все, вторая у игрока останется незатронутой


Разработка и продвижение сайтов. Дизайн
TiendilДата: Вторник, 30 Апреля 2013, 15:52 | Сообщение # 7
участник
Сейчас нет на сайте
Цитата (Quieteroks)
Проблема в ограниченности количества строк (пускай даже через пару лет или больше)

Скорее пары десятков тысяч лет. Если даже 2^32 идентификаторов будет расходоваться за месяц, то на исчерпание бигинт понадобится 2^32 масяцев.


Участвовал в разработке Order of War (C++ UI & логика) и WoT (Python портал worldoftanks.ru почти всё :-) )

Текущий проект: the-tale.org - indie mmozpg
QuieteroksДата: Вторник, 30 Апреля 2013, 18:08 | Сообщение # 8
частый гость
Сейчас нет на сайте
lvovand,
Цитата (lvovand)
и при поиске и при обновлении указать id 100 и id предмета 200 и limit 1
обновится одна строка и все, вторая у игрока останется незатронутой

Это самое оригинальное предложение на данный момент. Интересно, что будет в данном случае, если первой строчкой будет предмет, где уже лимит предметов, а во второй именно то, что требовалось обновить? limit 1, 1? А как тогда определить какая она в списке из трех одинаковых предметов? Влиять на физическое расположения строки не вариант. Можно еще order by добавить по количеству предметов. Но тогда Пользователь не сможет сортировать и разбивать на пачки.

Tiendil,
Цитата (Tiendil)
Скорее пары десятков тысяч лет

А что если где то будет номер строки (как элемент массива) интоватся? Тогда же более 4миллиардной строке будет потеря правильного номера... Поскольку нет такого типа данных, как bigint в PHP.


Если вам все равно где вы находитесь, значит вы еще не заблудились.
lvovandДата: Вторник, 30 Апреля 2013, 18:37 | Сообщение # 9
старожил
Сейчас нет на сайте
Цитата (Quieteroks)
Интересно, что будет в данном случае, если первой строчкой будет предмет, где уже лимит предметов, а во второй именно то, что требовалось обновить

так тогда вторая строка от первой отличается и коллапса не будет, условиями просто определить что менять,
если у одного пользователя два или больше слотов с одинаковым кол-вом предметов, а изменить надо только одну строку, тогда и будет
update ... что_на_что_где_поменять ... limit 1

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


Разработка и продвижение сайтов. Дизайн
QuieteroksДата: Вторник, 30 Апреля 2013, 18:51 | Сообщение # 10
частый гость
Сейчас нет на сайте
lvovand, Хорошо, если надуманная, подскажите, как эту надуманную проблему решить в момент, когда она возникнет?
Я сейчас о том, как можно сбросить поле автоинкимента? Грубо говоря у меня израсходовано половина индексов, из них в базе осталось около миллиона реально существующих записей, причем номера в этом случае будут как расческа, как ее почистить и обновить?


Если вам все равно где вы находитесь, значит вы еще не заблудились.
TiendilДата: Вторник, 30 Апреля 2013, 18:56 | Сообщение # 11
участник
Сейчас нет на сайте
Цитата (Quieteroks)
Поскольку нет такого типа данных, как bigint в PHP.

Что, серьёзно нет? Уже ж 2013 год, 64-битной архитектуре уже незнамо сколько лет, как же они живут? Я думал даже самые слоупоки сделали.

В любом случае, про php в исходном посте ни слова нет, может и не на нём пишут.


Участвовал в разработке Order of War (C++ UI & логика) и WoT (Python портал worldoftanks.ru почти всё :-) )

Текущий проект: the-tale.org - indie mmozpg
lvovandДата: Вторник, 30 Апреля 2013, 19:18 | Сообщение # 12
старожил
Сейчас нет на сайте
так посчитай сколько чего нужно чтобы проблема возникла, это нужны десятки-сотни тысяч игроков, тысячи онлайна, чтобы постоянно что-то добавлялось. При тех количествах много других еще проблем может открыться.

Для чистки остановить игру, используемые записи перенести во временную таблицу, текущую таблицу переименовать/заархивировать/удалить/очистить, создать новую таблицу и внести в нее данные из временной, не копируя сами индексы, а оставив их тому же автоинкременту. Скриптом все это сделается довольно быстро и номера пойдут по порядку


Разработка и продвижение сайтов. Дизайн

Сообщение отредактировал lvovand - Вторник, 30 Апреля 2013, 19:19
QuieteroksДата: Вторник, 30 Апреля 2013, 19:32 | Сообщение # 13
частый гость
Сейчас нет на сайте
Tiendil,
Цитата (Tiendil)
Что, серьёзно нет? Уже ж 2013 год, 64-битной архитектуре уже незнамо сколько лет, как же они живут? Я думал даже самые слоупоки сделали.
В любом случае, про php в исходном посте ни слова нет, может и не на нём пишут.


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

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

Почему все сходятся к бигинту или переходят на оскорбления?
Что, неужели никто не знает варианта реализации именно той, что я спросил.
Может я вот какой нить шизофреник и у меня панический страх перед бигинтом и вообще к автоинкименту у меня глубокая неприязнь.
Не с просто же я именно это спрашиваю. Вот есть пример реализации без автоинкимента: http://wiki.ytdb.ru/index.php/Character_inventory
Но нет никаких подсказок как они так это реализуют и индексов не видно...

Добавлено (30.04.2013, 19:32)
---------------------------------------------
lvovand,

Цитата (lvovand)
так посчитай сколько чего нужно чтобы проблема возникла, это нужны десятки-сотни тысяч игроков, тысячи онлайна, чтобы постоянно что-то добавлялось. При тех количествах много других еще проблем может открыться.


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


Если вам все равно где вы находитесь, значит вы еще не заблудились.
lvovandДата: Вторник, 30 Апреля 2013, 19:33 | Сообщение # 14
старожил
Сейчас нет на сайте
индекс кстати виден
item - первичный ключ

от себя, я бы и персонажа сделал индексным полем

избавляйся от страхов надуманных, реально ни к чему

так а если без ключевого поля, то что не понятно? просто при обновлении данных придеся в условии писать не первичный ключ а сравнивать по многим или всем столбцам, чтобы обновлялась только одна запись в таблице, если есть одинаковые записи, то при запросе UPDATE ставить LIMIT 1, хочешь чтобы пользователь делал свою сортировку, ну значит еще поле сортировки добавить


Разработка и продвижение сайтов. Дизайн
QuieteroksДата: Вторник, 30 Апреля 2013, 19:48 | Сообщение # 15
частый гость
Сейчас нет на сайте
Цитата (lvovand)
индекс кстати виден
item - первичный ключ


Вот тут я вообще не понял смысла в этом индексе. Не думаю, что достаточно его для запросов.
Сервер то у них С++ и постоянно поддерживает соединение с клиентом.

lvovand,
Вот же меня муза посетила...
Цитата (Quieteroks)
Я думал что guid (userid) и bagslot могут как то это гарантировать для сумки, а у экипировки этот показатель слота нужно будет отслеживать и удалять ячейку с слотом.
А для экипировки возможно будут гарантировать guid (userid) и slot, и контролировать, что бы не было одинаковых слотов в экипировке.


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


Если вам все равно где вы находитесь, значит вы еще не заблудились.
lvovandДата: Вторник, 30 Апреля 2013, 19:56 | Сообщение # 16
старожил
Сейчас нет на сайте
мне про тот индекс тоже непонятно, и зачем он PRIMARY

сделай таблицу, сделай достаточное количество тестовых записей, и сделай тесты с разными индексами. Сделай EXPLAIN запросов, посмотри за какое время будут запросы выполняться, картина и прояснится


Разработка и продвижение сайтов. Дизайн
QuieteroksДата: Вторник, 30 Апреля 2013, 20:04 | Сообщение # 17
частый гость
Сейчас нет на сайте
lvovand, в общем мало кто по тематике знает...

Буду пробовать тогда тесты проводить. Про explain спасибо, еще про него ничего не читал и не пользовался.

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


Если вам все равно где вы находитесь, значит вы еще не заблудились.
Форум игроделов » Программирование » Скриптовые языки программирования » Реализация инветнаря (Проблема с проектированием базы данных)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг