Я не люблю РБД, но это не значит, что я не люблю SQL-серверы.
Я снимаю шляпу перед разработчиками, посвятившим свои жизни оптимизации SQL-серверов,
и ни в коем случае не хочу от SQL отказываться.
Мы тестировали нашу систему на журнале из 1 000 000 документов на SQLite3, MySQL, PostgreSQL.
SQLite3 - тормоз, MySQL и PostgreSQL работают великолепно и по скорости одинаковы.
При всем уважении к MongoDB, брать ее за основу мы не рискнули и правильно сделали.
По мере ее распространения появляется все больше критики и в части быстродействия,
и в части функциональности, не говоря уже о сложностях интеграции с существующими системами.
Все чаще я встречаю статьи (почему-то исключительно импортные) о том, что выбрав MongoDB и сделав на ней систему, разработчики
вынуждены от нее отказаться и вернуться к SQL-серверам.
Кроме того она не совсем бесплатная: подписка на MongoDB стоит для граждан США $7500. А я не гражданин США. А если вдруг санкции?
Короче, мы сделали ДОБД на основе SQL-таблицы. Сделать это оказалось не просто, а очень просто.
Вся информация об объектах хранится в таблице из 5 столбцов:
unid |
xcrt |
xnam |
xval |
xmdf |
binary(16) |
timestamp |
text(32) |
text(65000) |
timestamp |
UUID |
момент создания записи |
имя поля |
значение поля |
момент перевода записи в историю |
Столбец "xmdf" совместно с атрибутом "MODIFIER" позволяет отследить, кто когда какие поля правил.
Для загрузки документа в классе Database имеется соответствующий метод:
def getDocumentByUNID(self, unid):
sql = "SELECT xnam, xval, xcrt FROM {0} WHERE (unid = {1}) AND (xmdf IS NULL)".format(self.dbTable, unid)
...
Сие означает, что мы хотим получить для документа, имеющего вот такой вот unid, список всех актуальных (xmdf IS NULL) полей с их значениями и датой создания.
Таких таблиц в системе может быть много. Раз уж мы используем термин документ, то вполне логично
хранилище однотипных документов назвать журналом. О том, как формируются названия журналов,
написано ниже. Здесь же я хочу добавить, что в дополнение к описанной таблице с данными
мы для повышения быстродействия создаем еще ряд служебных таблиц, включающих индексированные коллекции документов.
Состав этих таблиц задается правилами и может быть разным для разных журналов.
В приложении есть кнопка, по которой все эти таблицы удаляются и пересоздаются заново.