Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите Оптимальный способ хранения данных сервера

Тема в разделе "Разработка плагинов для новичков", создана пользователем CoolBoy, 22 янв 2017.

  1. Автор темы
    CoolBoy

    CoolBoy Активный участник Пользователь

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Доброго времени суток.

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

    Касательно mysql хранилищ:
    1) Как эффективнее работать с данными сервера?

    Нужный тип данных хранить в нужной таблице, или всю информацию сервера хранить в одной таблице сразу?
    • Пример №1:
    Код:
    Таблица auth:
        Столбцы:
            player | last_ip | last_quit_time | password | session
    Таблица clans:
        Столбцы:
            player | rank | clan_name | kills | deaths
    
    • Пример №2:
    Код:
    Таблица data:
        Столбцы:
            player | last_ip | last_quit_time | password | session | rank | clan_name | kills | deaths
    
    Какой из предложенных способов организации хранения данных будет наиболее эффективным?

    Пример №1:
    Меня немного смущает тот факт, что в разных таблицах будут храниться однаковые данные.
    Например, столбец "player".
    Плюс же такого способа организации хранения и обработки данных очевиден - быстрая скорость работы с базой данных.

    Пример №2:
    Минус этого примера очевиден - огромный размер таблицы, а как следствие, возможно, более долгие запросы.
    Плюс - данные таблицы не дублируются больше нигде.

    2) Существуют ли другие типы баз данных, более эффективные для хранения подобного рода информации?
    Если да, то какие?

    3) Быть может, кому-нибудь уже известно, как работают с данными крупные проекты вроде "Mineplex", "Hypixel" и другие?

    P.S. Раньше работать с большим количеством данных не приходилось, отсюда и такие, возможно, глупые, вопросы. Да и, насколько я знаю, тема работы с "Big Data" всегда была актуальна. :)
     
    Последнее редактирование: 22 янв 2017
  2. Хостинг MineCraft
    <
  3. TaoGunner

    TaoGunner Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    TaoGunner
    На самом деле - как хочешь, так и делай, (ИМХО) оба варианта одинаковы.

    Предположим, выбираем вариант №1 (две таблицы). Первую будет использовать предположительно система авторизации на сайте + авторизация на лаунчере. Вторую таблицу будет использовать плагин сбора игровой статистики + опять же сайт для её отображения. Если обе таблицы используются сайтом - то я бы лучше их объединил.

    А насчет скорости можно просто прикинуть, сколько игроков планируется на проекте. Судя по таблице предположу, что будет всего 1 сервер. И даже если наберется 1000 аккаунтов, выборка не будет долгой.
     
  4. Автор темы
    CoolBoy

    CoolBoy Активный участник Пользователь

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    А если у меня сборка на нескольких Bungee?
    И одна таблица на все данные?
    Я так думаю, лучше несколько таблиц.
    Ибо, имея одну таблицу, в которой хранятся все данные, коннект к ней и обновление данных будет происходить чуть ли не ежесекундно.
    А это не есть хорошо.
    Плюс, волнуюсь, как бы небыло задержек в обновлении данных.

    Содержание таблиц было приведено в пример.
    Если же опираться на то, что хочу я, то, если делать одну глобальную таблицу, то в ней будет более 40 столбцов.
    Если реализовывать вариант из второго примера, то у меня получится больше 15 таблиц и в каждой от 2 до 10 столбцов.
     
  5. AtomicInteger

    AtomicInteger Активный участник Пользователь

    Баллы:
    46
    Если есть возможность использовать SQLite, то используй эту СУБД, побыстрее MySQL будет, так как хранилище локальное.На счёт таблиц, то тут стоит использовать реляционный тип базы данных.Так, например, некоторые свойства можно раскидать по таблицам, а связать их всех с помощью идентификатора.В роли идентификатора может выступать имя игрока, например.Да, один столбец всё же дублируется, и конкретно в этом примере реляционный подход особой силы не имеет, но как по мне, лучше сделать 2 таблицы и грамотно к ним обращаться в нужный момент.
     
  6. GoodCoder

    GoodCoder Активный участник Пользователь

    Баллы:
    76
    Второй тоже может быть локальным. И настроек там не просто так много...
     
  7. Автор темы
    CoolBoy

    CoolBoy Активный участник Пользователь

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    В качестве глобального хранилища стоит использовать SQLite?
    Ибо, если у меня там будет 150к записей, сколько будет весить файл с бд?
     
  8. AtomicInteger

    AtomicInteger Активный участник Пользователь

    Баллы:
    46
    Ну, тут неоднозначно.SQLite быстрее в плане того, что ему не нужно делать запросы на сторонний ресурс, у неё всё под рукой+простота+переносимость.Но SQLite стоит использовать в небольших проектах, если планируется работа с большим объемом данных, то, возможно, лучшим решением будет MySQL+можно сделать и локальное хранилище, если сервер позволяет.Я не думаю, что будут существенные различия в размерах между этими двумя СУБД.Так что если места на том же сервере не хватает, с помощью MySQL перекидывай на другой.[DOUBLEPOST=1485101394,1485095859][/DOUBLEPOST]Можно вообще, создать простую утилиту, запихать в базу этих 150к записей и проверить, какая покажет себя лучше.
     
  9. Автор темы
    CoolBoy

    CoolBoy Активный участник Пользователь

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Как раз занят этим =)
     
  10. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    SQLite в разы медленней чем MySQL. На большой скорости абдейда он отвалится просто.[DOUBLEPOST=1485169405,1485169317][/DOUBLEPOST]Я рекомендую юзать MariaDB, там скорость записи выше чем у MySQL.
    А если тебе нужна огромная скорость, то юзай redis. Этот уж точно не отвалится.
     
  11. Автор темы
    CoolBoy

    CoolBoy Активный участник Пользователь

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Кое-кто уже советовал мне redis.
    Читал про него. Не устраивает то, что он хранит всю информацию в локальном кеше. Поэтому как глобальная база данных, redis, боюсь, не подойдёт.
     
  12. TaoGunner

    TaoGunner Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    TaoGunner
    А ты планируешь светить базой во внешку? Зачем?
     
  13. Автор темы
    CoolBoy

    CoolBoy Активный участник Пользователь

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Нет, зачем? Как мне коннектиться с разных серверов к одной базе данных, ммм? Да и потом, локальная память не безгранична, чтобы использовать redis для хранения всей информации.
     
  14. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Криво читал, к нему можно конектится извне. redis как раз таки направлен на глобальную базу с большой нагрузкой.
     
    Последнее редактирование: 24 янв 2017
  15. Stamorey

    Stamorey Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Stamorey
    Не юзал бд ни разу:rolleyes:, но думаю там уже должна быть учтена работа с большим количеством записей, с очень большим.
    Например можно сделать пародию на бд, выбирающую из нескольких триллионов аккаунтов - нужный - за несколько миллисекунд, с помощью файлов и каталогов. (папка Players, в ней - максимум сотня папок, названия которых - первая буква ников, внутри каждой из них так же, и так далее)
    В итоге получится, что для получения информации о игроке, у которого ник состоит из 10 знаков будет десять выборок из сотни папок, вместо одной выборки из триллиона файлов.
    И уж если так можно решить эту проблему, то на аппаратном уровне баз данных тем более должно быть все нормально со скоростью.
     
  16. Автор темы
    CoolBoy

    CoolBoy Активный участник Пользователь

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Так локальный кеш же быстро забьётся, разве нет?
     
  17. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Это тебе не мемчача, redis сохраняет данные, хотя и временное хранение данных тоже там есть.
     
  18. Jampire

    Jampire Старожил Пользователь

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    При работе с MySQL важно запомнить одно правило. Чем проще запросы - тем лучше. Откуда эти запросы берут информацию - совершенно не важно. Так-же очень важна роль индексов в огромных таблицах, это ускоряет выборку в разы.

    Сейчас работаю с базой, у которой 7к ппс и около 2к коннектов. Проблем нет совершенно и по ресурсам сервер бд жрет копейки. (использую MariaDB)
     
  19. Автор темы
    CoolBoy

    CoolBoy Активный участник Пользователь

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Спасибо за такой развёрнутый ответ с примером. Значит остановлюсь пока на этом.

    Тему закрывать не стану, вдруг для кого будет актуально.
     

Поделиться этой страницей