Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 2 из 2 ПерваяПервая 1 2
Показано с 11 по 18 из 18
  1. #11
    Аватар для Pa4enka
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.04.2016
    Адрес
    Украина
    Сообщений
    157
    Репутация:
    35 ±
    Цитата Сообщение от execution Посмотреть сообщение
    DeimoS, пользуясь случаем, хотел уточнить. Если использовать 1 вариант (создание строки под каждый итем), следовательно при регистрации создавать столько строк, столько количество может быть итемов. Но это ж может быть до 30 INSERT запросов, не затратно ли? Или же есть более продуктивный способ?
    Зачем?

    > Запрос в таблицу.
    > Если данные не найдены(insert не юзался) - рисуешь пустые ячейки.
    > Если БД вернула больше 1 строки - заполняешь ячейку нужным айтемом.

    В общем, если данные в базе отсутствуют, то "по дефолту" ячейка инвентаря будет пустой.
    Последний раз редактировалось Pa4enka; 27.11.2019 в 18:43.

  2. #12
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Цитата Сообщение от Pa4enka Посмотреть сообщение
    Зачем?

    > Запрос в таблицу.
    > Если данные не найдены(insert не юзался) - рисуешь пустые ячейки.
    > Если БД вернула больше 1 строки - заполняешь ячейку нужным айтемом.
    Ну тогда в твоём случае, следует очищать при коннекте массив с данными инвентаря и, задавать например, значение, характеризующее, что данный слот не был загружен. И при добавлении данного итема, делать проверку на то, загружался ли данный итем или нет, и уже исходя из этого обновлять или же создавать строку.

  3. #13
    Аватар для Pa4enka
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.04.2016
    Адрес
    Украина
    Сообщений
    157
    Репутация:
    35 ±
    Цитата Сообщение от execution Посмотреть сообщение
    Ну тогда в твоём случае, следует очищать при коннекте массив с данными инвентаря и, задавать например, значение, характеризующее, что данный слот не был загружен.
    Цитата Сообщение от Pa4enka Посмотреть сообщение
    В общем, если данные в базе отсутствуют, то "по дефолту" ячейка инвентаря будет пустой.
    База в данном случае хранит существующие(!) айтемы игроков. Всё остальное - пустые ячейки. Спрашивается, зачем они нужны в базе?

    Цитата Сообщение от execution Посмотреть сообщение
    И при добавлении данного итема, делать проверку на то, загружался ли данный итем или нет, и уже исходя из этого обновлять или же создавать строку.
    Ну так заполни все слоты, которых нет в базе, при регистрации нулями, к примеру, либо -1. Смотря как у тебя обозначаются пустые слоты. И не нужно будет ничего проверять, ибо у тебя всегда будет актуальная информация и на сервере и в базе.
    Последний раз редактировалось Pa4enka; 27.11.2019 в 19:08.

  4. #14
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Цитата Сообщение от Pa4enka Посмотреть сообщение
    База в данном случае хранит существующие(!) айтемы игроков. Всё остальное - пустые ячейки. Спрашивается, зачем они нужны в базе?
    Это был как пример.

    - - - Добавлено - - -

    Цитата Сообщение от Pa4enka Посмотреть сообщение
    Ну так заполни все слоты, которых нет в базе, при регистрации нулями, к примеру, либо -1. Смотря как у тебя обозначаются пустые слоты. И не нужно будет ничего проверять, ибо у тебя всегда будет актуальная информация и на сервере и в базе.
    А теперь посмотри вопрос, который я ставил.

  5. #15
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от execution Посмотреть сообщение
    DeimoS, пользуясь случаем, хотел уточнить. Если использовать 1 вариант (создание строки под каждый итем), следовательно при регистрации создавать столько строк, столько количество может быть итемов. Но это ж может быть до 30 INSERT запросов, не затратно ли? Или же есть более продуктивный способ?
    А теперь сделай бэкап какой-нибудь своей заполненной таблицы (или скачай мод с бэкапом БД) и посмотри на структуру запросов :)
    MySQL способна по несколько тысяч записей создавать за секунду без каких-либо трудностей. И это без какой-либо специфичной настройки под конкретное железо, что может увеличить скорость работы MySQL.
    Так что нет, проблем от 30 запросов не будет :)

    И да, я имею ввиду именно то, что в БД создаются записи для хранения предметов сразу при регистрации, а не по мере поступления данных. Просто потому что второй вариант будет требовать от тебя проверки существования этих самых данных: то бишь, каждое обновление какого-либо из слотов тебе нужно будет отправить сначала SELECT-запрос, а только потом отправить UPDATE или INSERT. Гораздо проще и надёжнее реализовать создание строк прямо при регистрации (и при авторизации так же проверять существование записей под каждый слот).

    Стоит понимать две простых истины:
    1) Вы тут не микропроцессоры программируете и у вас нет сильных ограничений по доступной для использования памяти. Так что нет никакого смысла экономить ей, урезая, при этом, скорость работы и надёжность системы (от которой напрямую зависит то, будете ли вы тратить время на создание новых систем или на исправление багов в уже написанных системах). UPD: И да, это применимо только в случае, когда память используется по делу :) Как, например, в нашем случае.
    2) Размер такой таблицы даже с миллионом записей будет каким-то уж очень большим. А, при желании, можно прикрутить и перенос старых данных в дочернюю таблицу (либо их удаление). Хотя, опять же, непонятно на каких калькуляторах нужно запускать MySQL-сервер, чтоб размер столь простых таблиц смог создать хоть какие-то проблемы. MySQL наоборот создали для того, чтоб иметь возможность быстро работать с данными, тратя, при этом, дополнительную память (если уж совсем в дебри не зарываться, то индексы - отличный пример того, как жертвуя памятью мы можем получить существенный прирост к скорости, если сделаем всё правильно).

    - - - Добавлено - - -

    Ну и да: я бы всё же советовал использовать в данном случае вариант со столбцами под слоты и одной записью в таблице для одного игрока, а не "1 слот = 1 строка". Вариант с построчным заполнением хорош в системах, которые могут часто изменяться или сами по себе требуют гибкого количества записей (например, если вы решите сделать так, что за донат можно купить любое количество слотов, то да, вариант с "1 слот = 1 строка" - идеальный). В данном же случае гораздо проще и вам, и MySQL будет, если данные игрока будут хранится в одной строке.

    Просто научитесь пользоваться оператором "ALTER TABLE" (или просто тупо делайте нужные изменения в таблице, а потом делайте её бэкап и смотрите какой код запросов вам сгенерирует phpMyAdmin) и тогда сможете сделать вариант с одной записью на игрока таким же гибким, как и вариант "1 слот = 1 строка".
    Запрос на проверку существования столбца тоже выглядит просто:
    1. SHOW COLUMS FROM `имя_таблицы` WHERE `Field` = 'имя столбца'

    Без "WHERE", соответственно, выдаст просто структуру таблицы и можно будет проверить существование столбцов на стороне сервера (хотя можно и форматирование запроса сделать соответствующе, чтоб сама MySQL всё проверила и вернула лишь "1" или "0"). Собственно, проверяете существование столбцов и если каких-то не хватает (а так будет только если вы решите добавить новые столбцы) - добавляете их через "ALTER TABLE".
    В общем, этот способ можно сделать столь же гибким, но он, при этом, будет гораздо экономичнее и проще. Вся основная нагрузка будет сконцентрирована только при старте сервера. А выгружать и обновлять придётся одну единственную строку во всех случаях. Соответственно, создав составной индекс на поля с AI и ID аккаунта вы получите хорошую производительность и, при этом, компактность (для инвентаря с 30 слотами такой вариант будет содержать на 58 записей меньше, ибо не нужно будет для каждого слота дублировать номер строки и ID аккаунта. То бишь: "(количество слотов - 1) * 2").
    Последний раз редактировалось DeimoS; 28.11.2019 в 17:08.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  6. 3 пользователя(ей) сказали cпасибо:
    execution (27.11.2019) Pa4enka (28.11.2019) SteveStage (28.11.2019)
  7. #16
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Можно сделать либо так:
    http://pro-pawn.ru/showthread.php?15...ll=1#post84550

    В первом варианте для быстрой работы запросов следует разобраться с тем, что такое индексирование и создать индексы либо только на столбце и ID аккаунта, либо ID аккаунта + слот (в зависимости от того, как взаимодействовать с таблицей будешь запросами).
    Во втором варианте, собственно, тоже желательно индексы создать, но там это будет чуть менее критично.
    Оба варианта имеют право на жизнь.
    1 вариант и был у меня изначально (только в бд с аккаунтами), а 2 вариант довольно интересный...
    Я думал, что значения для каждого игрока будут в 1 строку со значениями, а тут на каждый слот своя строка в бд, вот этого варианта инвентаря я точно не учел

    UPD: Я вернул все как было, только теперь у инвентаря своя таблица (вариант с столбцами под каждый слот), да и он в моде будет выглядеть проще (вместо постоянных sscanf и создания переменных под каждый предмет и количество в слоте, это будет храниться в энуме)
    Последний раз редактировалось SteveStage; 28.11.2019 в 19:56.

  8. #17
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Вопрос решён?
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  9. #18
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Да, спасибо за то, что не поленился и вынес все ключевые сообщения в отдельную тему.

 

 
Страница 2 из 2 ПерваяПервая 1 2

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •