Upload
-
View
730
Download
0
Embed Size (px)
Citation preview
Мобильная база данных Realm Прошло ли время SQLite?
Стачка, 2016Чебулаев Олег, Perpetuum Mobile Lab
План● Проблема хранения данных● Что такое Realm● Realm изнутри● Производительность● Практика использования
Идеальное решение● быстрое● безопасное● удобное● умное● обеспечивает консистентность
данных● бесплатное● кроссплатформенное
Способы хранения данных
Файлы, JSON, сериализация● Потокобезопастность● Производительность● Мапинг вручную● Запросы вручную● Не гарантируют
консистентность● No Smart
Pure SQLite● Сложность эффективного
использования● Мапинг и извлечение данных● Управление миграциями● Многопоточный доступ
Но зато, БЫСТРО
Core Data● Большой порог вхождения, для
новичков● Много шаблонного кода● Хитрая передача данных между
потоками● Непрозрачные операции● iOS only● Производительность
NSUserDefaults?
Что такое Realm?● быстрая, встраиваемая бд, zero-copy● объектно ориентированная, NoORM,
NoSQL, ● ACID транзакции● кросс-платформенный формат файла,
ядро на с++● биндинги на obj-c, swift, java, react native ● бесплатная и с открытым исходным
кодом
Конкурентный доступ
Конкурентный доступ: state 1
READ
ID NAME NOTES
1 Alex c++ developer
2 Jim java developer
3 Bill php developer
Конкурентный доступ: state 2
UPD
ID NAME NOTES
1 Alex c++ developer
2 Jim ios developer
3 Bill php developer
Конкурентный доступ: state 1
DEL
ID NAME NOTES
1 Alex c++ developer
2 Jim java developer
3 Bill php developer
Конкурентный доступ: state 3
READ
ID NAME NOTES
1 Alex c++ developer
2 Jim ios developer
3 Bill php developer
MVCC● Multi Version Concurrency Control● Одновременный доступ с разных
потоков● Каждая транзакция имеет свой
слепок базы данных● Изоляция изменений● Минимальные накладные расходы
Copy on write
B C
A
Copy on write
B C
A
B’
Copy on write
B C
A
B’A’
Copy on write
B C
A
B’A’
Copy on write
B C
A
B’A’
V1
V2
Copy on write
MVCC● Запись выполняется только
дописыванием● Обеспечивает доступ из разных
потоков● Запись не блокирует чтение● Безопасность исходных данных● Производительность
Ссылки● Realm это огромное b+ дерево● Получить объекты по связи To-One или To-
many это дешевые операции● Связи это просто указатели● Дешевая навигация по объектам
Оптимизации и безопасность● Оптимизация хранение строк● Оптимизация хранение
целочисленных типов● Crash безопасность● Lazy loading● Zero-copy
Тесты Core Data VS Realm 0.98.6Вставка записей/секундуCore Data: 528Realm: 1626Подсчет количества объектов запросов/секундуCore Data: 6624Realm: 91549Количество итераций/секундуCore Data: 29Realm: 30
Практика использования
Запросы● Все базовые операторы, вложенные запросы● Поддержка операций с коллекциями @min, @max,
@sum, @count, @avg● Операторы работы с массивами и множествами● Подзапросы по связям
JSONMantle-like мапинг через Realm-JSON
Работа в потоках● RLMObject и RLMRealm не
потокобезопасны● Решение: вместо объекта
передавать идентификатор
Уведомления● RLMRealm, RLMResults, свойстава
RLMObject поддерживают KVO● уведомления через методы Realm● Realm дружит и с Reactive Cocoa!
Миграции
Ограничения● Асинхронная запись● Каскадное удаление● Перегрузка сеттеров/геттеров● Поддержка полиморфизма● Fine-grained уведомления (обещают очень
скоро)● 16 мб на NSString и NSData● NSDate округляется до 1 секунды● Объем Realm файла <= выделенной памяти
для приложения
Вопросы?Чебулаев Олег, Perpetuum Mobile Lab