[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: MySQL без идентификатора строки
Страницы: 1, 2, 3
Quieteroks
Здравствуйте.

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

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

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

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

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

А вот как тогда обновлять?
Нужны как минимум 3-4 поля для опознания строки...
Подскажите, может какие то индексы составные прикрутить?
Или как можно искать номер строки, без номера строки?
Valick
Цитата
Имеется таблица Инвентаря (item) и поскольку инвентарь штука капризная, то таблица с автоинкриментом может быстро закончиться

глупости
Цитата
Или как можно искать номер строки, без номера строки?

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



_____________
Стимулятор ~yoomoney - 41001303250491
Quieteroks
Valick
Почему глупости? При частом удалении и добавлении новых срок, автоинкримент может пускай не за месяц, но закончится. На одного же игрока будет более 1 строки в инвентаре.
Valick
Quieteroks, кроме удаления и добавления, есть еще и обновление.
Еще предметы бывают персональные и обычные, сумки чаще всего персональные.
В общем подводных камней много тут


_____________
Стимулятор ~yoomoney - 41001303250491
Quieteroks
Valick
Обновление не влияет на количество срок в таблице.
Флаг персональности можно добавить отдельным полем, но вопрос не об этом.
Имеется строка, к которой либо обращение через entry либо через guid, itemid, slot, baglot.

Но вот с entry то в будущем может возникнуть проблема.
Она может закончиться, всего то 11 значное число...

Как можно обойти этот лимит иначе?
Задача то сейчас в инвентаре, а после это может быть уже совсем другой проект, в котором что то подобное может проявиться и понадобиться.
Placido
Если проблема только в этом, то сделайте поле BIGINT UNSIGNED. Там максимальное значение - 18 446 744 073 709 551 615. Этого, думаю, хватит при любых раскладах.
Quieteroks
Placido
BIGINT боюсь использовать, ведь php с ними себя весьма странно ведет.

Для работы с базой взял pdo, данные на инвентарь хранятся в массиве, одной из полей номер строки... php его преобразует во float, и может быть потеря точности.

Или я ошибаюсь?
Если не ошибаюсь, то так можно уничтожить чей-то чужой слот в сумке, и хорошо, если в сумке, а не в экипировке.
inpost
Почему это вдруг странно? Где странность проявляется?

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Quieteroks
inpost
Странности в плане невозможности обрабатывать те же данные, что поддерживает сам mysql, хотя это по сути самая популярная связка в использовании. Даже при условии весьма редкого использования таких типов в самой базе.
Valick
Quieteroks, не порите горячку, любая игра, даже самая простая - это айсберг, все что ниже ватерлинии - это "рога и копыта", какой бы простой не казалась она "сверху", "снизу" огромный функционал, да еще при всем при том движок игры должен быть готов к расширению функционала.
___
Таблицы без идентификатора строки практически не существуют, другое дело идентификатор не обязательно должен быть автоинкремент, примари кей может быть составным на два и более поля. Таблицы без автоикремента, чаще всего это таблицы связи при отношении сущностей многие ко многим.
Я вам еще в первом посте написал, на что нужно обратить внимание, и начинать "отделять мух от котлет".


_____________
Стимулятор ~yoomoney - 41001303250491
Quieteroks
Valick
Странный способ у Вас разделять информацию в постах. Я принял часть Вашего сообщения за подпись и не прочитал...

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

Вы считаете, что таблица инвентаря не нормализована или там лишняя сущность засела с полным отсутствием отношений? По моему еще сильнее нормализовать некуда. В ней так же имеется минимум два отношения к двум другим таблицам (пользователь и предметы). Остальные поля исключительно являются сущностью инвентаря. Разделять сумку и экипировку не считаю необходимыми, ибо в этом случае будут мигрировать строки из таблицы в таблицу, что не есть хорошо.

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

Это я понимаю, я же не прошу движок мне писать, мне нужно разобраться с инвентарем. А расширяемость я и так стараюсь делать...

Цитата
Таблицы без идентификатора строки практически не существуют

Когда то увлекался домашним сервером для WoW, в силу отсутствия интернета в домашних условиях... В общем вот: http://wiki.ytdb.ru/index.php/Character_inventory
Ключей я так же не заметил... Но и мой инвентарь несколько отличается, да и серверная часть совершенно разная.

Цитата
другое дело идентификатор не обязательно должен быть автоинкремент, примари кей может быть составным на два и более поля

А теперь читаем все мои вопросы:
1. Подскажите, может какие то индексы составные прикрутить?
2. Или как можно искать номер строки, без номера строки?
Вы предпочли заметить только второй вопрос. Почему?
Valick
Цитата
Вы предпочли заметить только второй вопрос. Почему?

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

не будут smile.gif
мигрировать будут значения, а не строки
с таблицой экипировки вообще меньше всего проблем, так как там количество строк практически постоянно, разве что кому голову отфаерболят и гермошлем надевать не на что будет, хотя даже при этом строку "головы" из таблицы удалять не обязательно.
С инвертарем чуть сложнее, если сумок будет много, и они разные по количеству слотов (на мой взгляд так симпатичнее, чем открывание дополнительных слотов как часто бывает в браузерных играх).
WoW сильная игра во всех отношениях, близарды плохого не придумают, поэтому не грех и подсмотреть как там у них smile.gif

_____________
Стимулятор ~yoomoney - 41001303250491
Quieteroks
Valick
Цитата
мигрировать будут значения, а не строки

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

В моем случае сумка одна, но заменяемая, ее можно поменять на другую, более вместительную или наоборот. Не хочу дополнительно еще и несколько сумок вводить smile.gif
Цитата
WoW сильная игра во всех отношениях, близарды плохого не придумают, поэтому не грех и подсмотреть как там у них

Ну как у близов на самом деле никто не знает, но сервер MaNGOS то работает без номера строки. Поэтому и вопрос то возник. Может реально не нужно делать номер строки, а достаточно как то обойти это. Но без номера получится условие с множеством условий, особенно для обновления. А с ключами я еще не совсем разобрался. Да и мне кажется, что если составной ключ будет постоянно обновляться (bagslot), то прироста к скорости не получится (на хабре что то такое читал про составные ключи).

Так все же, как, в случае отказа от номера строки с автоинкриментом, поступить с базой?
inpost
1. У тебя действительно так много вещей будет? Ты можешь не удалять вещь, а оставлять пустым запись, а при появлении новой вещи - записывать в это место.
2. Ты можешь использовать несколько таблиц в БД. То есть items1, items2, items3.
3. Ты можешь уникальность полей сделать по двум полям ID+USER_ID. Тогда перешкаливать не будет лимита, вряд ли даже миллион вещей у одного человека за всю жизнь накопится. А автоинкремент можно и свой пилить используя MAX число и делать +1.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Valick
Цитата
По сути строки. Причем в этом случае будет не просто обновление нахождения предмета в инвентаре, а уже два отдельных запроса (добавление/обновление и удаление в сумке).

ну блииииин...
UPDATE equp, bag SET equp.head=bag.slot22, bag.slot22=NULL WHERE ...



_____________
Стимулятор ~yoomoney - 41001303250491
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.