- PVSM.RU - https://www.pvsm.ru -

Database as Сode. Копаем глубже

Database as Сode. Копаем глубже - 1

В IT-проектах код пишут все. Инженеры с помощью нескольких строк управляют Kubernetes кластерами, разгоняют облака Terraform'ом и ворочают тонны конфигураций на Ansible, Chef и Puppet. QA пишут понятные бизнесу тестовые сценарии на Spock и Cucumber. Аналитики свободно, часто лучше разработчиков, разговаривают на SQL. Проектная документация в форматах Markdown, AsciiDoc или LaTEX "компилируются" в нужный формат на билд-сервере. Ну а сами разработчики, эти укротители кода, владеют сразу россыпью языков на каждый жизненный случай — клиентский, серверный, скриптовый, функциональный и пр.

Код уже давно перестал быть загадочной тарабарщиной и теперь в том или ином виде доступен и понятен многим, даже премьер-министрам [1]. И весь этот код участвует в стандартном жизненном цикле — находится под управлением VCS, подвергается code review, автоматизированному тестированию, CI, CD. Используются общие инструменты и подходы, метрики производительности и качества. А все вместе это носит гордое название — "Everything as code".

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

Типичный проект

Большинству из нас ежедневно, хотим мы этого или нет, приходится сталкиваться с самыми разными БД. Проектировать, разрабатывать, администрировать, решать проблемы с производительностью, конкурентным доступом и вот это все. При этом требования к сбору, обработке и хранению данных постоянно ужесточаются — для одних нужна 100% консистентность, для других нет. Одни хранятся годами, другие несколько секунд. Потеря одних приведет к миллионным убыткам, тогда как потеря других не будет заметна для бизнеса.

В связи с этим давно появился и успешно используется подход Polyglot Persistence [2], в результате чего встретить в наши дни на каком-нибудь проекте одну единственную СУБД будет большой удачей. Вместо этого для каждой конкретной задачи подбирается наиболее подходящая база, без попыток как-то выкрутиться и решить все свои проблемы на старой доброй реляционке. А, например, микросервисная архитектура позволяет изолировать работу с конкретной СУБД в рамках одного сервиса и выжать из нее максимум пользы, без вреда для чистоты архитектуры всего проекта. В итоге "Реляционка" (куда ж без неё) + "Key-value DB" + "Wide Column DB" + "Document-oriented DB" + "Search engine DB" + "Graph DB" + "Какая-то еще DB" = "SUCCESS!". Помимо этого, увеличивается количество экземпляров (инстансов) этих БД — шардинг, репликации, распределенные СУБД. Плюс все это надо "растянуть" и поддерживать в разных средах — разработческой, тестовой, продовой и пр.

Чтобы не быть голословным, приведу несколько выдержек из свежего соцопроса от компании-гиганта по решениям в области управления и разработки БД Quest Software — Проблемы DBA: Тренды в администрировании БД [3] (чтобы скачать, придется пройти несложную регистрацию, но оно того стоит):

  • Вопрос №2: "Сколько инстансов реляционных БД запущено в вашей компании?" — по результатам 24% респондентов используют от 100 до 500 инстансов, а 19% более 500.
  • Вопрос №4: "Сколько различных СУБД (SQL и NoSQL) используется в вашей компании?" — 56% используют от 2-х до 3-х различных СУБД, 40% более 5-и, и только у 4% опрошенных одна-единственная СУБД.
  • Вопрос №18: "Что происходит с количеством инстансов БД в ваших проектах?" — 2/3 респондентов отмечают ежегодное их увеличение.
  • Вопрос №30 (в качестве итога): "С какими главными проблемами столкнутся DBA в ближайшие 3 года?"
    1. 51% — "Увеличение количества инстансов СУБД"
    2. 40% — "Возможность администрировать новые нереляционные БД"
    3. 32% — "Сокращение IT-бюджета" (который, ожидаемо, распухает из-за первых двух проблем)

А мы готовы к этому?

Не секрет, что для эффективной работы с той или иной СУБД необходимы специализированные инструменты, такие, как IDE и DB-менеджеры, средства мониторинга, моделирования, миграции схем и многое другое. Однако большая часть таких инструментов и сред были придуманы и разработаны еще в те славные времена, когда любому проекту с головой хватало одной-единственной реляционной СУБД, а таких модных слов, как "Agile", "DevOps" и "CI/CD", еще не придумали. И с тех пор мало что изменилось, т.к. область разработки и сопровождения БД всегда являлась достаточно закрытой и консервативной, а у большинства разработчиков ассоциируются с чем-то древним, сложным и непонятным. Сегодня же, когда практически в любом проектном хозяйстве трудится сразу несколько самых разношерстных СУБД и десятки/сотни их инстансов, обычные повседневные проблемы разработчиков и DBA становятся еще более острыми.

Традиционно самым популярным и незаменимым инструментом для работы с БД являются всевозможные IDE. Обычно это комплексное решение, которое объединяет под своим интерфейсом, в основном графическим, самые разные функции для разработки и администрирования в единую рабочую среду, делает нашу работу с БД более продуктивной и комфортной — остается только клацнуть мышью на нужном пункте меню. И действительно, мало кто из нас обходится без таких крутых штук, как EMS SQL Manager [4], Toad [5], dbForge [6] и многих других [7].

Одной из главных проблем таких "коробочек" является то, что под прессом новых фич и новых СУБД (которые не прекращают появляться на рынке) они получаются довольно сложными и продолжают усложняться с каждым разом. Причем как в использовании (зачастую людям приходится осваивать не особенности работы конкретной СУБД, а хитрости и фичи самой IDE), так и в их реализации (поэтому такие системы обычно закрытые и очень платные). Даже многими (включая меня) любимый DBeaver [8], флагман среди open sourse DB IDE, предоставляет поддержку NoSQL-решений (а какой проект сейчас обходится без них) только в своей Enterprise версии [9]. В добавок ко всему этому сохраняется неиллюзорный риск того, что поддержку какой-либо очень нужной и интересной функциональности СУБД можно не дождаться в скором времени, пока разработчики IDE не посчитают нужным ее впилить (а могут вообще не посчитать и не впилить).

В ответ на сложившуюся ситуацию сами пользователи зачастую не дожидаются пока появится нужная фича или поддержка новой СУБД, а решают поступающие проблемы самостоятельно и наиболее подходящим для себя и своего проекта способом. GitHub просто кишит такими решениями разной степени сложности. В основном это наборы sql-скриптов на все случаи жизни (dataegret/pg-utils [10], NikolayS/postgres_dba [11], gwenshap/Oracle-DBA-Scripts [12], ktaranov/sqlserver-kit [13], lestatkim/opensql [14]). Или консольные утилиты, такие, как top-подобные pg_activity [15] и pgcenter [16]. А также всевозможные web-based тулзы, начиная от вполне самостоятельных клиентов и средств мониторинга (pg_web [17], pg_hero [18]) и заканчивая, например, просто html-обертками над системными таблицами (pg_web_stats [19], pg_stats_viewer [20]). В результате чего складывается целый класс решений вида "programmers-for-programmers", "DBA-for-DBA", с помощью которых простые, и не очень, пользователи СУБД делятся своим опытом друг с другом непосредственно.

Everything as code

Похожая картина когда-то давным-давно наблюдались в области администрирования серверов и управления конфигурациями ПО. Тогда с постоянным появлением новых требований и технологий инфраструктура проектов стала заметно усложняться, резко увеличивалось количество серверов и софта, на нем работающего. А также появилась необходимость более частой, а затем и непрерывной поставки ПО с новыми бизнес-фичами заказчику. Существующие средства для конфигурирования и управления всем этим хозяйством плохо справлялись, в результате чего появился подход "Infrastructure as Code" и такие инструменты, как Ansible, Chef, Salt, Puppet и др., где конфигурирование инфраструктуры осуществляется на специальном DSL. Что даёт больше гибкости и свободы творчества. А код на таком DSL участвует в стандартном жизненном цикле наряду с основным кодом приложения (на Java, C#, Ruby или любом другом языке программирования), а именно — хранится в системе контроля версий (со всеми вытекающими — брэнчи, форки, code review), собирается в билды на сервере сборок, запускаются автоматические тесты и пр.

В дальнейшем влияние такого подхода стало заметно и в других областях:

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

Более подробную информацию на эту тему можно найти в докладе Александра Тарасова (aatarasoff [33]) "Everything as a Code" [34].

Database as code

А что на этот счет в бескрайнем мире баз данных? Набрав в Google простое словосочетание "Database as code [35]", я не нашел ничего интересного, кроме одного-единственного (но зато какого!) поста на DZone — "Database as Code: a Novel Concept [36]".

Мы много говорим о database-first подходе. Мы много говорим о том, что данные — это самый ценный актив предприятия. Но как насчет концепции, представленной Dan North [37] на третьем слайде его презентации [38]? Что если относиться к базе данных как к коду?

Звучит заманчиво, а на слайдах #5 и #6 (к сожалению, видео я не нашел) описываются 2 подхода к управлению схемой БД "через код" — через инкрементальные миграции (Liquibase, Flyway) и идемпотентные DDL-скрипты (Redgate [39]). Таким образом, схема — это тоже код, она находится под контролем VCS, собирается на билд-сервере, выполняются автоматические тесты и все такое.

Что нам необходимо, чтобы изменить наше мышление [40] в области работы с базами данных? Мы должны прекратить относиться к нашей БД как к магическому артефакту или как к уникальному сценарию и взглянуть на нее под тем же углом, что мы смотрим на обычный код нашего приложения.

Снова мощно сказано, у меня аж слезы на глазах наворачиваются. К сожалению, и в докладе, и в самом посте, "как код" рассматриваются только изменения схемы БД (миграция схем БД):

Мы относимся к исходному коду нашего приложения как к сокровищу. И это абсолютно верно, код — это сердце любого приложения. Но не должны ли изменения базы данных также находиться под управлением системы контроля версий, быть автоматизированными, быть готовыми к релизу по первому требованию и подчиняться "DevOps-законам", как и основной код?

Но минуточку...

БД — это не только схема!

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

А когда речь заходит о БД и языке запросов, то первым в голову приходит, конечно же, старый и добрый SQL. Но можем ли мы рассчитывать на него (а заодно и на реляционные БД, с которыми у большинства он плотно ассоциируется) сейчас и в ближайшем будущем, учитывая огромный рост спроса на NoSQL-решения?

"Ведь SQL уже всё? ..."

Вы можете справедливо меня спросить — о каком вообще SQL я тут разговариваю в эпоху NoSQL и schemaless databases, когда "пыльные реляционки доживают свой век исключительно в кровавом легаси Ынтерпрайзе". Ранний Хабр (как лакмусовая бумажка трендов в мире технологий) тоже когда-то был наполнен негативом по отношению к SQL и реляционкам и предвещал их скорейшую гибель (в скобках указаны количество голосов, а через слеш — количество комментариев):

Однако примерно с 12-года настроение на Хабре заметно меняется:

При этом анти-sql'ные и антиреляционные настроения продолжают иметь место, но реакция сообщества на них уже совершенно другая:

Подтверждение этих настроений можно найти в недавних докладах Константина Осипова (kostja [52]) "NewSQL: SQL никуда не уходит" [53] и Андрея Николаенко "Нереляционный SQL" [54]. Возьму на себя ответственность привести краткое резюме из обоих выступлений:

  • "SQL в NoSQL" — SQL (как это не странно) довольно комфортно чувствует себя и в NoSQL-среде. Практически во всех NoSQL базах есть возможность использовать какой-либо sql-подобный query language, как, например, CQL [55] в Cassandra и ScyllaDB, AQL [56] в Aerospike и N1QL [57] в Couchbase, а в некоторых и полноценный (или максимально приближенный к нему) ANSI SQL – как в Tarantool [58], ClickHouse [59] и CrateDB [60].
  • "SQL в облаках" — Облачные гиганты предоставляют поддержку самых разных SQL-хранилищ: Amazon RDS [61], Amazon Aurora [62], Oracle Cloud [63], Google Cloud SQL [64], Microsoft SQL Azure [65], Alibaba Cloud ApsaraDB [66], Yandex Managed Databases [67].
  • "SQL в BigData" — SQL давно и плотно влился в инфраструктуру Hadoop. В далеком 2009 году появился Hive [68] со своим HiveQL, а далее, год за годом, стали появляться решения, уже напрямую поддерживающие SQL — Impala [69] (2011), Spark [70] (2013), Kudu [71] (2014), Presto [72] (2015), Phoenix [73] (2017).
  • "SQL в Поточниках" — SQL стал практически стандартом для потоковых обработчиков данных: Flink [74], Samza [75], Storm [76], Apex [77], а с недавних пор еще и Kafka [78].
  • "SQL в NewSQL" — Многие современные СУБД активно развиваются в сторону NewSQL, где совмещают в себе преимущества как NoSQL, так и классических реляционных решений, включая широкую поддержку SQL (CockroachDB [79], FoundationDB [80], MemSQL [81]).

Нужно больше аргументов с картинками!

Дальше приведу еще немного аргументов, но если и так все понятно, то можно смело переходить к следующему параграфу.

История баз данных в "No-нотациях": [82]
Database as Сode. Копаем глубже - 2

Также в последнее время появляется много новых и модных СУБД, которые являются «надстройками» над известными и проверенными реляционными СУБД. Например Postgres-based (Timescale [83] и ToroDB [84]), MySQL-based (RadonDB [85]) и даже на базе sqllite (которая всегда позиционировалась как простая и надежная embedded-база) появился rqlite [86] – «легкое распределенное реляционное хранилище». Либо реализуют интерфейс какой-либо популярной базы (например, MySQL для InfiniDB [87] и TiDB [88]). Такой подход хорош тем, что при новой модели данных мы остаемся на той же привычной платформе, которую знаем как конфигурировать и администрировать.

Ну а для совсем уж "безсхемных" ребят тоже есть попытки создать общий универсальный язык "а-ля SQL", как, например, Eclipse JNoSQL [89], а точнее — его подпроект JNoSQL Aphrodite [90].

Google, который и является одним из родоначальников NoSQL-движения, также делает все больше акцентов на SQL. Сначала это был Spanner [91], а теперь активно развивается BigQuery [92]:
Database as Сode. Копаем глубже - 3

SQL-интерфейсами обзаводятся не только хранилища и обработчики данных. Например, с помощью osquery [93] (от самого Facebook) и fsql [94] на языке SQL можно получить много всякой полезной информацию из любой ОС или выполнять различные операции с файловыми системами.

Database as Сode. Копаем глубже - 4

В общем, SQL вполне комфортно себя чувствует в современных условиях, в том числе далеко за пределами реляционок. Практически с любым источником данных можно "поговорить" на SQL или SQL-like языке, получить нужную информацию о данных или метаданных хранилища и выполнять какие-либо операции (например, что-нибудь создать, удалить, запустить, остановить и пр.)

Здесь и далее (для удобства и с вашего разрешения) под "SQL" я буду подразумевать не только "тот самый" стандартный реляционный SQL, но и все его подвиды (в т.ч. далеко не реляционные), да и вообще любой встроенный в БД QL, с помощью которого можно сделать что-нибудь полезное.

К чему все это?

А к тому, что в далеком 92-м году появился замечательный ANSI-стандарт [95], согласно которому любая реляционная СУБД обязана уметь описывать свою внутреннюю структуру в специальной схеме — Information schema [96]. Т.о. с помощью стандартного языка запросов к служебным таблицам/представлениям можно получить метаданные любой БД — как в ней содержатся схемы, таблицы, индексы, колонки и пр. Но на самом деле одной схемой данных это не ограничивается, и таким же образом (пусть уже и за пределами стандарта) можно получить информацию о процессах, сессиях, планах выполнения запросов, дисковой подсистеме, утилизации памяти и еще много чего другого.

Несмотря на то, что этот стандарт появился почти четверть века назад и только для реляционных БД, почти все современные NoSQL и NewSQL базы тоже реализовывают что-то похожее. Например, в Cassandra есть сразу несколько системных схем [97] (а точнее keyspace'ов – system, system_auth, system_schema, system_traces), доступ к которым можно получить с помощью уже упоминавшегося CQL. В ClickHouse есть специальная схема «system» [98]. Разработчики из CockroachDB вообще замахнулись на реализацию стандартной information_schema [99]. И даже документный Mongo радует нас системными коллекциями [100].

При этом наблюдается постоянный рост количества и расширение таких системных представлений. Например, в Postgresql (как БД с одним из самых активных сообществ) помимо реализации самой information_schema, собственной схемы pg_catalog и pg_stat-представлений имеет несколько официальных расширений в виде преставлений pg_stat_statements [101] и pg_buffercache [102]. А также дополнительные сторонние представления, такие как pg_active_session_history [103], pg_store_plans [104] и pg_stat_kcache [105].

Практически любому узлу соответствует какая-либо системная таблица, которая отображает его структуру и/или состояние. То есть о своем внутреннем устройстве и состоянии БД может рассказать сама посредством своего языка запросов. Помимо этого многие СУБД предоставляет возможность с помощью своего языка запросов не только получить полезные метаданные, но и выполнять служебные операции — что-нибудь остановить, запустить, очистить, собрать статистику и пр. Так в некоторых СУБД команду "ALTER" можно применить не только к таблицам или колонкам, но и к другим объектам, например, к сессии ("alter session set sql_trace = true"), датафайлам ("alter tablespace add datafile") или системе целиком ("alter system kill session").

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

Вместо выводов и резюме

К сожалению, SQL уже давно и прочно воспринимается многими как язык "низкого уровня", некий "байт-код" для БД. Который не принято, а в некоторых обществах даже глубоко неприлично "писать руками" и вообще каким-либо образом контактировать с ним. Мы уже давно привыкли, что многочисленные DB-тулзы и фреймворки сами генерируют и выполняют за нас "хитрые и сложные" SQL-запросы к системе, и за этим процессом остается только наблюдать. Но давайте выйдем из зоны комфорта теплых ламповых графических интерфейсов и кодогенераторов и посмотрим на наши СУБД с точки зрения обычного кода. Тем более, что все необходимое для этого у нас есть.

Теперь по делу. Пользователи любой СУБД имеют возможность описать практически все аспекты работы со своей БД в виде кода, на простом, понятном и привычном многим языке. Это может быть не обязательно ANSI SQL, а любой SQL-like диалект, либо вообще свой собственный встроенный QL или API, в зависимости от используемой БД. Чем это полезно?

  • Не привязываясь к какому-либо инструменту, можно получить любую информацию о БД в нужном виде, либо выполнить любую операцию над БД;
  • Т.к. это все-таки обычный код, то и относиться к нему нужно как к любому другому "настоящему" коду. А именно, он должен быть понятен, структурирован и отформатирован по принятому стандарту, а также участвовать во всех этапах стандартного жизненного цикла кода — быть под контролем VCS, подвергаться Code review, участвовать в CI/CD pipeline'ах и пр. (а не "валяться" где-нибудь в папке под названием "SQL-tricks"). Что повысит его качество и ценность в команде.

Интересно ваше мнение на этот счет, пишите в комментариях — будем обсуждать.

В следующем посте я планирую на конкретных примерах проиллюстрировать описанные выше идеи, а также расскажу о том, как мы в КРОК пробуем применить их в экспериментальном графическом DB-manager'е с открытым исходным кодом, который разрабатывается в рамках одного из исследовательских проектов.

Автор: mgramin

Источник [106]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/database/296941

Ссылки в тексте:

[1] даже премьер-министрам: https://habr.com/post/365479

[2] Polyglot Persistence: https://martinfowler.com/bliki/PolyglotPersistence.html

[3] Проблемы DBA: Тренды в администрировании БД: https://www.quest.com/whitepapert/dbas-face-new-challenges-trend-in-database-administration-8130482/?param=Atii%2ffmTEZXy3nsJCa8V2slf6pUG3GyWRs4yK0H%2bV6eEA3JvCMN6imQzO6W2bLiUWqUKi%2bW%2fcZDlHt9xcpineQe34qfhI%2fxmFNM%2bR1Lye3mqBj%2bAUJ%2blCEyy6ElMpd0V9TsUl2jmB%2bus2JWKueJPKpfOTZwfIQIph%2fKKTtJodIaxNKDJEO78PNp9lNVT31hOyl1BapipycPunpxrcTDM8VtEfl%2bWl3gsXbaH2V5Dk24%3d

[4] EMS SQL Manager: https://www.sqlmanager.net/ru/products/manager

[5] Toad: https://www.quest.com/toad

[6] dbForge: https://www.devart.com/dbforge

[7] многих других: https://github.com/mgramin/awesome-db-tools#ide

[8] DBeaver: https://github.com/dbeaver/dbeaver

[9] только в своей Enterprise версии: https://dbeaver.com/edition

[10] dataegret/pg-utils: https://github.com/dataegret/pg-utils

[11] NikolayS/postgres_dba: https://github.com/NikolayS/postgres_dba

[12] gwenshap/Oracle-DBA-Scripts: https://github.com/gwenshap/Oracle-DBA-Scripts

[13] ktaranov/sqlserver-kit: https://github.com/ktaranov/sqlserver-kit

[14] lestatkim/opensql: https://github.com/lestatkim/opensql

[15] pg_activity: https://github.com/julmon/pg_activity

[16] pgcenter: https://github.com/lesovsky/pgcenter

[17] pg_web: https://github.com/sosedoff/pgweb

[18] pg_hero: https://github.com/ankane/pghero

[19] pg_web_stats: https://github.com/kirs/pg_web_stats

[20] pg_stats_viewer: https://github.com/nordicdyno/pg_stats_viewer

[21] Spock: http://spockframework.org

[22] Cucumber: https://cucumber.io

[23] Gatling: https://gatling.io

[24] Postman: http://blog.getpostman.com/2017/10/25/writing-tests-in-postman

[25] Jenkins pipeline: https://jenkins.io/doc/book/pipeline

[26] PlantUML: http://en.plantuml.com

[27] Graphviz: https://www.graphviz.org

[28] Mermaid: https://github.com/knsv/mermaid

[29] flowchart.js: https://github.com/adrai/flowchart.js

[30] DNSControl: https://github.com/StackExchange/dnscontrol

[31] OctoDNS: https://github.com/github/octodns

[32] reveal.js: https://github.com/hakimel/reveal.js

[33] aatarasoff: https://habr.com/users/aatarasoff/

[34] "Everything as a Code": https://youtu.be/_Zm8ORdNT0Y

[35] Database as code: https://www.google.ru/search?q=Database+as+code

[36] Database as Code: a Novel Concept: https://dzone.com/articles/database-as-code-a-novel-concept

[37] Dan North: https://twitter.com/tastapod

[38] презентации: https://speakerdeck.com/tastapod/arent-we-forgetting-someone?slide=1

[39] Redgate: https://www.red-gate.com/products/sql-development/sql-compare

[40] мышление: http://www.braintools.ru

[41] «MongoDB или как разлюбить SQL»: https://habr.com/post/74144

[42] «Точка сбора NoSQL»: https://habr.com/post/102532

[43] «Реляционные базы данных обречены?»: https://habr.com/post/103021

[44] «NoSQL базы данных: понимаем суть»: https://habr.com/post/152477

[45] «1000 раз подумать, прежде чем использовать noSQL»: https://habr.com/post/153859

[46] «NoSQL и Big Data – обман трудящихся?»: https://habr.com/company/jelastic/blog/166845

[47] «Почему вы никогда не должны использовать MongoDB» (+143/245): https://habr.com/post/231213

[48] «Почему SQL одерживает верх над NoSQL, и к чему это приведет в будущем»: https://habr.com/company/alconost/blog/340372

[49] "Нет, вам не нужно машинное обучение. Вам нужен SQL": https://habr.com/post/417581

[50] «Недостатки RDBMS или RDBMS vs NoSQL»: https://habr.com/post/236523

[51] «Не пора ли реляционным БД на свалку истории?»: https://habr.com/post/267079

[52] kostja: https://habr.com/users/kostja/

[53] "NewSQL: SQL никуда не уходит": https://youtu.be/_8OZcgOKUyk

[54] "Нереляционный SQL": http://www.highload.ru/2017/abstracts/3069.html

[55] CQL: http://cassandra.apache.org/doc/latest/cql/index.html

[56] AQL: https://www.aerospike.com/docs/tools/aql/

[57] N1QL: https://www.couchbase.com/products/n1ql

[58] Tarantool: https://tarantool.io/en/doc/2.0/tutorials/sql_tutorial

[59] ClickHouse: https://clickhouse.yandex/docs/en/query_language

[60] CrateDB: https://crate.io/docs/crate/reference/en/2.0/sql/index.html

[61] Amazon RDS: https://aws.amazon.com/ru/rds/

[62] Amazon Aurora: https://aws.amazon.com/ru/rds/aurora/

[63] Oracle Cloud: https://cloud.oracle.com/database

[64] Google Cloud SQL: https://cloud.google.com/sql/docs/

[65] Microsoft SQL Azure: https://azure.microsoft.com/ru-ru/services/sql-database/

[66] Alibaba Cloud ApsaraDB: https://www.alibabacloud.com/product/apsaradb-for-rds

[67] Yandex Managed Databases: https://cloud.yandex.ru/services/mdb

[68] Hive: https://hive.apache.org

[69] Impala: https://impala.apache.org

[70] Spark: https://spark.apache.org

[71] Kudu: https://kudu.apache.org/

[72] Presto: https://prestodb.io

[73] Phoenix: https://phoenix.apache.org/

[74] Flink: https://ci.apache.org/projects/flink/flink-docs-stable/dev/table/sql.html

[75] Samza: https://samza.apache.org/learn/tutorials/latest/samza-sql.html

[76] Storm: http://storm.apache.org/releases/current/storm-sql.html

[77] Apex: https://apex.apache.org/docs/malhar/apis/calcite/#sql-apis-for-apache-apex

[78] Kafka: https://www.confluent.io/blog/ksql-open-source-streaming-sql-for-apache-kafka

[79] CockroachDB: https://www.cockroachlabs.com

[80] FoundationDB: https://www.foundationdb.org/

[81] MemSQL: https://www.memsql.com

[82] История баз данных в "No-нотациях":: https://blog.jooq.org/2013/11/15/a-history-of-databases-in-no-tation

[83] Timescale: https://www.timescale.com

[84] ToroDB: https://www.torodb.com

[85] RadonDB: https://github.com/radondb/radon

[86] rqlite: https://github.com/rqlite/rqlite

[87] InfiniDB: http://infinidb.co

[88] TiDB: https://github.com/pingcap/tidb

[89] Eclipse JNoSQL: https://dzone.com/articles/using-domain-specific-language-to-manipulate-nosql

[90] JNoSQL Aphrodite: https://github.com/eclipse/jnosql-aphrodite

[91] Spanner: https://cloud.google.com/spanner

[92] BigQuery: https://ai.googleblog.com/2018/07/machine-learning-in-google-bigquery.html

[93] osquery: https://osquery.io

[94] fsql: https://github.com/kshvmdn/fsql

[95] ANSI-стандарт: https://en.wikipedia.org/wiki/SQL-92

[96] Information schema: https://en.wikipedia.org/wiki/Information_schema

[97] сразу несколько системных схем: https://docs.datastax.com/en/dse/6.0/cql/cql/cql_using/useQuerySystem.html

[98] специальная схема «system»: https://clickhouse.yandex/docs/en/system_tables

[99] реализацию стандартной information_schema: https://www.cockroachlabs.com/docs/stable/information-schema.html

[100] системными коллекциями: https://docs.mongodb.com/manual/reference/system-collections

[101] pg_stat_statements: https://www.postgresql.org/docs/current/static/pgstatstatements.html

[102] pg_buffercache: https://www.postgresql.org/docs/current/static/pgbuffercache.html

[103] pg_active_session_history: https://github.com/pgsentinel/pgsentinel

[104] pg_store_plans: https://github.com/ossc-db/pg_store_plans

[105] pg_stat_kcache: https://github.com/powa-team/pg_stat_kcache

[106] Источник: https://habr.com/post/333376/?utm_campaign=333376