14 ствари које бих волео да знам пре него што почнем са МонгоДБ-ом

Превод чланка припремљен је уочи почетка курса „Нерелационе базе података“.

14 ствари које бих волео да знам пре него што почнем са МонгоДБ-ом

Хигхлигхтс:

  • Изузетно је важно развити шему иако је она опциона у МонгоДБ-у.
  • Исто тако, индекси морају одговарати вашој шеми и обрасцима приступа.
  • Избегавајте коришћење великих објеката и великих низова.
  • Будите пажљиви са МонгоДБ поставкама, посебно када су у питању безбедност и поузданост.
  • МонгоДБ нема оптимизатор упита, тако да морате бити пажљиви када изводите операције упита.

Радим са базама података веома дуго, али тек недавно сам открио МонгоДБ. Постоји неколико ствари које бих волео да знам пре него што сам почео да радим са тим. Када особа већ има искуство у одређеној области, она има унапред створене идеје о томе шта су базе података и чиме се баве. У нади да ћу другима олакшати разумевање, представљам листу уобичајених грешака.

Креирање МонгоДБ сервера без аутентификације

Нажалост, МонгоДБ се подразумевано инсталира без аутентификације. За радну станицу којој се приступа локално, ова пракса је нормална. Али пошто је МонгоДБ систем за више корисника који воли да користи велике количине меморије, биће боље да га ставите на сервер са што више РАМ-а, чак и ако ћете га користити само за развој. Инсталирање на сервер преко подразумеваног порта може бити проблематично, посебно ако се у захтеву може извршити било који јавасцрипт код (нпр. $where као идеја за ињекције).

Постоји неколико метода аутентификације, али најлакше је поставити кориснички ИД/лозинку. Користите ову идеју док размишљате о фенси аутентификацији заснованој на ЛДАП. Када је у питању безбедност, МонгоДБ би требало стално да се ажурира, а евиденције увек треба проверавати да ли има неовлашћеног приступа. На пример, волим да изаберем други порт као подразумевани порт.

Не заборавите да повежете површину напада за МонгоДБ

МонгоДБ безбедносна контролна листа садржи добре савете за смањење ризика од упада у мрежу и цурења података. Лако је то одбацити и рећи да развојном серверу није потребан висок ниво безбедности. Међутим, то није тако једноставно и ово се односи на све МонгоДБ сервере. Посебно, ако нема убедљивог разлога за коришћење mapReduce, group или $где, потребно је да онемогућите употребу произвољног кода у ЈаваСцрипт-у уписивањем у конфигурациони фајл javascriptEnabled:false. Пошто датотеке са подацима нису шифроване у стандардном МонгоДБ-у, има смисла покренути МонгоДБ са њим Дедицатед Усер, који има пун приступ датотекама, са ограниченим приступом само њему и могућношћу коришћења сопствених контрола приступа датотекама оперативног система.

Грешка при развоју кола

МонгоДБ не користи шему. Али то не значи да шема није потребна. Ако само желите да складиштите документе без икаквог доследног обрасца, њихово складиштење може бити брзо и лако, али касније њихово преузимање може бити тешко. проклето тешко.

Класичан чланак "6 правила палца за дизајн МонгоДБ шеме" Вреди га прочитати, а карактеристике попут Сцхема Екплорер у алату треће стране Студио 3Т, вреди га користити за редовне провере кола.

Не заборавите редослед сортирања

Заборављање редоследа сортирања може изазвати више фрустрација и губити више времена него било која друга погрешна конфигурација. Подразумевано користи МонгоБД бинарно сортирање. Али мало је вероватно да ће то некоме бити корисно. Бинарне сорте које су осетљиве на велика и мала слова, биле су необичне анахронизме заједно са перлама, кафтанима и коврџавим брковима још 80-их година прошлог века. Сада је њихова употреба неопростива. У стварном животу, "мотоцикл" је исто што и "мотоцикл". А „Британија“ и „Британија“ су исто место. Мало слово је једноставно велико слово еквивалентно великом слову. И немој да почнем са сортирањем дијакритичких знакова. Када креирате базу података у МонгоДБ, користите упоређивање без акцента и регистровати, који одговарају језику и култура корисника система. Ово ће знатно олакшати претрагу низ података.

Креирајте колекције са великим документима

МонгоДБ радо угошћује велике документе до 16МБ у колекцијама, и ГридФС Дизајниран за велике документе веће од 16 МБ. Али само зато што се велики документи могу ставити тамо, њихово складиштење није добра идеја. МонгоДБ ће најбоље функционисати ако складиштите појединачне документе величине неколико килобајта, третирајући их више као редове у широкој СКЛ табели. Велики документи ће бити извор проблема са продуктивности.

Креирање докумената са великим низовима

Документи могу да садрже низове. Најбоље је ако је број елемената у низу далеко од четвороцифреног броја. Ако се елементи често додају низу, он ће прерасти документ који га садржи и мораће да буде потез, што значи да ће бити неопходно ажурирати и индексе. Када поново индексирате документ са великим низом, индекси ће често бити преписани, јер постоји запис, који чува свој индекс. Ово поновно индексирање се такође дешава када се документ убаци или избрише.

МонгоДБ има нешто што се зове "фактор пуњења", што пружа простор за раст докумената како би се овај проблем свео на минимум.
Можда мислите да можете без индексирања низа. Нажалост, недостатак индекса може узроковати друге проблеме. Пошто се документи скенирају од почетка до краја, тражење елемената на крају низа ће трајати дуже, а већина операција повезаних са таквим документом ће бити спор.

Не заборавите да је редослед фаза у агрегацији важан

У систему базе података са оптимизатором упита, упити које пишете су објашњења шта желите да добијете, а не како да то добијете. Овај механизам функционише по аналогији са наручивањем у ресторану: обично једноставно наручите јело, а не дате детаљна упутства кувару.

У МонгоДБ-у дајете упутства кувару. На пример, морате да се уверите да подаци пролазе reduce што је раније могуће у цевоводу користећи $match и $project, а сортирање се дешава тек након reduce, и да се претрага одвија тачно редоследом који желите. Поседовање оптимизатора упита који елиминише непотребан рад, оптимално секвенцира кораке и бира типове спајања може да вас размази. Са МонгоДБ, имате више контроле по цену погодности.

Алати попут Студио 3Т ће поједноставити конструкцију агрегационих упита у МонгоДБ. Функција уређивача агрегације вам омогућава да примените наредбе цевовода једну по једну фазу и прегледате улазне и излазне податке у свакој фази да бисте поједноставили отклањање грешака.

Коришћење брзог снимања

Никада немојте постављати опције писања МонгоДБ-а тако да имају велику брзину, али ниску поузданост. Овај режим "фајли-и-заборави" изгледа брзо јер се команда враћа пре него што се упис догоди. Ако се систем сруши пре него што се подаци запишу на диск, биће изгубљени и завршиће у недоследном стању. Срећом, 64-битни МонгоДБ има омогућено евидентирање.

ММАПв1 и ВиредТигер машине за складиштење користе евиденцију да би спречиле ово, иако се ВиредТигер може опоравити до последњег доследног контролна тачка, ако је евидентирање онемогућено.

Вођење дневника осигурава да је база података у конзистентном стању након опоравка и задржава све податке док се не запишу у дневник. Учесталост снимања се конфигурише помоћу параметра commitIntervalMs.

Да бисте били сигурни у уносе, уверите се да је евидентирање омогућено у конфигурационој датотеци (storage.journal.enabled), а учесталост снимања одговара количини информација коју можете себи приуштити да изгубите.

Сортирање без индекса

Приликом претраживања и агрегирања често постоји потреба за сортирањем података. Надајмо се да је то учињено у некој од завршних фаза, након филтрирања резултата како би се смањила количина података који се сортирају. Чак иу овом случају, за сортирање ће вам требати indeks. Можете користити појединачни или сложени индекс.

Ако нема одговарајућег индекса, МонгоДБ ће без њега. Постоји ограничење меморије од 32 МБ за укупну величину свих докумената операције сортирања, и ако МонгоДБ достигне ову границу, онда ће или дати грешку или ће се вратити празан сет записа.

Претражујте без подршке за индекс

Упити за претрагу обављају функцију сличну операцији ЈОИН у СКЛ-у. Да би најбоље функционисали, потребан им је индекс вредности кључа који се користи као страни кључ. Ово није очигледно јер се употреба не одражава у explain(). Такви индекси су додатак индексу уписаним explain(), који заузврат користе оператери цевовода $match и $sort, када се сретну на почетку гасовода. Индекси сада могу да покрију било коју фазу агрегациони цевовод.

Одбијање коришћења вишеструких ажурирања

метод db.collection.update() користи се за промену дела постојећег документа или целог документа, до потпуне замене, у зависности од параметра који наведете update. Оно што није тако очигледно је да неће обрадити све документе у колекцији осим ако не подесите опцију multi да ажурира све документе који испуњавају критеријуме захтева.

Не заборавите на важност редоследа кључева у хеш табели

У ЈСОН-у, објекат се састоји од неуређене колекције величине нула или више парова име/вредност, где је име стринг, а вредност низ, број, логички, нулл, објекат или низ.

Нажалост, БСОН ставља велики нагласак на ред приликом претраживања. У МонгоДБ, редослед кључева унутар уграђених објеката питањатј. { firstname: "Phil", surname: "factor" } - ово није исто што и { { surname: "factor", firstname: "Phil" }. То јест, морате да сачувате редослед парова име/вредност у својим документима ако желите да будете сигурни да ћете их пронаћи.

Немојте збунити "Нула" и "недефинисан"

Вредност "недефинисан" никада није важио у ЈСОН-у, према званични стандард ЈСОН (ЕЦМА-404 одељак 5), иако се користи у ЈаваСцрипт-у. Штавише, за БСОН је застарео и конвертован је у $null, што није увек добро решење. Избегавајте коришћење "недефинисан" у МонгоДБ.

Коришћење $limit() без $sort()

Често када развијате у МонгоДБ-у, корисно је само видети узорак резултата који ће бити враћен из упита или агрегације. За овај задатак ће вам требати $limit(), али никада не би требало да буде у коначном коду осим ако га раније не користите $sort. Овај механичар је неопходан јер у супротном не можете гарантовати редослед резултата и нећете моћи поуздано да видите податке. На врху резултата добићете различите уносе у зависности од сортирања. Да би функционисали поуздано, упити и агрегације морају бити детерминистички, односно да производе исте резултате сваки пут када се изврше. Код који садржи $limit(), али не $sort, неће бити детерминистички и може накнадно да изазове грешке којима ће бити тешко ући у траг.

Закључак

Једини начин да будете разочарани МонгоДБ-ом је да га директно упоредите са другом врстом базе података, као што је ДБМС, или да је користите на основу одређених очекивања. То је као да поредите наранџу са виљушком. Системи база података служе специфичним сврхама. Најбоље је да једноставно сами разумете и цените ове разлике. Била би штета вршити притисак на програмере МонгоДБ-а због путање која их је натерала да крену путем ДБМС-а. Желим да видим нове и занимљиве начине за решавање старих проблема, као што је осигурање интегритета података и креирање система података који су отпорни на неуспех и злонамерне нападе.

МонгоДБ-ово увођење АЦИД трансакције у верзију 4.0 је добар пример увођења важних побољшања на иновативан начин. Трансакције са више докумената и више изјава су сада атомске. Такође је могуће подесити време потребно за стицање закључавања и окончање заглављених трансакција, као и промену нивоа изолације.

14 ствари које бих волео да знам пре него што почнем са МонгоДБ-ом

Опширније:

Извор: ввв.хабр.цом

Додај коментар