Превод чланка припремљен је уочи почетка курса
Хигхлигхтс:
- Изузетно је важно развити шему иако је она опциона у МонгоДБ-у.
- Исто тако, индекси морају одговарати вашој шеми и обрасцима приступа.
- Избегавајте коришћење великих објеката и великих низова.
- Будите пажљиви са МонгоДБ поставкама, посебно када су у питању безбедност и поузданост.
- МонгоДБ нема оптимизатор упита, тако да морате бити пажљиви када изводите операције упита.
Радим са базама података веома дуго, али тек недавно сам открио МонгоДБ. Постоји неколико ствари које бих волео да знам пре него што сам почео да радим са тим. Када особа већ има искуство у одређеној области, она има унапред створене идеје о томе шта су базе података и чиме се баве. У нади да ћу другима олакшати разумевање, представљам листу уобичајених грешака.
Креирање МонгоДБ сервера без аутентификације
Нажалост, МонгоДБ се подразумевано инсталира без аутентификације. За радну станицу којој се приступа локално, ова пракса је нормална. Али пошто је МонгоДБ систем за више корисника који воли да користи велике количине меморије, биће боље да га ставите на сервер са што више РАМ-а, чак и ако ћете га користити само за развој. Инсталирање на сервер преко подразумеваног порта може бити проблематично, посебно ако се у захтеву може извршити било који јавасцрипт код (нпр. $where
као идеја за
Постоји неколико метода аутентификације, али најлакше је поставити кориснички ИД/лозинку. Користите ову идеју док размишљате о фенси аутентификацији заснованој на
Не заборавите да повежете површину напада за МонгоДБ
,
или
. Пошто датотеке са подацима нису шифроване у стандардном МонгоДБ-у, има смисла покренути МонгоДБ са њим
Грешка при развоју кола
МонгоДБ не користи шему. Али то не значи да шема није потребна. Ако само желите да складиштите документе без икаквог доследног обрасца, њихово складиштење може бити брзо и лако, али касније њихово преузимање може бити тешко.
Класичан чланак "
Не заборавите редослед сортирања
Заборављање редоследа сортирања може изазвати више фрустрација и губити више времена него било која друга погрешна конфигурација. Подразумевано користи МонгоБД
Креирајте колекције са великим документима
МонгоДБ радо угошћује велике документе до 16МБ у колекцијама, и
Креирање докумената са великим низовима
Документи могу да садрже низове. Најбоље је ако је број елемената у низу далеко од четвороцифреног броја. Ако се елементи често додају низу, он ће прерасти документ који га садржи и мораће да буде
МонгоДБ има нешто што се зове
Можда мислите да можете без индексирања низа. Нажалост, недостатак индекса може узроковати друге проблеме. Пошто се документи скенирају од почетка до краја, тражење елемената на крају низа ће трајати дуже, а већина операција повезаних са таквим документом ће бити
Не заборавите да је редослед фаза у агрегацији важан
У систему базе података са оптимизатором упита, упити које пишете су објашњења шта желите да добијете, а не како да то добијете. Овај механизам функционише по аналогији са наручивањем у ресторану: обично једноставно наручите јело, а не дате детаљна упутства кувару.
У МонгоДБ-у дајете упутства кувару. На пример, морате да се уверите да подаци пролазе reduce
што је раније могуће у цевоводу користећи $match
и $project
, а сортирање се дешава тек након reduce
, и да се претрага одвија тачно редоследом који желите. Поседовање оптимизатора упита који елиминише непотребан рад, оптимално секвенцира кораке и бира типове спајања може да вас размази. Са МонгоДБ, имате више контроле по цену погодности.
Алати попут
Коришћење брзог снимања
Никада немојте постављати опције писања МонгоДБ-а тако да имају велику брзину, али ниску поузданост. Овај режим "фајли-и-заборави" изгледа брзо јер се команда враћа пре него што се упис догоди. Ако се систем сруши пре него што се подаци запишу на диск, биће изгубљени и завршиће у недоследном стању. Срећом, 64-битни МонгоДБ има омогућено евидентирање.
ММАПв1 и ВиредТигер машине за складиштење користе евиденцију да би спречиле ово, иако се ВиредТигер може опоравити до последњег доследног
Вођење дневника осигурава да је база података у конзистентном стању након опоравка и задржава све податке док се не запишу у дневник. Учесталост снимања се конфигурише помоћу параметра
.
Да бисте били сигурни у уносе, уверите се да је евидентирање омогућено у конфигурационој датотеци
, а учесталост снимања одговара количини информација коју можете себи приуштити да изгубите.
Сортирање без индекса
Приликом претраживања и агрегирања често постоји потреба за сортирањем података. Надајмо се да је то учињено у некој од завршних фаза, након филтрирања резултата како би се смањила количина података који се сортирају. Чак иу овом случају, за сортирање ће вам требати
Ако нема одговарајућег индекса, МонгоДБ ће без њега. Постоји ограничење меморије од 32 МБ за укупну величину свих докумената
Претражујте без подршке за индекс
Упити за претрагу обављају функцију сличну операцији ЈОИН у СКЛ-у. Да би најбоље функционисали, потребан им је индекс вредности кључа који се користи као страни кључ. Ово није очигледно јер се употреба не одражава у explain()
. Такви индекси су додатак индексу уписаним explain()
, који заузврат користе оператери цевовода $match
и $sort
, када се сретну на почетку гасовода. Индекси сада могу да покрију било коју фазу
Одбијање коришћења вишеструких ажурирања
метод
користи се за промену дела постојећег документа или целог документа, до потпуне замене, у зависности од параметра који наведете
. Оно што није тако очигледно је да неће обрадити све документе у колекцији осим ако не подесите опцију
да ажурира све документе који испуњавају критеријуме захтева.
Не заборавите на важност редоследа кључева у хеш табели
У ЈСОН-у, објекат се састоји од неуређене колекције величине нула или више парова име/вредност, где је име стринг, а вредност низ, број, логички, нулл, објекат или низ.
Нажалост, БСОН ставља велики нагласак на ред приликом претраживања. У МонгоДБ, редослед кључева унутар уграђених објеката { firstname: "Phil", surname: "factor" }
- ово није исто што и { { surname: "factor", firstname: "Phil" }
. То јест, морате да сачувате редослед парова име/вредност у својим документима ако желите да будете сигурни да ћете их пронаћи.
Немојте збунити "Нула" и "недефинисан"
Вредност "недефинисан" никада није важио у ЈСОН-у, према $null
, што није увек добро решење.
Коришћење $limit()
без $sort()
Често када развијате у МонгоДБ-у, корисно је само видети узорак резултата који ће бити враћен из упита или агрегације. За овај задатак ће вам требати $limit()
, али никада не би требало да буде у коначном коду осим ако га раније не користите $sort
. Овај механичар је неопходан јер у супротном не можете гарантовати редослед резултата и нећете моћи поуздано да видите податке. На врху резултата добићете различите уносе у зависности од сортирања. Да би функционисали поуздано, упити и агрегације морају бити детерминистички, односно да производе исте резултате сваки пут када се изврше. Код који садржи $limit()
, али не $sort
, неће бити детерминистички и може накнадно да изазове грешке којима ће бити тешко ући у траг.
Закључак
Једини начин да будете разочарани МонгоДБ-ом је да га директно упоредите са другом врстом базе података, као што је ДБМС, или да је користите на основу одређених очекивања. То је као да поредите наранџу са виљушком. Системи база података служе специфичним сврхама. Најбоље је да једноставно сами разумете и цените ове разлике. Била би штета вршити притисак на програмере МонгоДБ-а због путање која их је натерала да крену путем ДБМС-а. Желим да видим нове и занимљиве начине за решавање старих проблема, као што је осигурање интегритета података и креирање система података који су отпорни на неуспех и злонамерне нападе.
МонгоДБ-ово увођење АЦИД трансакције у верзију 4.0 је добар пример увођења важних побољшања на иновативан начин. Трансакције са више докумената и више изјава су сада атомске. Такође је могуће подесити време потребно за стицање закључавања и окончање заглављених трансакција, као и промену нивоа изолације.
Опширније:
Извор: ввв.хабр.цом