SlideShare uma empresa Scribd logo
1 de 164
Baixar para ler offline
Защо
?
Стефан Кънев
http://skanev.com/
@skanev
OpenFest
21 Ноември 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
210
Monday, 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 Dali
Monday, November 22, 2010
Friendly Mutton Chops
Monday, November 22, 2010
The Real Stuff
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
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, Programmer
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
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
Хубавото в MongoDB
Monday, November 22, 2010
бързо
Monday, November 22, 2010
horizontal	
  scalability
Monday, November 22, 2010
feature-­‐rich
Monday, November 22, 2010
Лошото в MongoDB
Monday, 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
MyISAM
120	
  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_X
lan aretsres_AB kaslikv_AB sparrkonto_KONC omsattfor_KONC oms_KONC_X
kommun likvmed_AB kasflfror_AB maskoinv_KONC forsumtillg_KONC resfbok_KONC_X
bolform kundford_AB avkegkap_AB sumanltillg_KONC regdatum_AB aretsres_KONC_X
ftgnamn varulager_AB avktotkap_AB sumtillg_KONC styrelse_AB sumtillg_KONC_X
copers ovromstillg_AB lonekanst_AB levskuld_KONC histnamn_AB aktiekap_KONC_X
utdadress sumomstillg_AB roresfdisp_AB sumkortfsk_KONC firmteck_AB sumegkap_KONC_X
postnr sparrkonto_AB omsattfor_AB sumlangfsk_KONC bolord_AB netrespoms_KONC_X
postort maskoinv_AB forsumtillg_AB obesres_KONC regdatum_HB vinstmarg_KONC_X
riktnr sumanltillg_AB bokslut_start_KONC aktiekap_KONC styrelse_HB omsanst_KONC_X
abbnr sumtillg_AB bokslut_slut_KONC ovrbundkap_KONC histnamn_HB soliditet_KONC_X
verkstat levskuld_AB aktieutd_KONC obunegkap_KONC firmteck_HB kaslikv_KONC_X
aktivstat sumkortfsk_AB antalanst_KONC sumegkap_KONC bolord_HB avktotkap_KONC_X
sni sumlangfsk_AB lonoers_KONC sumskegkap_KONC status_konk_HB lonekanst_KONC_X
dkm_AB obesres_AB oms_KONC goodwill_KONC status_likv_HB omsattfor_KONC_X
bokslut_start_AB aktiekap_AB resfavskr_KONC panter_KONC sekv_HB bolstatus
bokslut_slut_AB ovrbundkap_AB avskr_KONC ansvar_KONC antalanst_AB_X styrelse_X
aktieutd_AB obunegkap_AB reseavskr_KONC fastigheter_KONC oms_AB_X fbokstav
antalanst_AB sumegkap_AB finint_KONC revanm_KONC resfbok_AB_X bolord_X
lonoers_AB sumskegkap_AB finkostn_KONC ntstart_KONC aretsres_AB_X histnamn_X
oms_AB goodwill_AB resefin_KONC ntslut_KONC sumtillg_AB_X regdatum_X
resfavskr_AB panter_AB extordint_KONC resfavspoms_KONC aktiekap_AB_X koncern_X
avskr_AB ansvar_AB extordkost_KONC netrespoms_KONC sumegkap_AB_X publikt_X
reseavskr_AB fastigheter_AB resfbok_KONC vinstmarg_KONC netrespoms_AB_X kommun_X
finint_AB revanm_AB boksldisp_KONC omsanst_KONC vinstmarg_AB_X senaste_AB
finkostn_AB ntstart_AB skatter_KONC soliditet_KONC omsanst_AB_X senaste_KONC
resefin_AB ntslut_AB aretsres_KONC kaslikv_KONC soliditet_AB_X skod
extordint_AB resfavspoms_AB likvmed_KONC kasflfror_KONC kaslikv_AB_X tkod
extordkost_AB netrespoms_AB kundford_KONC avkegkap_KONC avktotkap_AB_X datum
resfbok_AB vinstmarg_AB varulager_KONC avktotkap_KONC lonekanst_AB_X forgnr
boksldisp_AB omsanst_AB ovromstillg_KONC lonekanst_KONC omsattfor_AB_X antal_cfar
antal_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-­‐value
id key value
1 name hoodie
1 color blue
2 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

Mais conteúdo relacionado

Mais de Stefan Kanev

Как блогът ми ме направи по-добър професионалист
Как блогът ми ме направи по-добър професионалистКак блогът ми ме направи по-добър професионалист
Как блогът ми ме направи по-добър професионалистStefan Kanev
 
Щастливият програмист 2.0
Щастливият програмист 2.0Щастливият програмист 2.0
Щастливият програмист 2.0Stefan Kanev
 
Пак ли този Rails?
Пак ли този Rails?Пак ли този Rails?
Пак ли този Rails?Stefan Kanev
 
The Happy Programmer
The Happy ProgrammerThe Happy Programmer
The Happy ProgrammerStefan Kanev
 
ФМИ Python: Agile & Friends
ФМИ Python: Agile & FriendsФМИ Python: Agile & Friends
ФМИ Python: Agile & FriendsStefan Kanev
 
Behavior-Driven Development с RSpec и Cucumber
Behavior-Driven Development с RSpec и CucumberBehavior-Driven Development с RSpec и Cucumber
Behavior-Driven Development с RSpec и CucumberStefan Kanev
 
Test-Driven Development + Refactoring
Test-Driven Development + RefactoringTest-Driven Development + Refactoring
Test-Driven Development + RefactoringStefan Kanev
 
Защо Ruby on Rails
Защо Ruby on RailsЗащо Ruby on Rails
Защо Ruby on RailsStefan Kanev
 
5. HTTP и приятели
5. HTTP и приятели5. HTTP и приятели
5. HTTP и приятелиStefan Kanev
 
4. Метапрограмиране
4. Метапрограмиране4. Метапрограмиране
4. МетапрограмиранеStefan Kanev
 
3. Обекти и класове
3. Обекти и класове3. Обекти и класове
3. Обекти и класовеStefan Kanev
 
2. Функционални Закачки
2. Функционални Закачки2. Функционални Закачки
2. Функционални ЗакачкиStefan Kanev
 
1. Въведение в Ruby
1. Въведение в Ruby1. Въведение в Ruby
1. Въведение в RubyStefan Kanev
 
0. За курса, Ruby и Rails
0. За курса, Ruby и Rails0. За курса, Ruby и Rails
0. За курса, Ruby и RailsStefan Kanev
 

Mais de Stefan Kanev (18)

Ruby 0 2012
Ruby 0 2012Ruby 0 2012
Ruby 0 2012
 
Ruby 0
Ruby 0Ruby 0
Ruby 0
 
Debugging Habits
Debugging HabitsDebugging Habits
Debugging Habits
 
Как блогът ми ме направи по-добър професионалист
Как блогът ми ме направи по-добър професионалистКак блогът ми ме направи по-добър професионалист
Как блогът ми ме направи по-добър професионалист
 
Щастливият програмист 2.0
Щастливият програмист 2.0Щастливият програмист 2.0
Щастливият програмист 2.0
 
Пак ли този Rails?
Пак ли този Rails?Пак ли този Rails?
Пак ли този Rails?
 
The Happy Programmer
The Happy ProgrammerThe Happy Programmer
The Happy Programmer
 
ФМИ Python: Agile & Friends
ФМИ Python: Agile & FriendsФМИ Python: Agile & Friends
ФМИ Python: Agile & Friends
 
Behavior-Driven Development с RSpec и Cucumber
Behavior-Driven Development с RSpec и CucumberBehavior-Driven Development с RSpec и Cucumber
Behavior-Driven Development с RSpec и Cucumber
 
Test-Driven Development + Refactoring
Test-Driven Development + RefactoringTest-Driven Development + Refactoring
Test-Driven Development + Refactoring
 
за Ruby
за Rubyза Ruby
за Ruby
 
Защо Ruby on Rails
Защо Ruby on RailsЗащо Ruby on Rails
Защо Ruby on Rails
 
5. HTTP и приятели
5. HTTP и приятели5. HTTP и приятели
5. HTTP и приятели
 
4. Метапрограмиране
4. Метапрограмиране4. Метапрограмиране
4. Метапрограмиране
 
3. Обекти и класове
3. Обекти и класове3. Обекти и класове
3. Обекти и класове
 
2. Функционални Закачки
2. Функционални Закачки2. Функционални Закачки
2. Функционални Закачки
 
1. Въведение в Ruby
1. Въведение в Ruby1. Въведение в Ruby
1. Въведение в Ruby
 
0. За курса, Ruby и Rails
0. За курса, Ruby и Rails0. За курса, Ruby и Rails
0. За курса, Ruby и Rails
 

Защо MongoDB?