SlideShare a Scribd company logo
ТРАНЗАКЦИИ И
ДЕНОРМАЛИЗАЦИЯ В
MONGODB
JOIN
Transaction
Data
normalization
JOIN
 Иерархическая организация объектов.
 Слияние/объединение объектов на стороне клиента.
 Использование DBRef для организации связей между
коллекциями и «ленивой» загрузки.
 Усложняются опреации агрегирования с участием разных
коллекций.
 Требует более тщательного проектирования.
ПРИМЕР ИСПОЛЬЗОВАНИЯ DBREF
 public class Post : Entity
 {
 public string Id { get; set; }
 public string Title { get; set; }
 public string Summary { get; set; }
 public DateTime Added { get; set; }
 public DBRef Owner { get; set; }
 }

 var mongo = new Mongo(config.BuildConfiguration());
 mongo.Connect();
 var DB = mongo.GetDatabase(_dataBaseName)
 var post = new Post();
 post.Owner = new DBRef("User", userId); //First parameter is a mongoDB collection name and second is object id
 //To fetch object referenced by DBRef you should do following
 var owner = DB.FollowReference<User>(post.Owner);
TRANSACTION
 Можно использовать атомарность однодокументных
операций
 Использование дополнительных паттернов. Например,
commit в 2 шага.
 ACID?
ПРИМЕР ИСПОЛЬЗОВАНИЯ COMMIT В 2
ШАГА
 db.accounts.save({name: "A", balance: 1000, pendingTransactions: []})
 db.accounts.save({name: "B", balance: 1000, pendingTransactions: []})
 db.transactions.save({source: "A", destination: "B", value: 100, state: "initial"})
 db.transactions.update({_id: t._id}, {$set: {state: "pending"}})
 db.accounts.update({name: t.source, pendingTransactions: {$ne: t._id}}, {$inc: {balance: -t.value}, $push:
{pendingTransactions: t._id}})
 db.accounts.update({name: t.destination, pendingTransactions: {$ne: t._id}}, {$inc: {balance: t.value}, $push:
{pendingTransactions: t._id}})
 db.transactions.update({_id: t._id}, {$set: {state: "committed"}})
 db.accounts.update({name: t.source}, {$pull: {pendingTransactions: t._id}})
 db.accounts.update({name: t.destination}, {$pull: {pendingTransactions: t._id}})
 db.transactions.update({_id: t._id}, {$set: {state: "done"}})
ACID
 Atomicity
 Consistency
 Isolation
 Durability
DATA NORMALIZATION
 Объект в коллекции содержит необходимые ему данные.
 Дополнительная сложность организации транзакций может
приводить к нарушению целосности данных между разными
коллекциями в определенные моменты времени.
 Ограниченность встроенных механизмов ссылок и
древовидная структура объекта побуждает к
денормализации.
В ЗАКЛЮЧЕНИЕ
 При использовании любого инструмента нужно понимать его
преимущества и недостатки.
 При проектировании приложения нужно понимать
ограничения инструментов и способы борьбы с ними.
 Премущества часто перевешивают дополнительные затраты
адаптации под вашу задачу.

More Related Content

What's hot (20)

PDF
13 - Web-технологии. Отображение данных
Roman Brovko
 
PPTX
PHP and MySQL
Noveo
 
PPTX
I tmozg js_school_jquery
ITmozg
 
PPTX
Индексирование в Magento
Magecom Ukraine
 
PDF
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Глеб Тарасов
 
PPTX
Caching on highload Drupal site - Alexander Shumenko
DrupalCampDN
 
PPTX
Быть в 10 раз эффективнее благодаря Groovy
Evgeny Kompaniyets
 
PDF
msumobi2. Лекция 2
Глеб Тарасов
 
PDF
Практическое применение MongoDB Aggregation Framework
Денис Кравченко
 
PPTX
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
Evgeniy Kuzmin
 
ODP
Работа с БД в Drupal 7
Eugene Fidelin
 
PDF
Примеры решения типичных задач за рамками ядра Yii2
Paul Klimov
 
PDF
MongoDB@addconf
Sergei Tulentsev
 
PDF
YiiConf 2012 - Alexander Makarov - Yii2, что нового
Alexander Makarov
 
PPTX
Yii 2. Что нового?
yiiconf
 
PDF
Perl: Symbol table
Elena Shishkina
 
PDF
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
CocoaHeads
 
PPT
Интеграция Яндекс Сервер
PVasili
 
PDF
Web Internship - PHP and MySQL
Noveo
 
PDF
YiiConf: Миграции и инсталляции
Paul Klimov
 
13 - Web-технологии. Отображение данных
Roman Brovko
 
PHP and MySQL
Noveo
 
I tmozg js_school_jquery
ITmozg
 
Индексирование в Magento
Magecom Ukraine
 
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Глеб Тарасов
 
Caching on highload Drupal site - Alexander Shumenko
DrupalCampDN
 
Быть в 10 раз эффективнее благодаря Groovy
Evgeny Kompaniyets
 
msumobi2. Лекция 2
Глеб Тарасов
 
Практическое применение MongoDB Aggregation Framework
Денис Кравченко
 
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
Evgeniy Kuzmin
 
Работа с БД в Drupal 7
Eugene Fidelin
 
Примеры решения типичных задач за рамками ядра Yii2
Paul Klimov
 
MongoDB@addconf
Sergei Tulentsev
 
YiiConf 2012 - Alexander Makarov - Yii2, что нового
Alexander Makarov
 
Yii 2. Что нового?
yiiconf
 
Perl: Symbol table
Elena Shishkina
 
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
CocoaHeads
 
Интеграция Яндекс Сервер
PVasili
 
Web Internship - PHP and MySQL
Noveo
 
YiiConf: Миграции и инсталляции
Paul Klimov
 

Similar to Transactions and Denormalization in MongoDB - Artem Slobolinsky - Dnipropetrovsk MUG 140303 (20)

PDF
Влад Ковташ — Yap Database
CocoaHeads
 
PPT
Общая архитектура Yii2
Paul Klimov
 
PPTX
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Fedor Lavrentyev
 
PDF
Database (Lecture 14 – database)
Noveo
 
PDF
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Ivan Muratov
 
PPT
Web осень 2012 лекция 4
Technopark
 
PPT
Вебинар "Оптимизация производительности мобильных веб-приложений"
MobiDev
 
PDF
Web осень 2013 лекция 6
Technopark
 
PDF
Как писать под Android программы, а не код
0leGG
 
PPTX
Jboss drools expert (ru)
Victor_Cr
 
PDF
SECON'2016. Бочкарев Игорь, Реактивные мобильные приложения
SECON
 
PPT
Enterprise Patterns in Magento
Vrann Tulika
 
PDF
Knockout.JS на примере 2ГИС-Онлайн
DevDay
 
PDF
Knockoutjs на примере 2ГИС-Онлайн
2ГИС Технологии
 
PPTX
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf Conference
 
PPTX
Java осень 2012 лекция 8
Technopark
 
PDF
Grails & Groovy
Denys Sosuliev
 
PPTX
Разработка расширяемых приложений на Django
MoscowDjango
 
PPT
Web весна 2013 лекция 4
Technopark
 
PDF
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
it-people
 
Влад Ковташ — Yap Database
CocoaHeads
 
Общая архитектура Yii2
Paul Klimov
 
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Fedor Lavrentyev
 
Database (Lecture 14 – database)
Noveo
 
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Ivan Muratov
 
Web осень 2012 лекция 4
Technopark
 
Вебинар "Оптимизация производительности мобильных веб-приложений"
MobiDev
 
Web осень 2013 лекция 6
Technopark
 
Как писать под Android программы, а не код
0leGG
 
Jboss drools expert (ru)
Victor_Cr
 
SECON'2016. Бочкарев Игорь, Реактивные мобильные приложения
SECON
 
Enterprise Patterns in Magento
Vrann Tulika
 
Knockout.JS на примере 2ГИС-Онлайн
DevDay
 
Knockoutjs на примере 2ГИС-Онлайн
2ГИС Технологии
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf Conference
 
Java осень 2012 лекция 8
Technopark
 
Grails & Groovy
Denys Sosuliev
 
Разработка расширяемых приложений на Django
MoscowDjango
 
Web весна 2013 лекция 4
Technopark
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
it-people
 
Ad

Transactions and Denormalization in MongoDB - Artem Slobolinsky - Dnipropetrovsk MUG 140303

  • 3. JOIN  Иерархическая организация объектов.  Слияние/объединение объектов на стороне клиента.  Использование DBRef для организации связей между коллекциями и «ленивой» загрузки.  Усложняются опреации агрегирования с участием разных коллекций.  Требует более тщательного проектирования.
  • 4. ПРИМЕР ИСПОЛЬЗОВАНИЯ DBREF  public class Post : Entity  {  public string Id { get; set; }  public string Title { get; set; }  public string Summary { get; set; }  public DateTime Added { get; set; }  public DBRef Owner { get; set; }  }   var mongo = new Mongo(config.BuildConfiguration());  mongo.Connect();  var DB = mongo.GetDatabase(_dataBaseName)  var post = new Post();  post.Owner = new DBRef("User", userId); //First parameter is a mongoDB collection name and second is object id  //To fetch object referenced by DBRef you should do following  var owner = DB.FollowReference<User>(post.Owner);
  • 5. TRANSACTION  Можно использовать атомарность однодокументных операций  Использование дополнительных паттернов. Например, commit в 2 шага.  ACID?
  • 6. ПРИМЕР ИСПОЛЬЗОВАНИЯ COMMIT В 2 ШАГА  db.accounts.save({name: "A", balance: 1000, pendingTransactions: []})  db.accounts.save({name: "B", balance: 1000, pendingTransactions: []})  db.transactions.save({source: "A", destination: "B", value: 100, state: "initial"})  db.transactions.update({_id: t._id}, {$set: {state: "pending"}})  db.accounts.update({name: t.source, pendingTransactions: {$ne: t._id}}, {$inc: {balance: -t.value}, $push: {pendingTransactions: t._id}})  db.accounts.update({name: t.destination, pendingTransactions: {$ne: t._id}}, {$inc: {balance: t.value}, $push: {pendingTransactions: t._id}})  db.transactions.update({_id: t._id}, {$set: {state: "committed"}})  db.accounts.update({name: t.source}, {$pull: {pendingTransactions: t._id}})  db.accounts.update({name: t.destination}, {$pull: {pendingTransactions: t._id}})  db.transactions.update({_id: t._id}, {$set: {state: "done"}})
  • 7. ACID  Atomicity  Consistency  Isolation  Durability
  • 8. DATA NORMALIZATION  Объект в коллекции содержит необходимые ему данные.  Дополнительная сложность организации транзакций может приводить к нарушению целосности данных между разными коллекциями в определенные моменты времени.  Ограниченность встроенных механизмов ссылок и древовидная структура объекта побуждает к денормализации.
  • 9. В ЗАКЛЮЧЕНИЕ  При использовании любого инструмента нужно понимать его преимущества и недостатки.  При проектировании приложения нужно понимать ограничения инструментов и способы борьбы с ними.  Премущества часто перевешивают дополнительные затраты адаптации под вашу задачу.