Защо?
Стефан Кънев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
особен стил
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": "[email protected]" } "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": "[email protected]" }}
Документът...
Monday, November 22, 2010
...и промяната
db.posts.update( {"author.name": "Stefan Kanev"}, {"$set": {"author.email": "[email protected]"}})
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
Top Related