СУБД-строительные верфи
Всем Привет,
Скоро начну имплементировать движок аналитических запросов для СУБД похожей на Монго. Возник непростой вопрос. Что использовать ? Подход Монго с его Aggregate Framework или SQL подход.
UPD:
Большинство комментариев отдало предпочтение SQL.
Плюсы
1. Его знают достаточно много людей. Это дефакто стандарт.
2. Он декларативный, а значит имеет достаточно большую гибкость в случае оптимизатора запросов.
Минусы
1. Плохо (или неочевидно) ложится на Json документы.
Как я попытался обойти последний минус. Лучше рассмотреть на примере. Предположим у нас есть коллекция Person, а в ней простые джисон документы следующего вида.
{
"Name": "John",
"Profession": "Lawyer",
"Address": {
"Street": "MyStreet",
"HouseNumber": 10
},
"Childrens": [
{
"Name": "Bob",
"Age": 5
}
]
}
Простейший пример, отискать все документы где «Profession» = «Lawyer».
SELECT DocID, Name, Profession
FROM Person
WHERE Profession = "Lawyer"
ORDER BY Name
DocID здесь — это служебная колонка, которая автоматически добавляется и содержит внутреннее айди документа в субд.
Как видим, проблема с простейшим запросом в том, что мы можем выбрать только атрибуты верхнего уровня в json. Чтобы научить наш SELECT работать с вложенными секциями документа, нам нужно указать путь к вложенной секции. Этот оператор получает первым параметром имя таблицы, а вторым параметром путь к секции.
Давайте получим все адресса со всех документов.
SELECT DocID, Street, HouseNumber
FROM Person.Address
И получим всех Childrens со всех документов.
SELECT DocID, Name, Age
FROM Person.Childrens[]
Теперь у нас есть 3 таблицы. Первая таблица у нас возвращает всех Person. Вторая все Address, а третья всех Childrens. Теперь все что нам нужно, заджойнить эти три таблицы и пазл сошелся.
SELECT *
FROM Person p
INNER JOIN Person.Address a ON p.DocID = a.DocID
INNER JOIN Person.Childrens[] c ON p.DocID = c.DocID
WHERE p.Name = "John" AND c.Age = 5
По-моему получился достаточно локаничный синтаксис. Хватило всего одного приема чтобы подружить SQL и Json.
144 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів