www.mudconnector.su
https://forum.mudconnector.su/

Хранение данных: СУБД vs сериалайз
https://forum.mudconnector.su/viewtopic.php?f=14&t=32
Страница 1 из 2

Автор:  andrej_andreev [ Сб июн 21, 2008 11:27 am ]
Заголовок сообщения:  Хранение данных: СУБД vs сериалайз

Собственно, вопрос такой. Из возможных вариантов хранения данных видно только два. Первый -- "классический" -- использование файлов и записывание туда всех данных в каком-то своем формате (он может быть разным: циркульный файл, XML/YAML или любой другой сериалайз), а при необходимости вынимать все это из файла в память. Либо, можно подключить какую-нибудь внешнюю базу данных, которая сама будет заниматься поиском нужных объектов, записью/считыванием и прочими вещами.
По простоте работы с мне больше нравится идея БД. Можно взять MySQL, SQLite или что-нибудь еще (скулайт буду пробовать в скором времени).
Проблема безопасного сохранения дампов решается регулярными дампами кусков бд. Особенно, если разнести часто меняющуюся информацию (статсы, поинты, координаты, свойства вещей: хозяин, положение и другие, и другие) и "статику": все текстовые поля типа имен, описаний. Если предполагать комнаты абсолютно статичными, то и их тоже. Все эти постоянные величины не нужно дампить часто. Так сэкономится куча места и времени одновременно.
В сериалайзе я вижу проблему геморроя с собственным форматом (или несовместимости при работе с чужим), свой велосипед с поиском и записью. Идея о БД мне не нравится тем, что в маде количество запросов в секунду будет стремится к бесконечности (как минимум -- движение персонажей довольно часто). Думаю, это слишком большая нагрузка, чтобы дергать даже самую крутую базу.
Есть ли еще у предлагаемых решений минусы или, может, пропущенные мной плюсы?
Спасибо.

* Про дампы и их частоту отдельный разговор, просьба не заводить здесь.
* В процессе написания все-таки пришла в голову мысль о нецелесообразности использования отдельной БД в играх. Все-таки лучше иметь в памяти все данные (или активную часть, подгружать при необходимости), которые дампить и читать в каком-нибудь формате.
* Постараюсь протестировать работу мада с SQLite-ом, с MySQL-ем. Интересно, что получится. У руби есть очень простой интерфейс для работы с объектами и ДБ-ами: activerecord. Пробовать надо.

Автор:  Дворак [ Вт июн 24, 2008 12:43 am ]
Заголовок сообщения:  Re: Хранение данных: СУБД vs сериалайз

В продолжении темы 'Вопросы по серверам: очередь команд, вывод' , так как разговор
пошел о сериализации и СУБД...

Итак...

Дворак писал(а):
KadVar писал(а):
А эээ... если уж так хочется, то что мешает использовать СУБД с транзакциями и закрывать их в гарантированно стабильных состояниях ? Я долго все это жевал... кругами.... и к окончательному решению увы не пришел. Есть масса аргументов ЗА использование СУБД, и несколько против.... в частности - она ломается вся целиком, а 24х365 админа у нас нету, увы... нереально это. Что делать - неясно.


Я тоже долго ходил вокруг СУБД. И решил отказаться по разным причинам, в том числе и те, которые привел ты - ломается целиком, пришлось бы зависить от стороннего ПО, не факт что было бы быстрее собственного решения, сложнорасширяемое решение. При развитии движка пришлось бы городить новые таблицы и менять старые. СУБД рулит при сложных взаимосвязях, а в маде связи наооборот простые... список мобов, объектов, чаров, где находяться и что имеют...
это все... СУБД получался для меня слишком избыточным. Поэтому перешел к простому дампу мира - в постраничном файле, где мир пишется в бинарном формате. Этот дамп требуется только в случае сбоя в работе... При нормальном завершении - вся информация сохраняется в хмл, а дамп файл удаляется.



KadVar писал(а):
В принципе не вижу никаких проблем, кроме проблем с поддержкой.
С другой стороны... сломается и хрен с ним, пусть ломается. Утром приду и исправлю.
Это лучше, чем если будет потихоньку ломаться.... в процессе работы.

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


Не буду привязываться к словам, СУБД хороший вариант, но я взял и плюсы и минусы
вариантов с СУБД или без и вот что получилось:

Плюсы СУБД : Транзакции, т.е гарантированность корректности данных, при условии, что код
программы написан правильно и не будет левых запросов, достаточная простота реализации,
хотя это зависит от языка программирования, прекрасная скорость работы.
Минусы : зависимость от чужого ПО, необходимость его устанавливать, настраивать и поддерживать.
Если база портится, то она портится целиком.

Плюсы варианта без СУБД : достаточная простота реализации - сериализация в поток это стандартная задача
в программировании. Отличная скорость работы (запись потока идет чуть быстрее чем запись в БД, хотя это некритично).
Нет зависимости от стороннего ПО. Нет необходимости в поддержке этого ПО.
Минусы : нет транзакций, что означает вероятность повредить данные, в случае сбоя или неправильного кода.
Сложную расширяемость и совместимость из-за отсутствия унификации хранения данных в потоке, невозможность поддержки.

Я выбрал средний вариант стандартной сериализации с транзакциями. Это дает вариант скорости с надежностью.
В качестве уникации хранения данных я использую xml. В процессе работы используется оба варианта - для
большей части данных, которые часто меняются - сериализация, для меньшей - xml. При остановке сервера -
все данные сохраняются в xml, а файл сериализации стирается за ненадобностью. В случае проблемы,
остаются данные в файле сериализации. При необходимости - запускается движок, он читает сериализованные данные
и сохраняет их в xml. Так я побеждаю проблему с совместимости сериализованных данных.

KadVar писал(а):
С другой стороны... сломается и хрен с ним, пусть ломается. Утром приду и исправлю.
Это лучше, чем если будет потихоньку ломаться.... в процессе работы.


Ломаться в процессе работы потихоньку... это как ? :)
А на счет поломки БД ... тут уж я все же думаю, что проблема решаема...
Как это получится у меня, покажет время

Автор:  KadVar [ Вт июн 24, 2008 10:45 am ]
Заголовок сообщения:  Re: Хранение данных: СУБД vs сериалайз

Дворак писал(а):
Ломаться в процессе работы потихоньку... это как ? :)
А на счет поломки БД ... тут уж я все же думаю, что проблема решаема...
Как это получится у меня, покажет время


Это просто, есть редкосрабатываемый сценарий портящий что-то где-то.
И потихоньку он "пожирает" твои данные.

Думаю с СУБД скорость больше, ведь можно делать update только того, что нужно...

Автор:  andrej_andreev [ Вт июн 24, 2008 11:09 am ]
Заголовок сообщения:  Re: Хранение данных: СУБД vs сериалайз

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

А что вы имеете ввиду под "портиться вся сразу"?

Транзакции нужны, в общем-то, только в одном случае: при переводе денег от А к Б. Ну или при любом перекачивании нематериальной субстанции от одного объекта к другому. В случае передачи вещей мы просто меняем owner_id у этой веши.

Автор:  KadVar [ Вт июн 24, 2008 11:14 am ]
Заголовок сообщения:  Re: Хранение данных: СУБД vs сериалайз

andrej_andreev писал(а):
Да, апдейт, удаление и добавление будут быстрее работать.

К сожалению практика показывает, что либо добавление быстро, либо апдейт и удаление.
И то и се, "ну никак".

Транзакции нужны к сожалению.
Вообще это большой вопрос, как лучше все организовать. В том числе зависит от реализации СУБД... к сожалению.
Выж не хотите иметь список всех вещей мада с ownerid и исправлять там ? Боюсь немного медленно будет, учитывая, что в список войдут все вещи игроков в ренте...

Автор:  Дворак [ Вт июн 24, 2008 4:23 pm ]
Заголовок сообщения:  Re: Хранение данных: СУБД vs сериалайз

KadVar писал(а):
Дворак писал(а):
Ломаться в процессе работы потихоньку... это как ? :)
А на счет поломки БД ... тут уж я все же думаю, что проблема решаема...
Как это получится у меня, покажет время


Это просто, есть редкосрабатываемый сценарий портящий что-то где-то.
И потихоньку он "пожирает" твои данные.


Редкосрабатывающий сценарий, который чтото портит может быть и в варианте с СУБД...
Сама СУБД никак не спасает от этого...

KadVar писал(а):
Думаю с СУБД скорость больше, ведь можно делать update только того, что нужно...


Сомнительно, что СУБД будет быстрее... В сериализации - нужно только сохранить данные подряд в один единственный файл, без какой либо подготовки этих данных... а в варианте с СУБД - 1) подготовить данные 2) сформировать запрос, 3) запустить его, 4) СУБД должна его выполнить, а это запись уже в несколько файлов - в таблицу, индексный файл и т.д. Тут нужно сравнивать на практике оба варианта... Как правило заточенные вещи под конкретную задачу работают лучше и быстрее всего.

andrej_andreev писал(а):
.... Меня сомневает только апдейт координат плеера со скоростью раза четыре в секунду. Но тут как с веб-сайтом, надо отделять статику от динамики, подключить кэширование и проблем быть не должно.


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

я не против СУБД, но прикинув во что выливается ее использование, а что я получаю взамен, я решил от нее отказаться... я по сути получаю только один большой плюс - транзакции, но и сериализацию тоже можно сделать с поддержкой транзакций....

Автор:  andrej_andreev [ Вт июн 24, 2008 7:50 pm ]
Заголовок сообщения:  Re: Хранение данных: СУБД vs сериалайз

при сериалайзе надо записывать всех игроков, все вещи, всех монстров... Это куча данных все-таки. Мне вот боязно :)

Автор:  Дворак [ Ср июн 25, 2008 11:54 am ]
Заголовок сообщения:  Re: Хранение данных: СУБД vs сериалайз

andrej_andreev писал(а):
при сериалайзе надо записывать всех игроков, все вещи, всех монстров... Это куча данных все-таки. Мне вот боязно :)


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

А у СУБД есть другое слабое место. Если не хранить данные мира в памяти сервера, а брать только из СУБД, то это очень сильно нагрузит СУБД, и не факт что она будет успевать выполнять все запросы.
А если держать данные в памяти сервера и переодически выгружать их в базу... то тут придется следить за
синхронизацией данных в памяти и базе (у нас 2 копии одних и тех же данных). Малейшая ошибка в коде, и синхронизация нарушится, и при этом это не сразу будет заметно. Это скорее всего проявится при ретстарте сервака, когда будут закачиваться данные из базы. Т.е. база будет битой - это потерянные вещи, деньги, а то и чары и т .д . Еще неудобство в том - что этот эдакий отложенный баг будет очень
нелегко локализовать в коде программы.

Автор:  andrej_andreev [ Ср июн 25, 2008 11:59 am ]
Заголовок сообщения:  Re: Хранение данных: СУБД vs сериалайз

В общем, стоило только начать и сразу возникла некоторая проблема.
Мне хотелось, используя СУБД, избавится от хранения какой-либо инфы в памяти самого сервера, но -- хаха -- это невозможно, так как мобы, например, должны иметь свой кусок динамической памяти для хранения своих квестов, запоминания обидчиков и т.п. Как вариант можно посмотреть в сторону загрузки объектов из БД в память, использование их и сохранение всех изменений в БД, но тогда теряется много смысла.
Остается простой, но тупой, вариант: загрузка всего (нужного/активного) в мозги серверу, создание там всяких поисков и т.п. А дампы могут происходить периодически, может, кусками. Так примерно.

Автор:  KadVar [ Ср июн 25, 2008 12:57 pm ]
Заголовок сообщения:  Re: Хранение данных: СУБД vs сериалайз

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


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

Страница 1 из 2 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/