36
NoSQL P2P DB на коленке Часть 1: База данных Глеб Лебедев, Netvox Lab 2013 для MongoDB UG

NoSQL DataBase На коленке

Embed Size (px)

DESCRIPTION

Как скомбинировать Lucene.NET, LevelDB и Expression Tree Visitor в подобие базы данных.

Citation preview

Page 1: NoSQL DataBase На коленке

NoSQL P2P DB на коленке

Часть 1: База данныхГлеб Лебедев, Netvox Lab 2013

для MongoDB UG

Page 2: NoSQL DataBase На коленке

Строим базу данных

Из чего состоит База Данных?

Page 3: NoSQL DataBase На коленке

Строим базу данных

Хранилище данных

Page 4: NoSQL DataBase На коленке

Строим базу данных

Хранилище данныхИндексы для

быстрого поиска

Page 5: NoSQL DataBase На коленке

Строим базу данных

Хранилище данныхИндексы для

быстрого поиска

Подсистема выполнения запросов и индексации

Page 6: NoSQL DataBase На коленке

Строим базу данных

Хранилище данныхИндексы для

быстрого поиска

Подсистема выполнения запросов и индексации

Подсистема синхронизации

Page 7: NoSQL DataBase На коленке

Строим базу данных

Хранилище данныхИндексы для

быстрого поиска

Подсистема выполнения запросов и индексации

Подсистема синхронизации

При

лож

ение

Page 8: NoSQL DataBase На коленке

Хранение данных

Минимально хранение данных реализуют базы типа “ключ→значения”

Key → Value

Page 9: NoSQL DataBase На коленке

Хранение данных

Специализированные хранилища

Например LevelDB

● New BSD License● Пакетная запись● Сжатие данных● Ключ и значение - массивы байт

Key → Value

Page 10: NoSQL DataBase На коленке

Хранение данных

Специализированные хранилища

Например LevelDB

● Нет запросов ● Нет индексов

Идеальный строительный блок для полноценной БД

Key → Value

Page 11: NoSQL DataBase На коленке

Хранение данных

Специализированные хранилища

Например LevelDB

● Нет запросов● Нет индексов

Идеальный строительный блок для полноценной БД

Key → Value

Page 12: NoSQL DataBase На коленке

Хранение данных

Не специализированные, например поверх реляционной БД

● Можно индексировать служебную информацию

● Транзакции SQL

ⱠKey Value Version LastModified ETag

Page 13: NoSQL DataBase На коленке

Индексация и Поиск

● Lucene / Lucene.NET○ Apache License 2.0○ Можно встраивать○ Быстро работает, требует мало памяти

● Sphinx○ GPLv2○ Отдельный сервер

Page 14: NoSQL DataBase На коленке

Индексация и Поиск

Lucene индексирует документы

{“Field1” -> [“Value1”]“Field2” -> [“Value2.1”,“Value2.2”]

}

Page 15: NoSQL DataBase На коленке

Индексация и Поиск

Lucene поддерживает запросы вида:

*:* MatchAllDocsQueryField:Value TermQueryField:[A to B] TermRangeQueryField:[1 to 10] NumericRangeQueryField:Val* PrefixQueryField1:A -Field2:B BooleanQuery

и другие ...

Page 16: NoSQL DataBase На коленке

Совмещаем индекс и хранилище

1. Серилизатор превращает объекты в коде в бинарный вид

Serializer

Key → Value

Page 17: NoSQL DataBase На коленке

Совмещаем индекс и хранилище

2. Конвертер делает из объектов в коде документы Lucene

Serializer

Key → Value

Document Converter

Lucene

Page 18: NoSQL DataBase На коленке

Совмещаем индекс и хранилище

3. Общая прослойка синхронизирует операции индексации и сохранения

Serializer

Key → Value

Document Converter

Lucene

Repository

Page 19: NoSQL DataBase На коленке

Совмещаем индекс и хранилище

Это становится похоже на БД. Только не хватает яызка запросов :)

Serializer

Key → Value

Document Converter

Lucene

Repository

Page 20: NoSQL DataBase На коленке

Формирование запросов

C# позволяет писать в коде выражениякоторые можно обрабатывать как деревья

λ

Page 21: NoSQL DataBase На коленке

Формирование запросов

C# позволяет писать в коде выражениякоторые можно обрабатывать как деревья

Expression<Func<Args, Doc, bool>> q =((a, d) => !string.IsNullOrEmpty(d.Value));

Page 22: NoSQL DataBase На коленке

Формирование запросов

Добавляем преобразователь деревьев выражений в код формирования запроса

QueryExpressionVisitorλ λ

Page 23: NoSQL DataBase На коленке

Формирование запросов

Пример запроса, который всегда возвращает true

QueryExpressionVisitor

(Document d, Arguments a)=>

true

(Document d, Arguments a)=>

new MatchAllDocsQuery()

Page 24: NoSQL DataBase На коленке

Формирование запросов

Пример запроса, который всегда возвращает true

QueryExpressionVisitor

Page 25: NoSQL DataBase На коленке

Формирование запросов

(Doc d, Args a)=>d.Value == a.MatchingValue

Que

ryE

xpre

ssio

nVis

itor

Page 26: NoSQL DataBase На коленке

Формирование запросов

(a,d) => a.MatchingValue == ”a” ? d.Value==”const1” : d.Value==”const2”

Page 27: NoSQL DataBase На коленке

Формирование запросов

(a,d) => a.MatchingValue == ”a” ? d.Value==”const1” : d.Value==”const2”

Page 28: NoSQL DataBase На коленке

Формирование запросов

(a,d) => d.Value==”const1” && d.Field1==”const2”

Page 29: NoSQL DataBase На коленке

Формирование запросов

(a,d) => d.Value==”const1” && d.Field1==”const2”

Page 30: NoSQL DataBase На коленке

Формирование запросов

(a,d) => d.Value==”const1” && d.Field1==”const2” && d.Field2 == “const2”

Page 31: NoSQL DataBase На коленке

Формирование запросов

(a,d) => d.Value==”const1” && d.Field1==”const2” && d.Field2 == “const2”

Page 32: NoSQL DataBase На коленке

Формирование запросов

Пример реального запроса из приложения

Page 33: NoSQL DataBase На коленке

Формирование запросов

Пример реального запроса из приложения

Page 34: NoSQL DataBase На коленке

Формирование запросов

Пример реального запроса из приложения

Page 35: NoSQL DataBase На коленке

Индекс, хранилище и поиск

Serializer

Key → Value

Document Converter

Lucene

Repository

Поисковые запросы

λ

Page 36: NoSQL DataBase На коленке

Вопросы?(c)

2013