Какую БД выбрать для бота?

Андрей К…
Последнее изменение:
0
0
0

Привет!

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

Что это вообще такое база данных

Если подходить буквоедски, то база данных (БД) — это набор данных, собранных в одном месте. Неожиданно, правда?) Например, под базой данных можно понимать список контактов в телефоне, воспоминания в голове и всякие подобные вещи.

Система управления базами данных (СУБД) – это набор программ и средств для работы с данными – сохранение новых данных, изменение старых, выбор данных по определенным критериями и т.п.

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

Применение

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

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

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

Вот именно в такие минуты и понимаешь, что программа выставила ордер на бирже, получила его ID из ответа биржи, отслеживает его, НО НИКУДА НЕ ЗАПИСАЛА. И вот теперь, когда программу нужно перезапустить, она его забудет (((. И начнёт все сначала, и придется руками лезть на биржу, что-то там менять, и вообще вечер обещал пройти более интересным способом.

Нужно садиться и всё переделывать. Но это не всегда.


Реклама


Какие данные можно НЕ хранить?

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

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

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

В некоторых случаях, например, когда мы торгуем только ботом, можно использовать биржу в качестве БД – например, на старте получать список выставленных ордеров через запрос к API, и прорабатывать их.

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


Реклама


Практическое применение

БД длительного хранения

В случае простого бота мы гипотетически записывали в файл ID ордера (и может быть дополнительную информацию о цене, объеме и т.п.), но что, если мы собираемся торговать сразу по 60 парам? Заведем 60 файлов по одному на каждую пару или будем жонглировать записями в текстовом файле?

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

Итак, мы решим использовать базу.

Я назвал этот подраздел «БД длительного применения», т.к. хотел в нём обсудить базы данных, подходящие для постоянной рутинной работы. Такие базы данных организовывают данные внутри себя в виде таблиц (как в экселе, с заголовками), и позволяют из одних таблиц ссылаться на другие (такие базы данных называют реляционными, от английского слова relation – отношение).

Примеры таких баз – в порядке увеличения производительности, но и сложности работы с ними:

  • SQLite
  • MySQL
  • PostgreSQL
  • Oracle
  • MSSQL

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

SQLite

Эта БД имеет свою нишу на рынке, т.к. является встраиваемой (единственная в моём списке). Это значит, что для работы с базой не требуется скачивать дополнительных программ, устанавливать и т.п.

Вам достаточно написать код вашего бота, добавить туда модули для работы с SQLite, и ваш код создаст файл базы данных в папке с ботом (или в другом месте, или вообще в оперативной памяти), и вы сможете работать с этой БД, и выполнять стандартные SQL команды (SELECT, INSERT и т.п.).

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

Но, разумеется, у неё есть и слабые стороны. Во первых, блокировка – когда вы вносите изменения в БД, вся база блокируется до фиксации изменений. Если вы работаете в одном потоке программы, или редко что то записываете, то это в общем то и не проблема.

Но для нагруженного проекта лучше брать что-то помощнее.

MySQL/MariaDB

БД с непростой судьбой. Когда-то разработчики отказались продаваться Oracle, и планировали самим вырасти и выкупить Oracle. Но в итоге так и не выстрелили, их купили, для этой базы был создан свободный форк MariaDB, и теперь две ветки развиваются параллельно.

В проекте средней руки, в MVP и домашних проектах, впрочем, данная БД сможет покрыть около 100% потребностей, если не желать слишком многого.

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

При установке под Windows ставится много лишнего, интерфейс неочевиден и неудобен (под линуксом всё прекрасно в консоли), но мне кажется, под Windows лучше вообще не затачиваться.

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

Для каких-то совсем ненагруженных проектов я бы, возможно, выбрал именно эту базу данных.

PostgreSQL

Наиболее продвинутая БД, едва ли не самая мощная из бесплатных. Есть поддержка разных ОС, встроенный язык программирования для хранимых процедур, возможность использовать скриптовые языки, поддержка хранения различных типов данных (например, JSON, IP, массивы, диапазоны, геометрические данные и т.п.).

Я знаю организации, которые отказались от использования платного MSSQL в пользу PostgreSQL для работы 1С.

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

Oracle

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

Сама по себе база весьма шустрая при правильной настройке, а также эффективно утилизирует ресурсы сервера. Есть IDE довольно высокого качества, и множество возможностей. Правда, для их освоения могут потребоваться годы, курсы и куча литературы. И да, без английского особо делать там нечего.

MSSQL

БД от Microsoft. Заточена под работу под Windows, имеет отличную среду разработки, удобный интерфейс, очень легкий порог входа. Правда, она, как и Oracle, платная с бесплатными урезанными вариациями.

При установке можно сразу установить сервис отчетности, где делать отчеты в разных масштабах.

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

Более того, на тех же предприятиях их ставят зачастую не потому, что они лучше того же PostgreSQL, а потому лучше решают сторонние задачи бизнеса:

  1. Под MSSQL проще найти разработчиков, Microsoft расстарался, везде поставляя свою ОС и свою БД, а также интегрировал сервисы в общую инфраструктуру – например, можно рулить правами доступа в БД на уровне сисадмина в Active Directory, с другими базами придется повозиться.
  2. Сервис и поддержка – крупная контора, банк или национальная ЖД компания скорее заключит договор с Microsoft, чем с волосатиками, которые локально поддерживают другую БД. В случае сбоя уровень компенсаций будет соответствующим.

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

Но есть еще и другие задачи, которые базы данных могли бы решить, и об этом отдельный раздел.

БД быстрого доступа

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

Или, например, собирать свечи по всем парам, агрегировать их на лету.

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

К таким базам можно отнести Redis, MongoDB, Couchbase server и т.п.

Вот, например, результат работы Redis на макбуке

$ redis-benchmark -n 1000000 -t set,get -P 16 -q
SET: 403063.28 requests per second
GET: 508388.41 requests per second

Эти базы данных не только живут в оперативной памяти, но еще и используют другую систему хранения – например, там нет таблиц, как в реляционных БД,  но есть словари, множества, массивы и т.п.

Такие базы хорошо использовать для оперативной работы, как отдельно так и в дополнение к классической реляционной. Тем не менее, часть из них умеет сохранять данные в процессе работы в фоновом режиме, так что если будете работать в Redis и придется перезагрузиться, то, скорее всего, данные не потеряете. Но цена за это – медленный старт БД, которая с диска будет считывать всё обратно в память при запуске.


Реклама


Заключение

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

Нет комментариев
Пожалуйста, Авторизуйтесь что бы оставить свой комментарий