Quieteroks
27.04.2013 - 20:56
Здравствуйте.
Мне вот интересно узнать Вашего мнения, как лучше все же сделать?
Пишу игрушку, небольшую, повышаю свой уровень знаний.
Имеется таблица Инвентаря (item) и поскольку инвентарь штука капризная, то таблица с автоинкриментом может быстро закончиться, т.е. превысить свой лимит по int полю. В связи с чем, хочу от него отказаться. И тогда будет новая проблема, в запросе будет по 3-4 ключевых поля, которые смогут как либо гарантировать нахождение конкретного предмета в базе.
Структура такая:
guid | itemid | slot | baglot | icount
guid - ID пользователя
itemid - ID премета
slot - место в инвентаре (0 - сумка, 1 - штаны и т.д.)
baglot - слот в сумке (от которого теоретически можно бы отказаться, но...)
icount - количество предметов
Для чего слот в сумке: дабы позволить игрокам сортировать предметы и разбивать/собирать пачки. Соответственно имеется ограничение на количество предметов в одном слоте.
Выборка всей сумки достаточно простая, нужны только guid и slot = 0.
А вот как тогда обновлять?
Нужны как минимум 3-4 поля для опознания строки...
Подскажите, может какие то индексы составные прикрутить?
Или как можно искать номер строки, без номера строки?
Valick
27.04.2013 - 22:02
Цитата |
Имеется таблица Инвентаря (item) и поскольку инвентарь штука капризная, то таблица с автоинкриментом может быстро закончиться |
глупости
Цитата |
Или как можно искать номер строки, без номера строки? |
никак
___
Вы немного мешаете мухов с котлетами.
Для начала вам нужно ознакомиться с правилами нормализации таблиц и разобраться с определеннием сущностей, а так же их отношениями.
_____________
Стимулятор ~yoomoney - 41001303250491
Quieteroks
28.04.2013 - 08:30
Valick
Почему глупости? При частом удалении и добавлении новых срок, автоинкримент может пускай не за месяц, но закончится. На одного же игрока будет более 1 строки в инвентаре.
Valick
28.04.2013 - 09:01
Quieteroks, кроме удаления и добавления, есть еще и обновление.
Еще предметы бывают персональные и обычные, сумки чаще всего персональные.
В общем подводных камней много тут
_____________
Стимулятор ~yoomoney - 41001303250491
Quieteroks
28.04.2013 - 09:18
Valick
Обновление не влияет на количество срок в таблице.
Флаг персональности можно добавить отдельным полем, но вопрос не об этом.
Имеется строка, к которой либо обращение через entry либо через guid, itemid, slot, baglot.
Но вот с entry то в будущем может возникнуть проблема.
Она может закончиться, всего то 11 значное число...
Как можно обойти этот лимит иначе?
Задача то сейчас в инвентаре, а после это может быть уже совсем другой проект, в котором что то подобное может проявиться и понадобиться.
Placido
28.04.2013 - 09:59
Если проблема только в этом, то сделайте поле BIGINT UNSIGNED. Там максимальное значение - 18 446 744 073 709 551 615. Этого, думаю, хватит при любых раскладах.
Quieteroks
28.04.2013 - 10:22
Placido
BIGINT боюсь использовать, ведь php с ними себя весьма странно ведет.
Для работы с базой взял pdo, данные на инвентарь хранятся в массиве, одной из полей номер строки... php его преобразует во float, и может быть потеря точности.
Или я ошибаюсь?
Если не ошибаюсь, то так можно уничтожить чей-то чужой слот в сумке, и хорошо, если в сумке, а не в экипировке.
inpost
28.04.2013 - 11:46
Почему это вдруг странно? Где странность проявляется?
_____________
Обучаю веб-программированию качественно и не дорого:
http://school-php.comФрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Quieteroks
28.04.2013 - 12:23
inpost
Странности в плане невозможности обрабатывать те же данные, что поддерживает сам mysql, хотя это по сути самая популярная связка в использовании. Даже при условии весьма редкого использования таких типов в самой базе.
Valick
28.04.2013 - 12:43
Quieteroks, не порите горячку, любая игра, даже самая простая - это айсберг, все что ниже ватерлинии - это "рога и копыта", какой бы простой не казалась она "сверху", "снизу" огромный функционал, да еще при всем при том движок игры должен быть готов к расширению функционала.
___
Таблицы без идентификатора строки практически не существуют, другое дело идентификатор не обязательно должен быть автоинкремент, примари кей может быть составным на два и более поля. Таблицы без автоикремента, чаще всего это таблицы связи при отношении сущностей многие ко многим.
Я вам еще в первом посте написал, на что нужно обратить внимание, и начинать "отделять мух от котлет".
_____________
Стимулятор ~yoomoney - 41001303250491
Quieteroks
28.04.2013 - 13:06
Valick
Странный способ у Вас разделять информацию в постах. Я принял часть Вашего сообщения за подпись и не прочитал...
Цитата |
Для начала вам нужно ознакомиться с правилами нормализации таблиц и разобраться с определеннием сущностей, а так же их отношениями |
Вы считаете, что таблица инвентаря не нормализована или там лишняя сущность засела с полным отсутствием отношений? По моему еще сильнее нормализовать некуда. В ней так же имеется минимум два отношения к двум другим таблицам (пользователь и предметы). Остальные поля исключительно являются сущностью инвентаря. Разделять сумку и экипировку не считаю необходимыми, ибо в этом случае будут мигрировать строки из таблицы в таблицу, что не есть хорошо.
Цитата |
любая игра, даже самая простая - это айсберг, все что ниже ватерлинии - это "рога и копыта", какой бы простой не казалась она "сверху", "снизу" огромный функционал, да еще при всем при том движок игры должен быть готов к расширению функционала |
Это я понимаю, я же не прошу движок мне писать, мне нужно разобраться с инвентарем. А расширяемость я и так стараюсь делать...
Цитата |
Таблицы без идентификатора строки практически не существуют |
Когда то увлекался домашним сервером для WoW, в силу отсутствия интернета в домашних условиях... В общем вот:
http://wiki.ytdb.ru/index.php/Character_inventoryКлючей я так же не заметил... Но и мой инвентарь несколько отличается, да и серверная часть совершенно разная.
Цитата |
другое дело идентификатор не обязательно должен быть автоинкремент, примари кей может быть составным на два и более поля |
А теперь читаем все мои вопросы:
1. Подскажите, может какие то индексы составные прикрутить?
2. Или как можно искать номер строки, без номера строки?
Вы предпочли заметить только второй вопрос. Почему?
Valick
28.04.2013 - 13:21
Цитата |
Вы предпочли заметить только второй вопрос. Почему? |
разобравшись со вторым вопросом, не факт что возникнет первый

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

мигрировать будут значения, а не строки
с таблицой экипировки вообще меньше всего проблем, так как там количество строк практически постоянно, разве что кому голову отфаерболят и гермошлем надевать не на что будет, хотя даже при этом строку "головы" из таблицы удалять не обязательно.
С инвертарем чуть сложнее, если сумок будет много, и они разные по количеству слотов (на мой взгляд так симпатичнее, чем открывание дополнительных слотов как часто бывает в браузерных играх).
WoW сильная игра во всех отношениях, близарды плохого не придумают, поэтому не грех и подсмотреть как там у них
_____________
Стимулятор ~yoomoney - 41001303250491
Quieteroks
28.04.2013 - 13:51
Valick
Цитата |
мигрировать будут значения, а не строки |
По сути строки. Причем в этом случае будет не просто обновление нахождения предмета в инвентаре, а уже два отдельных запроса (добавление/обновление и удаление в сумке).
Цитата |
С инвертарем чуть сложнее, если сумок будет много, и они разные по количеству слотов |
В моем случае сумка одна, но заменяемая, ее можно поменять на другую, более вместительную или наоборот. Не хочу дополнительно еще и несколько сумок вводить

Цитата |
WoW сильная игра во всех отношениях, близарды плохого не придумают, поэтому не грех и подсмотреть как там у них |
Ну как у близов на самом деле никто не знает, но сервер MaNGOS то работает без номера строки. Поэтому и вопрос то возник. Может реально не нужно делать номер строки, а достаточно как то обойти это. Но без номера получится условие с множеством условий, особенно для обновления. А с ключами я еще не совсем разобрался. Да и мне кажется, что если составной ключ будет постоянно обновляться (bagslot), то прироста к скорости не получится (на хабре что то такое читал про составные ключи).
Так все же, как, в случае отказа от номера строки с автоинкриментом, поступить с базой?
inpost
28.04.2013 - 14:52
1. У тебя действительно так много вещей будет? Ты можешь не удалять вещь, а оставлять пустым запись, а при появлении новой вещи - записывать в это место.
2. Ты можешь использовать несколько таблиц в БД. То есть items1, items2, items3.
3. Ты можешь уникальность полей сделать по двум полям ID+USER_ID. Тогда перешкаливать не будет лимита, вряд ли даже миллион вещей у одного человека за всю жизнь накопится. А автоинкремент можно и свой пилить используя MAX число и делать +1.
_____________
Обучаю веб-программированию качественно и не дорого:
http://school-php.comФрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Valick
28.04.2013 - 14:54
Цитата |
По сути строки. Причем в этом случае будет не просто обновление нахождения предмета в инвентаре, а уже два отдельных запроса (добавление/обновление и удаление в сумке). |
ну блииииин...
UPDATE equp, bag SET equp.head=bag.slot22, bag.slot22=NULL WHERE ...
_____________
Стимулятор ~yoomoney - 41001303250491
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.