2. Gartner Magic Quadrant СУБД - 2014
Gartner Magic Quadrant for Operational Database Management Systems,” by analysts Donald Feinberg, Merv Adrian, and
Nick Heudecker, October 2014
10. • Работа через поиск значений по
заданному скалярному ключу
• Нет структуры и отношений
• Доступ к данным только через
первичный ключ
• Быстрые и легко масштабируемые
Базы данных «ключ-значение»
Redis CachéHadoop
11. • Используют структуры типа графа с
узлами, где связи представляют
отношения
• Определенные операции значительно
проще реализовать – социальные сети
• Справляется со сложными схемами
отношений.
«Графовые» базы данных
Redis CachéHadoopNeo4j TitanOrientDB
12. • Простой способ хранения коллекций из
1 или более пар «ключ-значение»,
подходящих записи.
• Данные логически относящиеся к
одной записи, но не используемые
вместе, хранятся отдельно.
• Версионирование строк и/или
значений.
«Колоночные» базы данных
13. • Можно запрашивать определенные
атрибуты данных, пропуская
нерелевантные данные строка за
строкой.
• Хорошее масштабирование данных.
«Колоночные» базы данных
Redis CachéHadoopSybaseIQ HypertableCassandra
HBase
14. • Работают похоже на «ключ-значение»
• Позволяют более глубокое вложение и
сложные структуры.
• Возможно сохранить структуры любой
сложности.
«Документные» базы данных
Mongo
Couch RethinkDBOrientDB
Caché
15. • Значение, сохраняемые в базе имеют
структуру: XML, JSON, BSON
• Самое важное, что чаще всего
документные базы используют JSON
структуры данных, удобные для
применения в JavaScript.
«Документные» базы данных
16. • JSON – сокращение “JavaScript Object
Notation”
– Синтаксис, позволяющий представлять данные и
подразумеваемую модель данных
– Текстовое представление структур данных
JavaScript (вложенные массивы, вложенные
объекты, и т.д.)
JSON
17. • Модель данных в первую очередь
основанная на объектах и массивах.
– Объект JSON – 0 и более пар «ключ-значение»,
заключается в фигурные скобки { }
– Массив JSON – упорядоченная
последовательность 0 и более значений,
заключается в квадратные скобки []
JSON
21. Хранение реляционных данных
RIT.Sample
+Name: String
+Address: RIT.Address
+Spouse: RIT.Sample
RIT.Address
+City: String
+State: String
highload.SampleD(1)={"Isaksen,Ashley F.",{"Moscow",“N/A“},10}
highload.SampleD(2)={"Eagleman,Umberto H.",{“Cambridge","MA“},20}
highload.SampleD(3)={"Lepon,Quigley I.",{“Boston","MA“},9}
highload.SampleD(4)={"Quine,Usha S.",{“Boston","MA“},15}
…
select * from hse.Sample
ID Name Spouse Home_City Home_State
1 Isaksen,Ashley F. 10 Moscow N/A
2 Eagleman,Umberto H. 20 Cambridge MA
3 Lepon,Quigley I. 9 Boston MA
4 Quine,Usha S. 15 Boston MA
22. В рамках модели данных Caché
реляционные данные –
семантически эквивалентны
объектам
Классы = Таблицы
24. Не является ли XML проекция таким же
видом сериализации как и JSON?
Но…
25. “At the March 11-12 2014 INCITS DM32.2
(Databases) meeting, DM32.2 voted to submit
two SQL/JSON proposals for the June 2014
meeting of ISO/IEC JTC1 SC32 WG3 (Database
Languages).”
• WG3:PEK-028 (DM32.2-2014-00024r1)
SQL/JSON part 1
• WG3:PEK-029 (DM32.2-2014-00025r1)
SQL/JSON part 2
JSON приходит в SQL standard
27. Храня любую топологию дерева
объектов…
• Caché будет поддерживать JSON
нативно, конвертирую любое
представление из/в JSON в/из
динамические объекты.
• JSON – не является форматом хранения
– JSON и XML – только форматы сериализации;
– Гибкость в поддерживаемых форматах при
сохранении эффективности в хранении
Поддержка JSON
28. • Будет поддерживать операции CRUD
(Create, Retrieve, Update, Delete)
• Документы сохраняются в
персистентные коллекции документов.
• Caché – контейнер для хранения
коллекций
Caché как документная БД
29. • БД это документ, содержащий массив
коллекций.
• Коллекция определяет контейнер для
документов, индексов документов, и
метаданных о множестве документов из
данной коллекции
Коллекция
30. • Нет требования, чтобы документы в
коллекции разделяли общую
структуру, но обычно это так.
• Коллекции документов начинают
сохраняться когда первый документ
вставляется в коллекцию.
Коллекция
31. В Caché DocumentDB JSON объекты
создаются при помощи следующих
классов*
JSON – динамические объекты
##class(%Object).%New()
##class(%Array).%New()
##class(%Vector).%ParseJSON()
*Могут измениться в окончательной версии
33. • Не вводят новых типов данных в SQL
• JSON документы хранятся как значения
строчного типа, например,VARCHAR,
CLOB, VARBINARY, или BLOB и т.п.
JSON расширения в SQL
CREATE TABLE employees (
emp_id INTEGER,
department INTEGER,
emp_json VARCHAR (5000)
)
34. • Создаются документы JSON из
результатов SQL запросов, типа:
– JSON_OBJECT
– JSON_OBJECTAGG
– JSON_ARRAY
– JSON_ARRAYAGG
JSON расширения в SQL
35. • Запрос возвращает строку каждого
отдела записанного в таблице DEPTS;
• Строка содержит колонку, в которой
JSON объект сериализован, и содержит
номер отдела и название
JSON_OBJECT
SELECT
JSON_OBJECT( 'deptno' : deptno, 'deptname' :
deptname )
FROM depts
{ "deptno" : 314,"deptname" : "Engineering" }
36. • В качестве результата запроса будут
возвращены 4 строки, по две колонки
в каждой
JSON_OBJECTAGG
SELECT job_seq,
JSON_OBJECTAGG( job_attrib, job_attval RETURNING VARCHAR(80)
) AS attributes
FROM jobs
101 { "Leader" : "155566", "Duration" : "00:30:00", "Description"
: " Design the new tables for the web site " }
234 { "Duration" : "01:00:00", "Description" : "Load the tables
with existing data" }
492 { "Leader" : "129596" }
17 { "Description" : " Design the look-and-feel of the web site"
37. • В результате запрос возвращает JSON
массив с 0 и более элементов
JSON_ARRAY
SELECT JSON_ARRAY( 'deptno', deptno, 'deptname',
deptname ) FROM depts
[ "deptno", 314, "deptname", "Engineering" ]
38. • Агрегатная функция, создает JSON
массив с 0 и более элементов, из строк
группированного запроса
JSON_ARRAYAGG
SELECT emp_id, JSON_ARRAYAGG(number) AS
numbers
FROM phones GROUP BY emp_id
123 ["555-1234", "555-9876", "555-4455"]
39. • Встроенные SQL функции для запроса
по JSON данным
– JSON_TABLE: возвращает SQL таблицу
– JSON_QUERY: возвращает строчное SQL
значение, которое соответствует JSON объекту
или JSON массиву
– JSON_VALUE: возвращает скалярное SQL
значение
SQL расширения для JSON данных
40. • Доступны новые предикаты по JSON
данным
– IS JSON
– JSON_EXISTS
SQL расширения для JSON данных
42. • $MethodName
• Новый синтаксис для инициализации
JSON литералов
• Встроенные выражения
Как сделать работу с JSON лучше?
Set array = [ 1,2,3,4 ]
Set array = [ 1,x,y*2,"string",x_","_y ]
Set object = { "forename":"Joe", “surname”:"Blogs" }
Set array = [ (a]b) , (a]]b) ]
Set array = [ 1, { “name”: forename_" "_surname }, val**2, { “var”: [ 1,
x*y ] } ]
Set object={ “name”: forename_" "_surname, “sub”: [ { “var”: "val" }, 5,
(a]b) ] }
Do ..Method([1,2,3], { “var”: "val" })
43. set topTen =
##class(%Array).$new()
set player =
##class(%Object).$new()
set player.Rank = 1
set player.FirstName =
"Novak"
set player.LastName =
"Djokovic"
set player.Country = "Serbia"
set player.Points = 13165
set grandSlams =
##class(%Array).$new()
set slam =
##class(%Object).$new()
set slam.Wimbledon = 2
do grandSlams.$push(slam)
set slam =
##class(%Object).$new()
set slam.USOpen = 1
do grandSlams.$push(slam)
set slam =
##class(%Object).$new()
set slam."Australian Open" =
5
do grandSlams.$push(slam)
set player."Grand Slams" =
grandSlams
set player.DOB =
$zdth("05/22/1987")
do topTen.$push(player)
Встроенный JSON
set topTen = [{"Rank":1, "FirstName":
"Novak", "LastName": "Djokovic", "Country":
"Serbia", "Points": 13165, "Grand Slams":
[{"Wimbledon":2},{"USOpen":1}, {"Australian
Open":5}],"DOB": $zdth("05/22/1987")}]
47. Модели данных в Caché
Многомерное API глобалов
Relational
SQL
ODBC
JDBC
Object
ActiveX
.NET
Java
C++
Multi-Value
MVBasic
Hierarchical
Caché
ObjectScript
DocumentDB
DocDB
Graph
Globals
Graph API
52. BW-Tree
Page P
PID Physical
Address
P
Mapping Table
Δ: Insert record 50
Δ: Delete record 48
Δ: Update record 35
“Consolidated” Page P
“The BW-Tree: A B-tree for New Hardware Platforms”,
Justin Levandoski, David Lomet, Sudipta Sengupta,
Microsoft Research
55. B*-tree
Block 3 Type 9 global dir.
Offset 684, link 0
^A 45
^C 44
^FCE.BranchD 40
…
Block 44, Type 66 top pointer, link 0
^C 47 ^C(5446,50,"") 46
Block 47, Type 6 bottom pointer, link 46
^C 286 ^C(9,52,"g") 288 … 865 ^C(5436,46,"w") 866
Block 46 Type 6 bottom pointer , link 0
^C(5446,50,"") 867 … 1345 ^C(9996,46,"w") 1346
Block 286, Type 8 data
link 288
^C
^C(1) skirt,rodeo
^C(1,46) 10$
^C(1,46,black) 1
…
^C(9,52,blue) 15
Block 288, Type 8 data
link 289
^C(9,52,green) 9
^C(9,52,red) 12
^C(9,52,white) 12
^C(9,52,yellow) 19
…
^C(17,58,red) 19
Block 1346, Type 8 data
link 0
^C(9996,46,white) 10
^C(9996,46,yellow) 12
^C(9996,48) 15$
^C(9996,48,black) 1
…
^C(10000,58,yellow) 15
… …
56. Intersystems Caché – мультимодельная
платформа БД …
• Иерархическое хранилище B*-tree
поддерживает как объектный,
реляционный, так и множество NoSQL
видов доступа (key-value, document) …
Итак…