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

PDF
Новое в Symfony 2.6
PDF
«Highload блоки и новое api к ним»
PDF
Mongo db aggregation
PPTX
Реализация шаблонов корпоративных приложений в Magento
PDF
12 - Web-технологии. Django модели
PDF
Перевод базы Caché из 8 бит в Unicode
PPT
Yii development
PPT
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Новое в Symfony 2.6
«Highload блоки и новое api к ним»
Mongo db aggregation
Реализация шаблонов корпоративных приложений в Magento
12 - Web-технологии. Django модели
Перевод базы Caché из 8 бит в Unicode
Yii development
Импорт данных с фреймворком Migrate. Владислав Богатырев.

What's hot (20)

PDF
13 - Web-технологии. Отображение данных
PPTX
PHP and MySQL
PPTX
I tmozg js_school_jquery
PPTX
Индексирование в Magento
PDF
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
PPTX
Caching on highload Drupal site - Alexander Shumenko
PPTX
Быть в 10 раз эффективнее благодаря Groovy
PDF
msumobi2. Лекция 2
PDF
Практическое применение MongoDB Aggregation Framework
PPTX
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
ODP
Работа с БД в Drupal 7
PDF
Примеры решения типичных задач за рамками ядра Yii2
PDF
MongoDB@addconf
PDF
YiiConf 2012 - Alexander Makarov - Yii2, что нового
PPTX
Yii 2. Что нового?
PDF
Perl: Symbol table
PDF
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
PPT
Интеграция Яндекс Сервер
PDF
Web Internship - PHP and MySQL
PDF
YiiConf: Миграции и инсталляции
13 - Web-технологии. Отображение данных
PHP and MySQL
I tmozg js_school_jquery
Индексирование в Magento
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Caching on highload Drupal site - Alexander Shumenko
Быть в 10 раз эффективнее благодаря Groovy
msumobi2. Лекция 2
Практическое применение MongoDB Aggregation Framework
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
Работа с БД в Drupal 7
Примеры решения типичных задач за рамками ядра Yii2
MongoDB@addconf
YiiConf 2012 - Alexander Makarov - Yii2, что нового
Yii 2. Что нового?
Perl: Symbol table
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
Интеграция Яндекс Сервер
Web Internship - PHP and MySQL
YiiConf: Миграции и инсталляции
Ad

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

PDF
Влад Ковташ — Yap Database
PPT
Общая архитектура Yii2
PPTX
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
PDF
Database (Lecture 14 – database)
PDF
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
PPT
Web осень 2012 лекция 4
PPT
Вебинар "Оптимизация производительности мобильных веб-приложений"
PDF
Web осень 2013 лекция 6
PDF
Как писать под Android программы, а не код
PPTX
Jboss drools expert (ru)
PDF
SECON'2016. Бочкарев Игорь, Реактивные мобильные приложения
PPT
Enterprise Patterns in Magento
PDF
Knockout.JS на примере 2ГИС-Онлайн
PDF
Knockoutjs на примере 2ГИС-Онлайн
PPTX
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
PPTX
Java осень 2012 лекция 8
PDF
Grails & Groovy
PPTX
Разработка расширяемых приложений на Django
PPT
Web весна 2013 лекция 4
PDF
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
Влад Ковташ — Yap Database
Общая архитектура Yii2
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Database (Lecture 14 – database)
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Web осень 2012 лекция 4
Вебинар "Оптимизация производительности мобильных веб-приложений"
Web осень 2013 лекция 6
Как писать под Android программы, а не код
Jboss drools expert (ru)
SECON'2016. Бочкарев Игорь, Реактивные мобильные приложения
Enterprise Patterns in Magento
Knockout.JS на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-Онлайн
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
Java осень 2012 лекция 8
Grails & Groovy
Разработка расширяемых приложений на Django
Web весна 2013 лекция 4
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
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. В ЗАКЛЮЧЕНИЕ  При использовании любого инструмента нужно понимать его преимущества и недостатки.  При проектировании приложения нужно понимать ограничения инструментов и способы борьбы с ними.  Премущества часто перевешивают дополнительные затраты адаптации под вашу задачу.