Понедельник, 11 Ноября 2024, 07:14

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
[PHP] Как облегчить запрос в MySql?
FreeZaДата: Суббота, 30 Августа 2014, 00:10 | Сообщение # 1
был не раз
Сейчас нет на сайте
Всем доброго времени суток, возникло пару вопросов и связанны они не только с обращением в базу, а в целом о написании браузерных игр.

Собственно вот в чем вопрос:
игровая механика для примера:
Игрок может купить себе Машину, у машины есть слоты для обвесов, двигатель, коробка передач, охлаждение, оружие и тд (примерно слотов 15) на машину.
В зависимости от типа машины и уровня количество слотов меняется, например на самой дешевой машине всего 3 слота, а на самой дорогой 15 слотов.

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

Собственно для того чтобы загрузить машину одного игрока и подсчитать все параметры авто нужно сделать 15 запросов за раз, это меня немного смущает, можно ли как-то это дело по другому сделать, или в целом с точки зрения кода норм?

2) второй вопрос, как быть с данными которые получаются после просчета машины,
их достаточно много, примерно 40 параметров которые складываются из 15 обвесов и самого авто
можно ли их както хранить временно? для манипуляции с ними в дальнейшем, а потом грубо говоря сохранить их при выходе из игры (смотрел в сторону сессий, но смущает безопасность и не удобность использования)

или все-же лучше сразу обращаться в базу перезаписывать значения и по новой пересчитывать все параметры?
в данном случае, пересчет все равно придется делать, а это опять 15 запросов=(
-----------------------------------
Предположим что игрок примерет обвесы на машину, чтоб посмотреть как изменятся показатели авто, за пару минут он может поменять обвес раз 120, грубо говоря если менят каждую секунду...это мягко говоря меня пугает.

Буду благодарен за ваши советы и предложения=)
lvovandДата: Суббота, 30 Августа 2014, 00:28 | Сообщение # 2
старожил
Сейчас нет на сайте
должно пугать не количество запросов, а качество. И одним запросом можно повесить базу и сотню запросов нормально пропускать за тысячные доли секунды.
Тут надо изначально максимально хорошо структуру базы и таблиц продумать.

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


Разработка и продвижение сайтов. Дизайн
FreeZaДата: Суббота, 30 Августа 2014, 00:41 | Сообщение # 3
был не раз
Сейчас нет на сайте
Цитата lvovand ()
Тут надо изначально максимально хорошо структуру базы и таблиц продумать

Я за основу взял таблицы из lineage2, достаточно грамотно все сделано, хотя даже там я нашел что можно было бы упростить =)

Цитата lvovand ()
ты же можешь за один запрос вытащить данные из базы

Можно подробнее? как одним запросом (php->mysql) вытащить данные разом из разных таблиц?
простенький пример чтоб я мог уже дальше загуглить

Цитата lvovand ()
а считать уже на клиентской стороне

Думаю не стоит, грозит подменой значений, по сути машина, это и есть игрок, у нее есть жизни, броня, скорость и тд...с точки зрения безопасности лучше просчитать на сервере, и отдать значения в интерфейс для дальнейшей работы с ними, ИМХО.

А вот про один запрос в 15 таблиц очень стало интересно =)
last2424Дата: Суббота, 30 Августа 2014, 00:51 | Сообщение # 4
30 мл. блоков
Сейчас нет на сайте
FreeZa, ну, давай подумаем облегчить базу можно максимум лишь до одной строчки, эта строчка должна быть вызовом функций.

Код
лялялячтототам(host, login, password, bd, codirovka, ...);


Всё вот так можно сделать вызов базы, теперь нужно создать функцию:

Код
function лялялячтототам($host, $login, $password, $db, $unicode){
вызываем мускуль;
}

Всё, вот твой вызов базы.

Добавлено (30.08.2014, 00:51)
---------------------------------------------
lvovand, ты не прав, сервер в первую очередь нужно напрягать, как сказано выше считывать с клиентской стороны это подмена значений.


Предупреждение: всё что я написал в зачёркнутом виде является шуткой и никак не пытает обидеть того к кому обращаются.(нет)
FreeZaДата: Суббота, 30 Августа 2014, 00:55 | Сообщение # 5
был не раз
Сейчас нет на сайте
Цитата last2424 ()
можно сделать вызов базы

Видимо ты не вник в вопрос, или я гдето не так сформулировал)
как подключиться к базе это то понятно (это как ни как азы работы с базой),
вопрос в том, как составить один запрос в 15 таблиц сразу, вот этого я не понял, и попросил пример такого запроса =)
lvovandДата: Суббота, 30 Августа 2014, 01:08 | Сообщение # 6
старожил
Сейчас нет на сайте
Цитата FreeZa ()
как одним запросом (php->mysql) вытащить данные разом из разных таблиц?

используя JOIN

Цитата FreeZa ()
а считать уже на клиентской стороне
Думаю не стоит, грозит подменой значений

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

Цитата FreeZa ()
А вот про один запрос в 15 таблиц очень стало интересно

джойнить можно и 15 таблиц, но при таком раскладе мозг не один раз сломается, обрабатывая все связи, тут проще либо какую-то дополнительную таблицу сделать, либо временные таблицы использовать


Разработка и продвижение сайтов. Дизайн
last2424Дата: Суббота, 30 Августа 2014, 01:14 | Сообщение # 7
30 мл. блоков
Сейчас нет на сайте
FreeZa, лол, там где надо написать имя базы, надо написать *, это азы ведь.

Предупреждение: всё что я написал в зачёркнутом виде является шуткой и никак не пытает обидеть того к кому обращаются.(нет)
FreeZaДата: Суббота, 30 Августа 2014, 02:26 | Сообщение # 8
был не раз
Сейчас нет на сайте
Эм...либо я чегото не понимаю, либо у вас с мускулем туговато...
Цитата last2424 ()
там где надо написать имя базы, надо написать *

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

специально для вас напишу пример, и вы мне составите под него запрос, я вот уже составил запрос и решил свою задачку, кстати спасибо товарищу lvovand!
Зеленым цветов выделю то инфу которую нужно достать, обратившись одним запросом к таблице users по его ID

есть 3 таблицы таблица:
1 таблица: (users)
user_id | name | lvl | engine_id | wheel_id |
---------------------------------------
1 | ivan | 1 | 350 | 1705 |
2 | коля | 2 | 170 | 1550 |
---------------------------------------

2 таблица: (engine)
engine_id | eng_name | fuel | speed |
---------------------------------------
350 | Двигатель 1 | 350 | 80 |
170 | Двигатель 2 | 450 | 90 |
---------------------------------------

2 таблица: (wheel)
wheel_id | wheel_name | radius | type |
---------------------------------------
1550 | супер колесо 1 | 15 | drift |
1705 | супер колесо 2 | 18 | race |
---------------------------------------

Добавлено (30.08.2014, 02:23)
---------------------------------------------
last2424, Ладно уверен ты не сможешь ответить на эту задачку, учитывая что ты путаешь понятия база и таблица и несешь всякий бред...

Вот решение, может кому пригодится)

SELECT *
FROM users
INNER JOIN engine ON users.engine_id = engine.engine_id
INNER JOIN wheel ON users.wheel_id = wheel.wheel_id
WHERE users.id=1

Добавлено (30.08.2014, 02:26)
---------------------------------------------
Соответственно, таких запросов внутри запроса может быть большое колличество, хоть 15 как в моем случае, скорость обработки такого запроса намного быстрее, чем 15 обращений в каждую таблицу, потестил на своей базе, результат такого запроса впечатлил)

Andy-goДата: Воскресенье, 31 Августа 2014, 17:16 | Сообщение # 9
участник
Сейчас нет на сайте
может memcached или ему подобные для временного хранения? Я с ними немного экспериментировал, но потом появилась node js и теперь я экспериментирую с ней :))
VinchensooДата: Понедельник, 01 Сентября 2014, 08:27 | Сообщение # 10
Злобный социопат с комплексом Бога
Сейчас нет на сайте
Цитата Andy-go ()
может memcached или ему подобные для временного хранения? Я с ними немного экспериментировал, но потом появилась node js и теперь я экспериментирую с ней :))

redis попробуй, очень понравится. Хотя в ноде можно и свой кеш нагородить, только вот зачем.


  • Страница 1 из 1
  • 1
Поиск:

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