Защо MongoDB?

Preview:

Citation preview

Защо?

Стефан Къневhttp://skanev.com/@skanev

OpenFest21 Ноември 2010

София

Monday, November 22, 2010

Аз съм Стефан,приятно ми е.

Monday, November 22, 2010

програмистMonday, November 22, 2010

Monday, November 22, 2010

Monday, November 22, 2010

Monday, November 22, 2010

http://skanev.com/

Monday, November 22, 2010

особен стил

Monday, November 22, 2010

говоря бързо

Monday, November 22, 2010

ръкомахамMonday, November 22, 2010

“п.с.  това  момче  отдясно  рапър  ли  е  ;)  ?”

OpenFest 2009

Monday, November 22, 2010

много слайдове

Monday, November 22, 2010

210Monday, November 22, 2010

нещо ново!

Monday, November 22, 2010

Мариян

Monday, November 22, 2010

Аз ползвамWindows 7

OpenFest 2009

Monday, November 22, 2010

Аз ползвамVisual Source Safe

P2P 2010

Monday, November 22, 2010

коварно: тази година той говори последен

Monday, November 22, 2010

“Класически” МариянMonday, November 22, 2010

ала Salvador DaliMonday, November 22, 2010

Friendly Mutton Chops

Monday, November 22, 2010

The Real StuffMonday, November 22, 2010

Monday, November 22, 2010

Имате въпроси?

Monday, November 22, 2010

1. Проблеми на релационните бази от данни

2. MongoDB отдалеч

3. Работа с MongoDB

4. Предимства и недостатъци

5. Някои приложения

6. MongoDB в живия живот

Monday, November 22, 2010

DisclaimerРелационните бази работят, доказани са и имат ред успешни приложения. Ако се захващате с алтернативни сте в

експериментална територия и трябва да сте готови да се оправяте сами.

Monday, November 22, 2010

1. Проблеми на релационните бази от данни

2. MongoDB отдалеч

3. Работа с MongoDB

4. Предимства и недостатъци

5. Някои приложения

6. MongoDB в живия живот

Monday, November 22, 2010

Релационните  бази  са  сложни!DDL & DML

нормализация

индексиinner/outer joinтранзакции/изолация

6NF

денормализация

Monday, November 22, 2010

скубете си косата...

...или сте си оскубали косата

Monday, November 22, 2010

R MO

Monday, November 22, 2010

bject-to- elational apperR MO

Monday, November 22, 2010

клас ⇔ таблица

Monday, November 22, 2010

не съвсем съвместими

Monday, November 22, 2010

ON DELETE CASCASE vs. callback в кода

Monday, November 22, 2010

несъвместимост между типовете(например дати)

Monday, November 22, 2010

в кода vs. в базата

Monday, November 22, 2010

OOP RDBMS

ORM

В “думите” на господин Вен...

...само общата част от двата свята

Monday, November 22, 2010

лош програмен модел

Monday, November 22, 2010

Edgar Codd

Monday, November 22, 2010

Релационен модел

Monday, November 22, 2010

Релационен модел

Monday, November 22, 2010

теория

Monday, November 22, 2010

теория  ≠  практика

Monday, November 22, 2010

на  теория:

Поставяте  данните  в  релации,пишете  заявка  и  систематаавтоматично  намира  как  да  яизпълни  оптимално.

Monday, November 22, 2010

на  практика:

Уф,  ‘що  не  ползва  тоя  иднекс?Може  би  трябва  да  денормализирам  тази  таблица...  

Monday, November 22, 2010

Monday, November 22, 2010

SQL  е  ужасен

Monday, November 22, 2010

Don Chamberlinговори за SQL:

Monday, November 22, 2010

“Ray  and  I  thought  that  we  were  developing  a  language  that  would  be  used  mainly  by  ‘casual  users’...”

Monday, November 22, 2010

“...we  were  trying  to  make  databases  accessible  to  a  new  class  of  users  who  were  not  trained  computer  scientists...”

Monday, November 22, 2010

“We  expected  to  see  SQL  used  directly  by  financial  analysts,  urban  planners,  and  other  professionals  who  needed  access  to  data  but  did  not  want  to  write  computer  programs”

Monday, November 22, 2010

“In  fact,  over  the  years  a  great  deal  of  SQL  code  has  been  generated  by  automatic  tools,  a  development  that  was  not  foreseen  in  the  early  days.”

Monday, November 22, 2010

Monday, November 22, 2010

Monday, November 22, 2010

концептуални  проблеми

Monday, November 22, 2010

не  твърдя:

“Релационните  бази  са  неизползвамеви  за  повечето  приложения”

Monday, November 22, 2010

твърдя:

“Релационните  бази  са  скъпи  за  повечето  приложения”

Monday, November 22, 2010

Monday, November 22, 2010

NoSQL

Monday, November 22, 2010

Scientists have discovered that 83% of all projects are better

of with MongoDB. True story.

Barney Stinson, ProgrammerMonday, November 22, 2010

1. Проблеми на релационните бази от данни

2. MongoDB отдалеч

3. Работа с MongoDB

4. Предимства и недостатъци

5. Някои приложения

6. MongoDB в живия живот

Monday, November 22, 2010

Monday, November 22, 2010

документно-­‐ориентирана

Monday, November 22, 2010

scalability,  performances,tons  of  features

Monday, November 22, 2010

OMG,  индекси!

(ако си мислите, че това не е проблем, пробвайте CouchDB)

Monday, November 22, 2010

производителност

функционалност

• memcached

• key/value

• RDBMS

• MongoDB

(според Mike Dirolf, един от авторите)Monday, November 22, 2010

“MyISAM  on  meth”

Monday, November 22, 2010

бази  ›  колекции  ›  документи

Monday, November 22, 2010

колекции  ≈  таблици

Monday, November 22, 2010

документите  са  JSON*

* с уговоркиMonday, November 22, 2010

{ "title": "Haskell rocks", "text": "Today I played with...", "tags": ["programming", "haskell"], "author": { "name": "Stefan Kanev", "email": "stefan@example.org" } "views": 42}

Блог пост

Monday, November 22, 2010

{ "title": "Haskell rocks", "body": "Today I played with...", "notes": "Monads in Go?"}

{ "title": "Io is awesome", "tags": ['io', 'awesome'], "notes": 5}

Гъвкава схема

различни полета

различни типове

Monday, November 22, 2010

Типове

• нищо: null• булева стойност: true, false• 32bit/64bit цели числа: 42• 64bit float: 3.1415• низове: “chunky bacon”• дати: new Date()• регулярен израз: /foobar/i• код: function(x) { return x * x; }• масиви: [2, 3, 5, 7, 11]• обекти/документи: {foo: 1, bar: 2}

Monday, November 22, 2010

документите  всъщонст  са  BSON*

* бърз двоичен формат, MongoDB измислицаMonday, November 22, 2010

JavaScript  конзола

Monday, November 22, 2010

репликация

Monday, November 22, 2010

master-­‐slave

Monday, November 22, 2010

replica  set

Monday, November 22, 2010

auto-­‐sharding

Monday, November 22, 2010

1. Проблеми на релационните бази от данни

2. MongoDB отдалеч

3. Работа с MongoDB

4. Предимства и недостатъци

5. Някои приложения

6. MongoDB в живия живот

Monday, November 22, 2010

{ "title": "Haskell rocks", "author": "skanev", "text": "Today I played with...", "tags": ["programming", "haskell"], "views": 42}

Примерен документ

Monday, November 22, 2010

> db.posts.insert({ "title": "Haskell rocks", "author": "skanev", "text": "Today I played with...", "tags": ["programming", "haskell"], "views": 42})

Добавянеглобална променлива в конзолата за текущата база

име на колекциятакоманда

Monday, November 22, 2010

> db.posts.find(){ "_id" : ObjectId("4ce653278f4f936035707875"), "title" : "Haskell rocks", "author" : "skanev", "text" : "Today I played with...", "tags" : [ "programming", "haskell" ], "views" : 42}

...и резултатът

Monday, November 22, 2010

_id

• специален ключ,

• всеки документ го има

• уникален е в рамките на колекция

• какъвто и да е тип

Monday, November 22, 2010

> db.posts.update({title: "Haskell rocks"}, { title: "Haskell is cool", author: "skanev", body: "Today I played with..."})

Обновяване на документ

Monday, November 22, 2010

> db.posts.findOne(){ "_id" : ObjectId("4ce653278f4f936035707875"), "title" : "Haskell is cool", "author" : "skanev", "body" : "Today I played with..."}

След записа

tags и views ги няма

Monday, November 22, 2010

> db.posts.update({_id:"4ce653278f4f936035707875"},{ title: "Haskell is cool", author: "skanev", body: "Today I played with..."})

Обикновено ползвате _id

Monday, November 22, 2010

db.posts.update( {'title': 'Haskell rocks'}, {'$set': {'title': 'Haskell is weird'}})

Промяна на единично поле

Monday, November 22, 2010

Модификатори ($set)

• Не са имена на полета

• Значат нещо специално за Mongo

• Започват с $

• Prefix-а може да се промени при клиента

Monday, November 22, 2010

инкрементиране на брояч

Monday, November 22, 2010

var views = db.posts.findOne({title: "Haskell rocks"}).views

db.posts.update( {'title': 'Haskell rocks'}, {'$set': {'views': views + 1}})

Може така...

...но има проблеми

Monday, November 22, 2010

...но по-добрият вариант е

db.posts.update( {'title': 'Haskell rocks'}, {'$inc': {'views': 1}})

Monday, November 22, 2010

работа с масиви

Monday, November 22, 2010

{ "title": "Haskell rocks", "tags": ["weird", "haskell"],}

Документ

Monday, November 22, 2010

Добавяне на таг

db.posts.update( {'title': 'Haskell rocks'}, {'$push': {'tags': 'fun'}})

> db.posts.findOne(){ "_id" : ObjectId("4ce7acf86fe4256367d98353"), "tags" : ["weird", "haskell", "fun"], "title" : "Haskell rocks"}

Monday, November 22, 2010

Или пък

db.posts.update( {'title': 'Haskell rocks'}, {'$addToSet': {'tags': 'weird'}})

Monday, November 22, 2010

вложени документи

Monday, November 22, 2010

{ "title": "Haskell rocks", "author": { "name": "Stefan Kanev", "email": "stefan.kanev@example.org" }}

Документът...

Monday, November 22, 2010

...и промяната

db.posts.update( {"author.name": "Stefan Kanev"}, {"$set": {"author.email": "skanev@example.com"}})

Monday, November 22, 2010

заявки за търсене

Monday, November 22, 2010

db.posts.find({"author": "skanev"})

Съвпадение по поле

Monday, November 22, 2010

Само определени полета

db.posts.find( {"author": "skanev"}, {"title": 1, "tags": 1})

Monday, November 22, 2010

Сравнения

db.posts.find({"views": {"$gt": 1000}})

db.posts.find({"views": {"$gt": 1000, "$lt": 2000}})

Monday, November 22, 2010

$in

db.posts.find({ "author": {"$in": ['skanev', 'stefan', 'kanev']}})

Monday, November 22, 2010

Дизюнкция(или на прост български: OR)

db.posts.find({ "$or": [ {"author": "skanev"}, {"views": {"$gte": 1000}} ]})

Monday, November 22, 2010

Търсене в масиви

db.posts.find({"tags": "haskell"})

db.posts.find({ "tags": {"$all": ["programming", "haskell"]}})

db.posts.find({"tags": {"$size": 2}})

Monday, November 22, 2010

Вложени документи

db.people.find({ "name.first": "Stefan", "name.last": "Kanev"})

Monday, November 22, 2010

има и още...

$gt $lt $gte $lte $ne$all $in $nin $not $mod$size $exists $type $elemMatch

Monday, November 22, 2010

$where

db.people.find({ "$where": function() { return this.age % 2 == 0; }})

Monday, November 22, 2010

MapReduce

Monday, November 22, 2010

GridFS

Monday, November 22, 2010

server-­‐side  javascript

Monday, November 22, 2010

1. Проблеми на релационните бази от данни

2. MongoDB отдалеч

3. Работа с MongoDB

4. Предимства и недостатъци

5. Някои приложения

6. MongoDB в живия живот

Monday, November 22, 2010

Corey Haines

Monday, November 22, 2010

#positivember

Monday, November 22, 2010

Хубавото в MongoDBMonday, November 22, 2010

бързо

Monday, November 22, 2010

horizontal  scalability

Monday, November 22, 2010

feature-­‐rich

Monday, November 22, 2010

Лошото в MongoDBMonday, November 22, 2010

администрация  ;(

Monday, November 22, 2010

memory  mapped-­‐files

Monday, November 22, 2010

особености  при  back-­‐up

Monday, November 22, 2010

no  single-­‐server  durability

Monday, November 22, 2010

много  инстанции  на  mongo

Monday, November 22, 2010

сега  е  #positivember,  авсичко  това  е  много  негативно;

затова  мислете  така:

Monday, November 22, 2010

улеснява  програмирането  за  сметка  на  системната  

администрация

Monday, November 22, 2010

балансира  сложността  между  програмистите  и  админите

Monday, November 22, 2010

намира  работа  на  админите

Monday, November 22, 2010

кара  администраторите  да  се  чустват  полезни

Monday, November 22, 2010

мизантропи и социопати

пълноценни членове на обществото

Системни администратори

принос,самочувствие

Monday, November 22, 2010

MongoDB  е  полезно  за  админите

Monday, November 22, 2010

Monday, November 22, 2010

...но  сериозно...

Monday, November 22, 2010

1. Проблеми на релационните бази от данни

2. MongoDB отдалеч

3. Работа с MongoDB

4. Предимства и недостатъци

5. Някои приложения

6. MongoDB в живия живот

Monday, November 22, 2010

три проблема, които не са директно с производителност

Monday, November 22, 2010

1

Monday, November 22, 2010

MyISAM120  000  000  записа200  GB  таблица

Monday, November 22, 2010

...искам  да  добавя  нова  колона

Monday, November 22, 2010

ALTER TABLE articlesоколо  20  часа

Monday, November 22, 2010

спъва  развитието  на  продукта

прави  deploy-­‐а  ръчен

никой  не  иска  да  смъкне  сайта

Monday, November 22, 2010

без заключване на таблици

Monday, November 22, 2010

1. променяме кода да работи с двата варианта

2. времеемка миграция, която не заключва нищо

3. премахваме поддръжката за стария вариант

Рецепта

Monday, November 22, 2010

2

Monday, November 22, 2010

импортираме  от  legacy  база......от  таблица  с  188  колони

Monday, November 22, 2010

Monday, November 22, 2010

orgnr skatter_AB soliditet_AB sumomstillg_KONC roresfdisp_KONC antalanst_KONC_Xlan aretsres_AB kaslikv_AB sparrkonto_KONC omsattfor_KONC oms_KONC_Xkommun likvmed_AB kasflfror_AB maskoinv_KONC forsumtillg_KONC resfbok_KONC_Xbolform kundford_AB avkegkap_AB sumanltillg_KONC regdatum_AB aretsres_KONC_Xftgnamn varulager_AB avktotkap_AB sumtillg_KONC styrelse_AB sumtillg_KONC_Xcopers ovromstillg_AB lonekanst_AB levskuld_KONC histnamn_AB aktiekap_KONC_Xutdadress sumomstillg_AB roresfdisp_AB sumkortfsk_KONC firmteck_AB sumegkap_KONC_Xpostnr sparrkonto_AB omsattfor_AB sumlangfsk_KONC bolord_AB netrespoms_KONC_Xpostort maskoinv_AB forsumtillg_AB obesres_KONC regdatum_HB vinstmarg_KONC_Xriktnr sumanltillg_AB bokslut_start_KONC aktiekap_KONC styrelse_HB omsanst_KONC_Xabbnr sumtillg_AB bokslut_slut_KONC ovrbundkap_KONC histnamn_HB soliditet_KONC_Xverkstat levskuld_AB aktieutd_KONC obunegkap_KONC firmteck_HB kaslikv_KONC_Xaktivstat sumkortfsk_AB antalanst_KONC sumegkap_KONC bolord_HB avktotkap_KONC_Xsni sumlangfsk_AB lonoers_KONC sumskegkap_KONC status_konk_HB lonekanst_KONC_Xdkm_AB obesres_AB oms_KONC goodwill_KONC status_likv_HB omsattfor_KONC_Xbokslut_start_AB aktiekap_AB resfavskr_KONC panter_KONC sekv_HB bolstatusbokslut_slut_AB ovrbundkap_AB avskr_KONC ansvar_KONC antalanst_AB_X styrelse_Xaktieutd_AB obunegkap_AB reseavskr_KONC fastigheter_KONC oms_AB_X fbokstavantalanst_AB sumegkap_AB finint_KONC revanm_KONC resfbok_AB_X bolord_Xlonoers_AB sumskegkap_AB finkostn_KONC ntstart_KONC aretsres_AB_X histnamn_Xoms_AB goodwill_AB resefin_KONC ntslut_KONC sumtillg_AB_X regdatum_Xresfavskr_AB panter_AB extordint_KONC resfavspoms_KONC aktiekap_AB_X koncern_Xavskr_AB ansvar_AB extordkost_KONC netrespoms_KONC sumegkap_AB_X publikt_Xreseavskr_AB fastigheter_AB resfbok_KONC vinstmarg_KONC netrespoms_AB_X kommun_Xfinint_AB revanm_AB boksldisp_KONC omsanst_KONC vinstmarg_AB_X senaste_ABfinkostn_AB ntstart_AB skatter_KONC soliditet_KONC omsanst_AB_X senaste_KONCresefin_AB ntslut_AB aretsres_KONC kaslikv_KONC soliditet_AB_X skodextordint_AB resfavspoms_AB likvmed_KONC kasflfror_KONC kaslikv_AB_X tkodextordkost_AB netrespoms_AB kundford_KONC avkegkap_KONC avktotkap_AB_X datumresfbok_AB vinstmarg_AB varulager_KONC avktotkap_KONC lonekanst_AB_X forgnrboksldisp_AB omsanst_AB ovromstillg_KONC lonekanst_KONC omsattfor_AB_X antal_cfarantal_ort ort

188 колони

Monday, November 22, 2010

1 таблица, 1 ред⇓

7 таблици, 30 реда

Monday, November 22, 2010

1.  показваме  на  една  страница

2.  даваме  на  SOLR  за  иднексация

Monday, November 22, 2010

7 класа + 7 таблици = bloat

Monday, November 22, 2010

по-­‐простопо-­‐бързо

Monday, November 22, 2010

3

Monday, November 22, 2010

клиент  с  кофти  изисквания

Monday, November 22, 2010

“Ще  правим  магазин.  Искам  да  мога  да  добавям  нови  типове  

продукти  и  да  променям  атрибутите  на  съществуващите,  както  и  да  има  търсене  по  тях”

Monday, November 22, 2010

entity-­‐attribute-­‐valueid key value1 name hoodie1 color blue2 name shirt

Monday, November 22, 2010

трудни  заявкигубите  типовеняма  индекси

бавно

Monday, November 22, 2010

сериализиран  обектjson,  yaml,  pickle

Monday, November 22, 2010

никакви  заявкиникакви  индексивъншен  софтуер

Monday, November 22, 2010

Monday, November 22, 2010

1. Проблеми на релационните бази от данни

2. MongoDB отдалеч

3. Работа с MongoDB

4. Предимства и недостатъци

5. Някои приложения

6. MongoDB в живия живот

Monday, November 22, 2010

Monday, November 22, 2010

Monday, November 22, 2010

Monday, November 22, 2010

Въпроси

Monday, November 22, 2010