Представьте, что вы можете использовать объектно-цепочечные операторы и операции без несоответствия между СУБД и ООП ; представьте слабую связь между СУБД и API; подумайте о клиенте базы данных API, который больше похож на мост для извлечения или передачи данных. Можете ли вы представить себе действительно API базы данных NoSQL?
Вступление
За десятилетие исследований систем NoSQL я заметил огромные усилия многих поставщиков по созданию SQL-совместимых API. Да, за этой тенденцией к отраслевой линии есть довольно веская причина. Все научились программировать на SQL, и все знают, как получить доступ к СУБД с помощью SQL.
Что ж, я думаю, что после пятидесяти лет работы СУБД на основе SQL должен быть лучший подход, чтобы завоевать признание программиста, но, похоже, никому не удалось достичь такой масштабной цели. Никто не осмеливается предложить что-то другое для лучшего решения, и даже те немногие, кто пробовал что-то другое (на ум приходят язык Apache Tinkpop-Gremlin , GraphQL и Cypher ), не смогли убедить большинство ИТ-пользователей перейти подключается к предлагаемой среде запросов. Другие были более радикальны в своем подходе и даже вообразили подключенную семантическую сеть, но когда они разработали свой язык запросов, SPARQL , он выглядел очень похожим на SQL, и даже его аббревиатура напоминает нам SQL.
Я могу начать писать много причин, почему все эти подходы не достигли консенсуса для большинства ИТ-пользователей. Я мог бы также привести ряд фактов о том, почему отрасль и несколько консорциумов продолжают использовать SQL в качестве своего любимого языка запросов к СУБД. Но в этой статье я хотел бы, чтобы вы сфокусировались на очень конкретном моменте, и, возможно, я смогу поделиться своим воображением о том, как можно по-разному получить доступ к СУБД; с большей гибкостью, чем SQL; без потери комфорта вашего языка программирования или препятствий в SQL; и самое главное, зарабатывая при этом интерес и уважение разработчиков.
Вам также могут понравиться: NoSQL против SQL: объяснения различий
Два подхода к парадигме программирования для API-интерфейса NoSQL
Что такое SQL? Это предметно-ориентированный язык, разработанный специально для управления данными в реляционной СУБД, хотя многие сторонники реляционной теории правильно утверждают, что эти СУБД не следуют реляционным принципам Кодда. Но это еще одна важная история, которую нужно рассказать в другой раз.
Недавно, в последнее десятилетие, графовые базы данных стали очень популярными, но, что интересно, многие крупные поставщики расширили язык SQL, чтобы охватить обход графов и другие связанные операции. Столбчатые базы данных, другой очень успешный тип NoSQL, также следовали той же тактике в отношении языка запросов. Поэтому, хотя модель данных и реализация на физическом уровне могут сильно различаться, SQL пытается создать искусственное единство.
Но опять же, SQL зависит от предметной области, запускается как модель данных и остается декларативным языком запросов. Главный вопрос — что происходит на стороне API, то есть на стороне языка программирования, и именно здесь происходят все интересные, специфические вещи. Как именно вы подключаетесь к серверу СУБД и какой драйвер СУБД используется для передачи данных? Насколько хорошо объекты соответствуют объектам и атрибутам в вашей СУБД, изменениям схемы и объектной модели, обнуляемой и частичной загрузке полей-атрибутов, персистентности, состояния, параллелизма и кэширования объектов? Для поклонников ООП и других, то, что я кратко описал, известно как проблема несоответствия объектно-реляционного импеданса , Вьетнам компьютерных наук . И не заблуждайтесь: это все еще «Вьетнам».
Цепные операторы и операнды
ООП, пожалуй, самая популярная парадигма программирования. все же из-за магического заклинания SQL все должно было быть сжато в табличной форме, используя один ORM или другой. Но за все эти годы моих личных исследований и разработок я заметил одну особенность этих API-интерфейсов ORM, которая связана с используемым подходом поиска данных. Здесь есть три основные тенденции: Query-By-Example (QBE) — предшественник GraphQL, Query-By-API (QBA) — предшественник Gremlin и Query-By-Language (QBL), где классифицируются все языки запросов, подобные SQL. , GQLне исключение Практический опыт разработчиков показал, что некоторые сложные запросы, особенно с объединениями, было труднее представить в QBA и QBE, и еще раз SQL снова выиграл эту битву. Но неудивительно, что сторонники технологии графовых баз данных лишь частично коснулись несоответствия объектно-реляционного импеданса. Это требует более глубокого архитектурного проектирования и многоперспективного подхода, чем только сравнение того, насколько хорошо узлы графа соответствуют объектам класса.
Итак, это было честное сражение между QBA и QBL? Ответ отрицательный из-за существующего доминирования SQL в СУБД и имитации операций объединения SQL. Вот где воображение входит в игру. Представьте себе, что вы можете использовать операции с цепочками объектов, используя метод проектирования интерфейса , или QBA, без несоответствия между СУБД и ООП, то есть представьте слабую связь между СУБД и API, представьте, что клиент базы данных API больше похож на мост для выборки или передавать данные. Метод объединения операторов запросов действительно многообещающий, он может выиграть второй раунд бокса с SQL. Я кратко объясню почему.
ООП основан на концепции объектов, которые могут обмениваться сообщениями и изменять их внутреннее состояние. Поэтому такой свободный интерфейс очень естественен для языков ООП. С другой стороны, самые сложные запросы можно визуализировать и обрабатывать как конвейер данных. Мой вопрос к тем, кто разрабатывает GQL , следующий международный стандарт языка запросов, почему вы продолжаете придерживаться тупикового декларативного подхода? Разве не было бы более естественным и привлекательным для пользователей следовать методологии конвейера данных путем стандартизации операндов и операций? Существует множество веских доказательств того, что это не предположение. Вспомните приведенную выше ссылку на TinkerPop-Gremlin, а в Python есть очень популярная библиотека анализа данных Pandas (23621 запускается на GitHub).
Функциональные операции
Говоря о языках программирования, какова другая очень конкурентоспособная парадигма в разработке программного обеспечения? Возможно, это функциональный, но функциональные требования для такого API более неясны. Но такой API существует на одном из самых мощных функциональных языков программирования в ИТ-индустрии, Mathematica. Посмотрите, как тщательно они разработали функции языка Wolfram для операций с базами данных над наборами данных и вычислений со структурированными наборами данных, и насколько они идеально подходят для многих других функций того же языка.
Взгляд из будущего
Достаточно сказано; разработка программного обеспечения — не теоретическая вещь, она основана на практике. Я приведу вам пример. Одним из недостатков SQL является то, что у вас нет прямого доступа к управлению информацией из словаря данных, так как СУБД обрабатывает это более или менее автоматически. Gartner недавно сообщила, что инструменты качества данных и интеграции данных включают каталоги данных. Это, безусловно, шаг в правильном направлении, и вам необходим API запросов, способный управлять как данными, так и метаданными, используя единый подход.
Рассмотрим следующий фрагмент кода в Python:
Первая команда демонстрирует выборку метаданных с использованием цепных методов Python ООП:
питон
xxxxxxxxxx
1
mis.get(221)
2
.get_fields
3
.over(select='nid, dim4, dim3, dim2, cname, alias, ntype, ctype, counter')
4
.to_dataframe(index='dim4, dim3, dim2').out()
5
Out[18]:
7
nid cname alias ntype ctype counter
8
dim4 dim3 dim2
9
1 605 7 227 Duration NA FLD CSV 0
10
8 228 Start date NA FLD CSV 0
11
9 229 End date NA FLD CSV 0
12
10 230 Start station number NA FLD CSV 0
13
11 231 Start station NA FLD CSV 0
14
12 232 End station number NA FLD CSV 0
15
13 233 End station NA FLD CSV 0
16
14 234 Bike number NA FLD CSV 0
17
15 235 Member type NA FLD CSV 0
Вторая команда демонстрирует выборку метаданных с использованием функционального подхода:
питон
xxxxxxxxxx
1
mis.get(nid=221,
2
what='fields',
3
select='nid, dim4, dim3, dim2, cname, alias, ntype, ctype, counter',
4
index='dim4, dim3, dim2', out='dataframe')
5
Out[19]:
7
nid cname alias ntype ctype counter
8
dim4 dim3 dim2
9
1 605 7 227 Duration NA FLD CSV 0
10
8 228 Start date NA FLD CSV 0
11
9 229 End date NA FLD CSV 0
12
10 230 Start station number NA FLD CSV 0
13
11 231 Start station NA FLD CSV 0
14
12 232 End station number NA FLD CSV 0
15
13 233 End station NA FLD CSV 0
16
14 234 Bike number NA FLD CSV 0
17
15 235 Member type NA FLD CSV 0
И третья команда демонстрирует выборку данных, используя снова функциональный подход
питон
xxxxxxxxxx
1
mis.get(221, what='data', out='dataframe', limit=5, offset=1000)
2
Out[20]:
4
534 2012-04-01 10:29:06 2012-04-01 10:38:00 31113 Columbia Rd & Belmont St NW 31201 15th & P St NW W00663 Member
5
0 1937 2012-04-01 10:29:07 2012-04-01 11:01:25 31202 14th & R St NW 31621 4th & D St NW / Judiciary Square W00692 Casual
6
1 470 2012-04-01 10:29:17 2012-04-01 10:37:08 31104 Adams Mill & Columbia Rd NW 31200 Massachusetts Ave & Dupont Circle NW W00020 Member
7
2 727 2012-04-01 10:29:30 2012-04-01 10:41:38 31103 16th & Harvard St NW 31200 Massachusetts Ave & Dupont Circle NW W00880 Member
8
3 1144 2012-04-01 10:29:59 2012-04-01 10:49:03 31110 20th St & Florida Ave NW 31236 37th & O St NW / Georgetown University W00681 Casual
9
4 1698 2012-04-01 10:30:09 2012-04-01 10:58:27 31107 Lamont & Mt Pleasant NW 31610 Eastern Market / 7th & North Carolina Ave SE W01154 Member
эпилог
Я уверен, что тем немногим там не сложно представить и даже реализовать лучшее решение, чем SQL. На самом деле, как я уже упоминал в этой статье, это частично существует. Но, безусловно, гораздо сложнее и труднее представить, как может быть более продуктивным, эффективным и инновационным для работы с действительно NoSQL API. Следите за следующей версией проекта TRIADB, и, кто знает, вы можете быть уверены, что это действительно уникальный и ценный инструмент и технология для использования.