nosql database На коленке
DESCRIPTION
Как скомбинировать Lucene.NET, LevelDB и Expression Tree Visitor в подобие базы данных.TRANSCRIPT
NoSQL P2P DB на коленке
Часть 1: База данныхГлеб Лебедев, Netvox Lab 2013
для MongoDB UG
Строим базу данных
Из чего состоит База Данных?
Строим базу данных
Хранилище данных
Строим базу данных
Хранилище данныхИндексы для
быстрого поиска
Строим базу данных
Хранилище данныхИндексы для
быстрого поиска
Подсистема выполнения запросов и индексации
Строим базу данных
Хранилище данныхИндексы для
быстрого поиска
Подсистема выполнения запросов и индексации
Подсистема синхронизации
Строим базу данных
Хранилище данныхИндексы для
быстрого поиска
Подсистема выполнения запросов и индексации
Подсистема синхронизации
При
лож
ение
Хранение данных
Минимально хранение данных реализуют базы типа “ключ→значения”
Key → Value
Хранение данных
Специализированные хранилища
Например LevelDB
● New BSD License● Пакетная запись● Сжатие данных● Ключ и значение - массивы байт
Key → Value
Хранение данных
Специализированные хранилища
Например LevelDB
● Нет запросов ● Нет индексов
Идеальный строительный блок для полноценной БД
Key → Value
Хранение данных
Специализированные хранилища
Например LevelDB
● Нет запросов● Нет индексов
Идеальный строительный блок для полноценной БД
Key → Value
Хранение данных
Не специализированные, например поверх реляционной БД
● Можно индексировать служебную информацию
● Транзакции SQL
ⱠKey Value Version LastModified ETag
Индексация и Поиск
● Lucene / Lucene.NET○ Apache License 2.0○ Можно встраивать○ Быстро работает, требует мало памяти
● Sphinx○ GPLv2○ Отдельный сервер
Индексация и Поиск
Lucene индексирует документы
{“Field1” -> [“Value1”]“Field2” -> [“Value2.1”,“Value2.2”]
}
Индексация и Поиск
Lucene поддерживает запросы вида:
*:* MatchAllDocsQueryField:Value TermQueryField:[A to B] TermRangeQueryField:[1 to 10] NumericRangeQueryField:Val* PrefixQueryField1:A -Field2:B BooleanQuery
и другие ...
Совмещаем индекс и хранилище
1. Серилизатор превращает объекты в коде в бинарный вид
Serializer
Key → Value
Совмещаем индекс и хранилище
2. Конвертер делает из объектов в коде документы Lucene
Serializer
Key → Value
Document Converter
Lucene
Совмещаем индекс и хранилище
3. Общая прослойка синхронизирует операции индексации и сохранения
Serializer
Key → Value
Document Converter
Lucene
Repository
Совмещаем индекс и хранилище
Это становится похоже на БД. Только не хватает яызка запросов :)
Serializer
Key → Value
Document Converter
Lucene
Repository
Формирование запросов
C# позволяет писать в коде выражениякоторые можно обрабатывать как деревья
λ
Формирование запросов
C# позволяет писать в коде выражениякоторые можно обрабатывать как деревья
Expression<Func<Args, Doc, bool>> q =((a, d) => !string.IsNullOrEmpty(d.Value));
Формирование запросов
Добавляем преобразователь деревьев выражений в код формирования запроса
QueryExpressionVisitorλ λ
Формирование запросов
Пример запроса, который всегда возвращает true
QueryExpressionVisitor
(Document d, Arguments a)=>
true
(Document d, Arguments a)=>
new MatchAllDocsQuery()
Формирование запросов
Пример запроса, который всегда возвращает true
QueryExpressionVisitor
Формирование запросов
(Doc d, Args a)=>d.Value == a.MatchingValue
Que
ryE
xpre
ssio
nVis
itor
Формирование запросов
(a,d) => a.MatchingValue == ”a” ? d.Value==”const1” : d.Value==”const2”
Формирование запросов
(a,d) => a.MatchingValue == ”a” ? d.Value==”const1” : d.Value==”const2”
Формирование запросов
(a,d) => d.Value==”const1” && d.Field1==”const2”
Формирование запросов
(a,d) => d.Value==”const1” && d.Field1==”const2”
Формирование запросов
(a,d) => d.Value==”const1” && d.Field1==”const2” && d.Field2 == “const2”
Формирование запросов
(a,d) => d.Value==”const1” && d.Field1==”const2” && d.Field2 == “const2”
Формирование запросов
Пример реального запроса из приложения
Формирование запросов
Пример реального запроса из приложения
Формирование запросов
Пример реального запроса из приложения
Индекс, хранилище и поиск
Serializer
Key → Value
Document Converter
Lucene
Repository
Поисковые запросы
λ
Вопросы?(c)
2013