nosql database На коленке
DESCRIPTION
Как скомбинировать Lucene.NET, LevelDB и Expression Tree Visitor в подобие базы данных.TRANSCRIPT
![Page 1: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/1.jpg)
NoSQL P2P DB на коленке
Часть 1: База данныхГлеб Лебедев, Netvox Lab 2013
для MongoDB UG
![Page 2: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/2.jpg)
Строим базу данных
Из чего состоит База Данных?
![Page 3: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/3.jpg)
Строим базу данных
Хранилище данных
![Page 4: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/4.jpg)
Строим базу данных
Хранилище данныхИндексы для
быстрого поиска
![Page 5: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/5.jpg)
Строим базу данных
Хранилище данныхИндексы для
быстрого поиска
Подсистема выполнения запросов и индексации
![Page 6: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/6.jpg)
Строим базу данных
Хранилище данныхИндексы для
быстрого поиска
Подсистема выполнения запросов и индексации
Подсистема синхронизации
![Page 7: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/7.jpg)
Строим базу данных
Хранилище данныхИндексы для
быстрого поиска
Подсистема выполнения запросов и индексации
Подсистема синхронизации
При
лож
ение
![Page 8: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/8.jpg)
Хранение данных
Минимально хранение данных реализуют базы типа “ключ→значения”
Key → Value
![Page 9: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/9.jpg)
Хранение данных
Специализированные хранилища
Например LevelDB
● New BSD License● Пакетная запись● Сжатие данных● Ключ и значение - массивы байт
Key → Value
![Page 10: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/10.jpg)
Хранение данных
Специализированные хранилища
Например LevelDB
● Нет запросов ● Нет индексов
Идеальный строительный блок для полноценной БД
Key → Value
![Page 11: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/11.jpg)
Хранение данных
Специализированные хранилища
Например LevelDB
● Нет запросов● Нет индексов
Идеальный строительный блок для полноценной БД
Key → Value
![Page 12: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/12.jpg)
Хранение данных
Не специализированные, например поверх реляционной БД
● Можно индексировать служебную информацию
● Транзакции SQL
ⱠKey Value Version LastModified ETag
![Page 13: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/13.jpg)
Индексация и Поиск
● Lucene / Lucene.NET○ Apache License 2.0○ Можно встраивать○ Быстро работает, требует мало памяти
● Sphinx○ GPLv2○ Отдельный сервер
![Page 14: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/14.jpg)
Индексация и Поиск
Lucene индексирует документы
{“Field1” -> [“Value1”]“Field2” -> [“Value2.1”,“Value2.2”]
}
![Page 15: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/15.jpg)
Индексация и Поиск
Lucene поддерживает запросы вида:
*:* MatchAllDocsQueryField:Value TermQueryField:[A to B] TermRangeQueryField:[1 to 10] NumericRangeQueryField:Val* PrefixQueryField1:A -Field2:B BooleanQuery
и другие ...
![Page 16: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/16.jpg)
Совмещаем индекс и хранилище
1. Серилизатор превращает объекты в коде в бинарный вид
Serializer
Key → Value
![Page 17: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/17.jpg)
Совмещаем индекс и хранилище
2. Конвертер делает из объектов в коде документы Lucene
Serializer
Key → Value
Document Converter
Lucene
![Page 18: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/18.jpg)
Совмещаем индекс и хранилище
3. Общая прослойка синхронизирует операции индексации и сохранения
Serializer
Key → Value
Document Converter
Lucene
Repository
![Page 19: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/19.jpg)
Совмещаем индекс и хранилище
Это становится похоже на БД. Только не хватает яызка запросов :)
Serializer
Key → Value
Document Converter
Lucene
Repository
![Page 20: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/20.jpg)
Формирование запросов
C# позволяет писать в коде выражениякоторые можно обрабатывать как деревья
λ
![Page 21: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/21.jpg)
Формирование запросов
C# позволяет писать в коде выражениякоторые можно обрабатывать как деревья
Expression<Func<Args, Doc, bool>> q =((a, d) => !string.IsNullOrEmpty(d.Value));
![Page 22: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/22.jpg)
Формирование запросов
Добавляем преобразователь деревьев выражений в код формирования запроса
QueryExpressionVisitorλ λ
![Page 23: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/23.jpg)
Формирование запросов
Пример запроса, который всегда возвращает true
QueryExpressionVisitor
(Document d, Arguments a)=>
true
(Document d, Arguments a)=>
new MatchAllDocsQuery()
![Page 24: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/24.jpg)
Формирование запросов
Пример запроса, который всегда возвращает true
QueryExpressionVisitor
![Page 25: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/25.jpg)
Формирование запросов
(Doc d, Args a)=>d.Value == a.MatchingValue
Que
ryE
xpre
ssio
nVis
itor
![Page 26: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/26.jpg)
Формирование запросов
(a,d) => a.MatchingValue == ”a” ? d.Value==”const1” : d.Value==”const2”
![Page 27: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/27.jpg)
Формирование запросов
(a,d) => a.MatchingValue == ”a” ? d.Value==”const1” : d.Value==”const2”
![Page 28: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/28.jpg)
Формирование запросов
(a,d) => d.Value==”const1” && d.Field1==”const2”
![Page 29: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/29.jpg)
Формирование запросов
(a,d) => d.Value==”const1” && d.Field1==”const2”
![Page 30: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/30.jpg)
Формирование запросов
(a,d) => d.Value==”const1” && d.Field1==”const2” && d.Field2 == “const2”
![Page 31: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/31.jpg)
Формирование запросов
(a,d) => d.Value==”const1” && d.Field1==”const2” && d.Field2 == “const2”
![Page 32: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/32.jpg)
Формирование запросов
Пример реального запроса из приложения
![Page 33: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/33.jpg)
Формирование запросов
Пример реального запроса из приложения
![Page 34: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/34.jpg)
Формирование запросов
Пример реального запроса из приложения
![Page 35: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/35.jpg)
Индекс, хранилище и поиск
Serializer
Key → Value
Document Converter
Lucene
Repository
Поисковые запросы
λ
![Page 36: NoSQL DataBase На коленке](https://reader034.vdocuments.mx/reader034/viewer/2022042512/548be8d7b47959d80c8b623e/html5/thumbnails/36.jpg)
Вопросы?(c)
2013