AlaSQL - SQL библиотека на JavaScript (выступление на PiterJS)Andrey Gershun
AlaSQL - это библиотека для обработки данных с помощью языка SQL, которая написана на JavaScript и может работать в браузере (в том числе, и в режиме WebWorker) или Node.js. Библиотека может быть использована в приложениях для обработки данных, а также для решения задач ETL (extract-transform-loading), таких как приложения бизнес-аналитики.
AlaSQL позволяет проводить сложные манипуляции с массивами данных (такие как группировки, сортировки, выборки, слияния) с помощью привычных выражений языка SQL. Встроенные процедуры импорта и экспорта данных в различных форматах (включая TXT, JSON, CSV, TSV, Microsoft Excel и Google Spreadsheets) предоставляют удобный интерфейс для импорта и экспорта прямо из SQL-выражений. Библиотека хорошо сочетается с такими современными фреймворками, как Angular.js, d3.js и Google Chars.
AlaSQL поддерживает совместимость по многим операторам со стандартным SQL и различными его диалектами, что позволяет переносить ранее разработанные процедуры для других баз данных. Специальные расширения синтаксиса SQL позволяют простым и удобным способом использовать все возможности, предоставляемые JavaScript, например, обработка JSON объектов из SQL выражений.
Для достижения высокого быстродействия AlaSQL написана с использованием сильно оптимизированного JavaScript и содержит несколько эвристик для сокращения времени обработки SQL выражений.
Alasql.js - SQL база данных на JavaScript / Андрей Гершун (МАГ КОНСАЛТИНГ)Ontico
AlaSQL - это библиотека для обработки данных с помощью языка SQL, которая написана на JavaScript и может работать в браузере (в том числе, и в режиме WebWorker) или Node.js. Библиотека может быть использована в приложениях для обработки данных, а также для решения задач ETL (extract-transform-loading), таких как приложения бизнес-аналитики.
Тезисы - http://frontendconf.ru/2015/abstracts/1713
AlaSQL - SQL библиотека на JavaScript (выступление на PiterJS)Andrey Gershun
AlaSQL - это библиотека для обработки данных с помощью языка SQL, которая написана на JavaScript и может работать в браузере (в том числе, и в режиме WebWorker) или Node.js. Библиотека может быть использована в приложениях для обработки данных, а также для решения задач ETL (extract-transform-loading), таких как приложения бизнес-аналитики.
AlaSQL позволяет проводить сложные манипуляции с массивами данных (такие как группировки, сортировки, выборки, слияния) с помощью привычных выражений языка SQL. Встроенные процедуры импорта и экспорта данных в различных форматах (включая TXT, JSON, CSV, TSV, Microsoft Excel и Google Spreadsheets) предоставляют удобный интерфейс для импорта и экспорта прямо из SQL-выражений. Библиотека хорошо сочетается с такими современными фреймворками, как Angular.js, d3.js и Google Chars.
AlaSQL поддерживает совместимость по многим операторам со стандартным SQL и различными его диалектами, что позволяет переносить ранее разработанные процедуры для других баз данных. Специальные расширения синтаксиса SQL позволяют простым и удобным способом использовать все возможности, предоставляемые JavaScript, например, обработка JSON объектов из SQL выражений.
Для достижения высокого быстродействия AlaSQL написана с использованием сильно оптимизированного JavaScript и содержит несколько эвристик для сокращения времени обработки SQL выражений.
Alasql.js - SQL база данных на JavaScript / Андрей Гершун (МАГ КОНСАЛТИНГ)Ontico
AlaSQL - это библиотека для обработки данных с помощью языка SQL, которая написана на JavaScript и может работать в браузере (в том числе, и в режиме WebWorker) или Node.js. Библиотека может быть использована в приложениях для обработки данных, а также для решения задач ETL (extract-transform-loading), таких как приложения бизнес-аналитики.
Тезисы - http://frontendconf.ru/2015/abstracts/1713
Доклад для XP Days Kiev 2013
"I will share our experience of development heavy enterprise database code with Agile methods using LiquiBase. We will meet pitfalls like Pl/Sql, Advanced MQ, triggers, database links, partitioned tables etc. Can really this stuff be developed with Agile process? Sure! I will show how we do it with LiquiBase, CI and TDD."
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Ontico
Индексы
- типы индексов;
- типы доступа к таблице;
- составные индексы (когда они работают);
- получение информации об индексе (show index; - описание формата);
- примеры с поиском по нескольким полям и сортировкой: какие индексы будут использоваться, а какие нет;
- что делать в случае нескольких условий по диапазону;
- как сервер выбирает индекс, который будет использован;
- директивы use/force/ignore index.
EXPLAIN
- как работает оптимизатор запросов;
- недостатки explain;
- explain extended;
- получение sql запроса, восстановленного из плана;
- формат выводимой explain информации:
-- что означает каждый столбец;
-- какие значения принимает (для extra только самые часто встречающиеся);
-- на что обратить внимание с точки зрения производительности;
-- как правильно читать план-разбор сложного примера с join-ами, подзапросами (обычными и from) и union-ами;
- новые возможности explain в последних версиях.
Практические примеры (исходный запрос, план, оптимизация, итоговый план) для разных случаев оптимизации:
1. добавление индексов;
2. эквивалентное изменение запроса: or --> union, подзапрос --> join;
3. разбиение запроса на несколько с сохранением промежуточных данных во временной таблице;
4. изменение структуры данных;
5. использование пользовательских переменных.
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)Ontico
В MySQL 5.7 появился целый ряд новых возможностей, позволяющих использовать MySQL в приложениях и как хранилище JSON-документов, и как реляционную базу данных.
В этом докладе мы расскажем о поддержке JSON в MySQL 5.7, а также поговорим о том, когда имеет смысл её использовать, и насколько хорошо она работает. Кроме того, мы остановимся на новом протоколе доступа к MySQL, поддерживающем SQL. Помимо этого, мы рассмотрим CRUD-операции и такие дополнительные функции, как асинхронная коммуникация и пайплайнинг (pipelining).
В заключительной части доклада мы расскажем о возможностях MySQL 5.7 в качестве хранилища документов.
React со скоростью света: не совсем обычный серверный рендерингTimophy Chaptykov
Расскажу о небольшом исследовании, в котором мы думали о том, можем ли мы себе позволить использовать React для отдельных элементов на сайте, как устроен серверный рендеринг в VK; и получилось ли связать одно с другим. Упомяну о строковых шаблонизаторах, виртуальной DOM и LR-парсерах.
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)Ontico
РИТ++ 2017, Backend Conf
Зал Кейптаун, 5 июня, 14:00
Тезисы:
http://backendconf.ru/2017/abstracts/2510.html
Я расскажу об опыте разработки REST API сервиса одной рекрутинговой платформы. Стремясь найти простое и масштабируемое решение, мы выбираем PostgreSQL и Node.js, а вместо сессий используем JWT-токены. Избегая ORM, мы пишем большие и сложные, но эффективные SQL-запросы. На помощь приходят SQL-представления, триггеры и небольшая собственная JS-библиотека.
...
Из презентации вы узнаете:
— как работает database/sql;
— интерфейс и реализации database/sql/driver;
— обзор популярных ORM и что с ними не так;
— как мы делали свой лучший ORM;
— и почему столько раз его переделывали.
Курс "Промышленное программирование на Java". Набор лекций 3. "Реляционные базы данных".
Модель предметной области. Подключение к РСУБД из Java.
Spring JDBC.
МФТИ, 2014 год. Лектор - Лаврентьев Федор Сергеевич
Доклад для XP Days Kiev 2013
"I will share our experience of development heavy enterprise database code with Agile methods using LiquiBase. We will meet pitfalls like Pl/Sql, Advanced MQ, triggers, database links, partitioned tables etc. Can really this stuff be developed with Agile process? Sure! I will show how we do it with LiquiBase, CI and TDD."
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Ontico
Индексы
- типы индексов;
- типы доступа к таблице;
- составные индексы (когда они работают);
- получение информации об индексе (show index; - описание формата);
- примеры с поиском по нескольким полям и сортировкой: какие индексы будут использоваться, а какие нет;
- что делать в случае нескольких условий по диапазону;
- как сервер выбирает индекс, который будет использован;
- директивы use/force/ignore index.
EXPLAIN
- как работает оптимизатор запросов;
- недостатки explain;
- explain extended;
- получение sql запроса, восстановленного из плана;
- формат выводимой explain информации:
-- что означает каждый столбец;
-- какие значения принимает (для extra только самые часто встречающиеся);
-- на что обратить внимание с точки зрения производительности;
-- как правильно читать план-разбор сложного примера с join-ами, подзапросами (обычными и from) и union-ами;
- новые возможности explain в последних версиях.
Практические примеры (исходный запрос, план, оптимизация, итоговый план) для разных случаев оптимизации:
1. добавление индексов;
2. эквивалентное изменение запроса: or --> union, подзапрос --> join;
3. разбиение запроса на несколько с сохранением промежуточных данных во временной таблице;
4. изменение структуры данных;
5. использование пользовательских переменных.
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)Ontico
В MySQL 5.7 появился целый ряд новых возможностей, позволяющих использовать MySQL в приложениях и как хранилище JSON-документов, и как реляционную базу данных.
В этом докладе мы расскажем о поддержке JSON в MySQL 5.7, а также поговорим о том, когда имеет смысл её использовать, и насколько хорошо она работает. Кроме того, мы остановимся на новом протоколе доступа к MySQL, поддерживающем SQL. Помимо этого, мы рассмотрим CRUD-операции и такие дополнительные функции, как асинхронная коммуникация и пайплайнинг (pipelining).
В заключительной части доклада мы расскажем о возможностях MySQL 5.7 в качестве хранилища документов.
React со скоростью света: не совсем обычный серверный рендерингTimophy Chaptykov
Расскажу о небольшом исследовании, в котором мы думали о том, можем ли мы себе позволить использовать React для отдельных элементов на сайте, как устроен серверный рендеринг в VK; и получилось ли связать одно с другим. Упомяну о строковых шаблонизаторах, виртуальной DOM и LR-парсерах.
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)Ontico
РИТ++ 2017, Backend Conf
Зал Кейптаун, 5 июня, 14:00
Тезисы:
http://backendconf.ru/2017/abstracts/2510.html
Я расскажу об опыте разработки REST API сервиса одной рекрутинговой платформы. Стремясь найти простое и масштабируемое решение, мы выбираем PostgreSQL и Node.js, а вместо сессий используем JWT-токены. Избегая ORM, мы пишем большие и сложные, но эффективные SQL-запросы. На помощь приходят SQL-представления, триггеры и небольшая собственная JS-библиотека.
...
Из презентации вы узнаете:
— как работает database/sql;
— интерфейс и реализации database/sql/driver;
— обзор популярных ORM и что с ними не так;
— как мы делали свой лучший ORM;
— и почему столько раз его переделывали.
Курс "Промышленное программирование на Java". Набор лекций 3. "Реляционные базы данных".
Модель предметной области. Подключение к РСУБД из Java.
Spring JDBC.
МФТИ, 2014 год. Лектор - Лаврентьев Федор Сергеевич
Scala-библиотека Slick прекрасно зарекомендовала себя как развитый и удобный инструмент работы с базами данных. Поддерживаются и простейшие текстовые SQL-запросы, и строго типизированные join’ы нескольких таблиц. Для построения запросов Slick предоставляет DSL, код на котором выглядит как обработка коллекций. Причем простые подзапросы могут использоваться для конструирования более сложных.
Slick имеет весьма любопытную внутреннюю архитектуру, которая делает возможным не только продвинутое использование, но и расширение библиотеки несколькими способами, о которых и пойдет речь в докладе.
(see also video: https://youtu.be/9n1zzwOGado)
Александр Русаков - TypeScript 2 in actionMoscowJS
В докладе речь пойдет об основных нововведениях TypeScript 2.0 и 2.1 (literal types, discriminated unions, mapped types...) и их использовании в реальных проектах.
Виктор Розаев - Как не сломать обратную совместимость в Public APIMoscowJS
Представьте что у вас есть публичный JavaScript API. Им пользуются сторонние девелоперы от Индии до Канады, чтобы писать свои облачные сервисы. Эти сервисы продают телекомуникационные компании с многомиллиардными оборотами превышающими стоимость вашей компании. Любая остановка сервиса - миллионные убытки. Представили? А нам и представлять не надо - это наша работа. Добро пожаловать в нашу реальность. В рамках доклада мы расскажем о том, как сохранить обратную совместимость при активном развитии и неизвестных пользователях, ну и причем тут вообще интерны.
Контекст в React, Николай Надоричев, MoscowJS 31MoscowJS
Контекст стал документированной фичей сравнительно недавно, но его использование либо осуждается, либо не понимается. Такие библиотеки как react-redux или react-router успешно используют для своих нужд. В докладе рассмотрим основные аспекты работы с контекстом: зачем он нужен и какие проблемы решает.
Верстка Canvas, Алексей Охрименко, MoscowJS 31MoscowJS
Зачем? Как и когда нужно создавать пользовательский интерфейс с помощью Canvas и как обогнать React Native - обо всем этом вы узнаете из этого доклада.
Команда разработчиков Angular2 провела огромную работу над Change Detector, он стал быстрым и "умным". В докладе рассмотрим две основные фазы Angular2 приложения, куда все таки делся $apply(), и почему Angular2 обещает быть фантастически быстрым (в сравнении с AngularJs).
Создание WYSIWIG-редакторов для веба, Егор Яковишен, Setka, MoscowJs 33MoscowJS
В 2016 году интернет-изданиям недостаточно просто писать интересные материалы, нужно быстро и качественно их оформлять и показывать на разных устройствах. Я расскажу о нашем опыте создания JS-редактора, с помощью которого ежедневно публикуются десятки постов для 3 миллионов читателей.
"Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter...MoscowJS
При увеличении количества проектов в компании, разработчики сталкиваются с задачей унификации кодовой базы. Решением подобной задачи может быть библиотека, фреймворк или общий набор компонент. Такой инструмент позволит разработчикам сконцентрироваться только на новых задачах, избежать дублирования кода и повысить производительность.
В HeadHunter с такой задачей столкнулись в 2014 году. Решением данной проблемы стало создание унифицированной библиотеки компонент, которая успешно используется на всех проектах HH. В своем докладе я хотел бы поделиться опытом развития библиотеки, проблемами, которые возникали при разработке, и их последовательным решением.
"Во все тяжкие с responsive images", Павел Померанцев, MoscowJS 29MoscowJS
Разработчики давно ищут способы оптимизации размера изображения без потери качества. Если вы готовы пуститься во все тяжкие, я расскажу как это сделать. Профит гарантирован!
"AMP - технология на три буквы", Макс Фролов, MoscowJS 29MoscowJS
Для большинства пользователей мобильный интернет полон боли и страданий. При том что пользователей становится только больше — проблема не решается, а становится острее. Вас ожидает увлекательнейший доклад о том, как удалось разогнать до космической скорости мобильную Lenta.ru.
"Доклад не про React", Антон Виноградов, MoscowJS 27
"Alasql.js — база данных SQL на JavaScript" — Андрей Гершун, MoscowJS 18
1. Alasql.js
база данных SQL
на JavaScript
Андрей Гершун
agershun@gmail.com
https://github.com/agershun/alasql
MoscowJS
29 января 2015 года
à la
SQL
1
2. 1. Что такое Alasql.js?
2. Примеры использования Alasql
3. Alasql изнутри
4. Оптимизация
“Alasql - à la SQL parce que le monde
entier envie notre belle langue”
Maxime Bertonnier, blogwebdev.fr
2
3. Ты помнишь, как
все начиналось…
lodash v3.0.0
_.sortByAll(collection, props)
3
4. Alasql.js – SQL на JavaScript?… Хм.
• Сложные SQL запросы и быстрая
обработка данных на клиенте:
• WHERE
• GROUP BY
• HAVING
• ORDER BY
• JOIN
• APPLY
• CSV, TAB, XLS, JSON
4
5. Применение
• Фронт-энд для Business
Intelligence приложений
• OLAP
• таблицы
• Client First
• мобильные приложения с
неустойчивой связью с сервером
5
6. Какие клиентские SQL базы данных
существуют для JavaScript?
• «Полноценные» SQL
• WebSQL (SQLite) – «вне стандарта» с 2011 года
• SQL.js (SQLite) – (1.5 Мб), Emscripten, небыстрый
• SequelSphere.js – закрытый код
• LINQ
• SQLike.js
• JSLinq.js и др.
• NoSQL
• IndexedDB
• Key-value хранилища
• PouchDB, ydn-db
• CrossFilter.js
6
9. Пример выполнения SQL-операторов
alasql('CREATE DATABASE TEST01;
USE TEST01;
CREATE TABLE jedi (
jediid INT,
name STRING
);
INSERT INTO jedi VALUES
(100, “Анакин Скайуокер")'
);
Перевод на JavaScript
var jedi = [];
jedi.pop({studentid: 100, name:‘Анакин Скайуокер'});
9
10. Пример SQL-запроса
var num = alasql('SELECT VALUE COUNT(*) FROM jedi');
Перевод на JavaScript
var num = jedi.length;
10
11. Реализованная функциональность SQL
• WITH SELECT TOP INTO FROM GROUP BY HAVING WHERE LIMIT FETCH
• SUM, COUNT, DISTINCT, MIN, MAX, FIRST, LAST
• ROLLUP(), CUBE(), GROUPING SETS()
• INNER LEFT RIGHT OUTER SEMI ANTI NATURAL CROSS JOIN
• UNION ALL EXCEPT INTERSECT
• CROSS OUTER APPLY
• Вложенные SELECT, EXISTS, ANY, SOME
• INSERT DELETE UPDATE
• CREATE DROP ATTACH USE DATABASE, SHOW DATABASES
• CREATE DROP TABLE, PRIMARY KEY, CREATE DROP VIEW
• IF ELSE WHILE BEGIN END
• DECLARE SET
• BEGIN COMMIT ROLLBACK TRANSACTION (ограничено)
• Стандартные функции, CAST/CONVERT
• a la LINQ (fluent interface)
11
12. Реализованная функциональность SQL
• ROLLUP, CUBE, GROUPING
SETS
• INNER LEFT RIGHT OUTER
SEMI ANTI NATURAL CROSS
JOIN
• CROSS OUTER APPLY
• Вложенные SELECT, EXISTS,
ANY, SOME
12
13. SQL и JavaScript – лучше вместе!
13
var data = [
[1,2,3],
[2,3,4],
[5,6,7]
];
var res = alasql('SELECT * FROM ?
WHERE [0] < ?',[data, 2]);
Перевод на JavaScript
var res = data.filter(function(d){return d[0] < 2});
14. Сколько строк нужно на JavaScript,
чтобы реализовать SQL запрос?
SELECT COUNT(*) FROM students
LEFT JOIN courses USING courseid
LEFT JOIN schools ON students.schoolid = schools.schoolid
WHERE courseid > 3
GROUP BY schools.schoolid, courses.courseid
ORDER BY courseid DESC, schoolid
Инструменты JavaScript:
• filter(), sort(), map(), reduce(), every(), some() … - непросто…
14
16. Работа с объектами и функциями JavaScript
var data = [
{a:{b:[1,2,3,4]},
{a:{b:[2014,2015]}}
];
alasql(‘SELECT a->b->length FROM ?’,[data]);
Результат: [4,2]
16
17. Загрузка данных из файлов в браузере,
Загрузка данных
с сервера
Загрузка данных
с десктопа
Экспорт данных
на десктоп
Источники данных:
• JSON
• CSV, TAB
• XLS, XLSX
• Google Spreadsheets
• HTML (тэг <table>)
17
20. Alasql для d3.js:
Олимпийские медали из Excel
20
alasql('SELECT '+axe+',
SUM([Gold Medals]) AS Gold,
SUM([Silver Medals]) AS Silver,
SUM([Bronze Medals]) AS Bronze
FROM "medals.csv"
GROUP BY '+axe+'
ORDER BY '+axe,[],function (data){
// data - выборка медали по заданной оси
});
25. Пример: Подготовка данных для Google
Maps из Slideshare.com
Данные
по
просмотрам
XLSX
(на сервере)
Гео данные
по странам
CSV
(в Интернете)
Данные
по
просмотрам
по странам
с указанием
широты
и долготы
Массив
JavaScript
slideshare.com
github.com
Google
Maps APIJOIN
25
26. SELECT countries.*, views.cnt
FROM (
SELECT Country, COUNT(*) AS cnt
FROM "all_latest_views_3m.csv"
GROUP BY Country
) AS views
JOIN (
SELECT *
FROM "https://abc.com/lat-long-countries.csv"
) AS countries USING Country
26
27. Alasql из консоли: Простой ETL
> node alacon “SELECT 2+2”
4
> node alacon “SELECT * INTO 'medals.csv'
FROM 'medals.xlsx' WHERE Year=2008”
27
28. SQL2: Alasql вместе с IndexedDB
(а также Local Storage, File Storage, SQL.js)
28
CREATE INDEXEDDB DATABASE IF NOT EXISTS geo;
ATTACH INDEXEDDB DATABASE geo;
USE geo;
DROP TABLE IF EXISTS cities;
CREATE TABLE cities;
SELECT * INTO cities FROM ?;
SELECT COLUMN *
FROM cities
WHERE population > 100000
ORDER BY city DESC
29. A la LINQ.
Текучий интерфейс ;)
var data = [{a:1,b:1},{a:2,b:-1},
{a:3,b:3},{a:1,b:5}];
var res = alasql(data).Top(2).GroupBy("a").exec();
29
30. Alasql в обычном режиме
<script src="alasql.min.js"></script>
<script>
var arr = [{a:1},{a:2},{a:1}];
alasql('CREATE TABLE one (a INT);
INSERT INTO one VALUES(10);
SELECT * INTO one FROM ?;
SELECT * FROM one',[arr], function(data){
// Выполняется в основном потоке
});
</script>
30
31. Alasql в Worker
<script src="alasql-worker.min.js"></script>
<script>
var arr = [{a:1},{a:2},{a:1}];
alasql('CREATE TABLE one (a INT);
INSERT INTO one VALUES(10);
SELECT * INTO one FROM ?;
SELECT * FROM one',[arr], function(data){
// Выполняется в основном потоке
});
</script>
31
32. Alasql изнутри
1. Лексер и парсер
• Jison
2. Интерпретатор
• Интерпретация «больших» операторов
(CREATE DATABASE, CREATE TABLE и др.)
3. Компилятор
• Компиляция «критичных по скорости»
операторов SELECT/INSERT/UPDATE/DELETE
32
33. Оптимизация запросов
SELECT SUM(test1.one), test1.two, test2.three
FROM test1
JOIN test2 ON test1.two = test2.two
WHERE test1.one > 5
GROUP BY test1.two, test2.three
ORDER BY three, sumone
33
35. Оптимизация SQL
• Анализ JOIN и WHERE выражений и преиндексация
FROM one
JOIN two USING e
JOIN three ON two.a = three.a+1 AND two.b = three.c+three.d
WHERE two.a > 10 AND three.c > 20
• Как сократить пробег?
• one.length x two.length x three.length
• Оптимизиация
• two.e - индекс (хэш) для demo.e
• (three.a+1) +’#’+ (three.c+three.d) – индекс для (two.a) +’#’+ (two.b)
• two.a > 10 – префильтрация массива one
• three.c > 20 – префильтрация массива two
35
36. Компиляция критических операций
(SELECT, WHERE, ORDER BY, GROUP BY, HAVING, INSERT, DELETE, UPDATE):
SELECT * FROM data ORDER BY alpha, beta
var orderfns = “
if(a.alpha>b.alpha) {return 1; else if(a.alpha==b.alpha) return 0;
if(a.beta>b.beta) {return 1; else if(a.beta==b.beta) return 0;
}}
return -1;”;
var orderfn = new Function(‘a,b’, orderfns);
var data = data.sort(orderfn);
36