MongoDB қолданбасын бастамас бұрын білгім келетін 14 нәрсе

Мақаланың аудармасы курстың басталу қарсаңында дайындалды «Реляциялық емес деректер қоры».

MongoDB қолданбасын бастамас бұрын білгім келетін 14 нәрсе

Негізгі оқиғалар:

  • MongoDB-де міндетті емес болса да, схеманы әзірлеу өте маңызды.
  • Сол сияқты, индекстер схемаға және қатынас үлгілеріңізге сәйкес келуі керек.
  • Үлкен нысандар мен үлкен массивтерді пайдаланбаңыз.
  • MongoDB параметрлерімен абай болыңыз, әсіресе қауіпсіздік пен сенімділікке қатысты.
  • MongoDB-де сұрауды оңтайландырушы жоқ, сондықтан сұрау әрекеттерін орындау кезінде абай болу керек.

Мен дерекқорлармен өте ұзақ уақыт жұмыс істеп келемін, бірақ MongoDB жақында ғана ашылды. Мен онымен жұмыс жасамас бұрын білгім келетін бірнеше нәрсе бар. Адамның белгілі бір салада тәжірибесі болған кезде, оларда деректер базасы деген не және олар не істейтіні туралы алдын ала түсініктер болады. Басқаларға түсінуді жеңілдету үшін мен жиі кездесетін қателердің тізімін ұсынамын.

MongoDB серверін аутентификациясыз жасау

Өкінішке орай, MongoDB әдепкі бойынша аутентификациясыз орнатылады. Жергілікті қолжетімді жұмыс станциясы үшін бұл тәжірибе қалыпты. Бірақ MongoDB жадтың үлкен көлемін пайдалануды ұнататын көп пайдаланушылық жүйе болғандықтан, оны тек әзірлеу үшін пайдаланғыңыз келсе де, мүмкіндігінше жедел жады бар серверге қойғаныңыз жақсы болады. Әдепкі порт арқылы серверге орнату қиын болуы мүмкін, әсіресе сұрауда кез келген JavaScript кодын орындауға болатын болса (мысалы, $where үшін идея ретінде инъекциялар).

Аутентификацияның бірнеше әдістері бар, бірақ ең оңайы - пайдаланушы идентификаторын/құпия сөзді орнату. Осы идеяға негізделген сәнді аутентификация туралы ойлаған кезде пайдаланыңыз LDAP. Қауіпсіздікке келетін болсақ, MongoDB үнемі жаңартылып отыруы керек және журналдар әрқашан рұқсатсыз кіру үшін тексерілуі керек. Мысалы, мен әдепкі порт ретінде басқа портты таңдағым келеді.

Шабуыл бетін MongoDB-ге байланыстыруды ұмытпаңыз

MongoDB қауіпсіздік тексеру тізімі желіге кіру және деректердің ағып кету қаупін азайтуға арналған жақсы кеңестерді қамтиды. Оны жою және әзірлеу серверіне қауіпсіздіктің жоғары деңгейін қажет етпейтінін айту оңай. Дегенмен, бұл қарапайым емес және бұл барлық MongoDB серверлеріне қатысты. Атап айтқанда, пайдаланудың бұлтартпас себебі болмаса mapReduce, group немесе $қайда, конфигурация файлына жазу арқылы JavaScript-те ерікті кодты пайдалануды өшіру керек javascriptEnabled:false. Деректер файлдары стандартты MongoDB жүйесінде шифрланбағандықтан, MongoDB көмегімен іске қосу мағынасы бар Арнайы пайдаланушы, файлдарға толық рұқсаты бар, тек оған қол жеткізу шектелген және операциялық жүйенің файлға қол жеткізуді басқару элементтерін пайдалану мүмкіндігі бар.

Схеманы әзірлеу кезіндегі қате

MongoDB схеманы пайдаланбайды. Бірақ бұл схема қажет емес дегенді білдірмейді. Құжаттарды дәйекті үлгісіз сақтағыңыз келсе, оларды сақтау жылдам әрі оңай болуы мүмкін, бірақ оларды кейінірек шығарып алу қиын болуы мүмкін. қатты.

Классикалық мақала »MongoDB схемасын жобалауға арналған 6 негізгі ережелер» Бұл оқуға тұрарлық, және сияқты мүмкіндіктер Схема Explorer үшінші тараптың Studio 3T құралында тізбектерді үнемі тексеру үшін пайдаланған жөн.

Сұрыптау тәртібін ұмытпаңыз

Сұрыптау ретін ұмыту кез келген басқа дұрыс емес конфигурацияға қарағанда көбірек көңілсіздік пен уақытты жоғалтуы мүмкін. Әдепкі бойынша MongoBD пайдаланады екілік сұрыптау. Бірақ оның ешкімге пайдалы болуы екіталай. Регистрге сезімтал, екпінге сезімтал, бинарлық сорттар өткен ғасырдың 80-жылдарында моншақтармен, кафтандармен және бұйра мұрттармен бірге қызықты анахронизмдер болып саналды. Енді оларды пайдалану кешірілмейді. Шынайы өмірде «мотоцикл» «Мотоциклмен» бірдей. Ал «Британия» мен «Ұлыбритания» бір жер. Кіші әріп – жай әріптің бас әріптік баламасы. Мені диакритиктерді сұрыптауға кіріспеңіз. MongoDB жүйесінде дерекқорды жасағанда, екпінді сезбейтін сұрыптауды пайдаланыңыз және тіркелу, тілге сәйкес келетін және жүйені пайдаланушы мәдениеті. Бұл жол деректері арқылы іздеуді әлдеқайда жеңілдетеді.

Үлкен құжаттармен жинақтар жасаңыз

MongoDB коллекцияларда 16 МБ дейінгі үлкен құжаттарды орналастыруға қуанышты және GridFS Көлемі 16 МБ-тан асатын үлкен құжаттарға арналған. Бірақ ол жерде үлкен құжаттарды орналастыруға болатындықтан, оларды сақтау жақсы идея емес. Өлшемі бірнеше килобайт болатын жеке құжаттарды сақтасаңыз, оларды кең SQL кестесіндегі жолдар сияқты қарастырсаңыз, MongoDB жақсы жұмыс істейді. Үлкен құжаттар проблемалардың көзі болады өнімділік.

Үлкен массивтері бар құжаттарды құру

Құжаттарда массивтер болуы мүмкін. Жиымдағы элементтер саны төрт таңбалы саннан алыс болса жақсы. Егер массивке элементтер жиі қосылса, ол оны қамтитын құжаттан асып түседі және келесідей болуы керек. жылжыту, бұл қажет болады дегенді білдіреді индекстерді де жаңартыңыз. Үлкен массиві бар құжатты қайта индекстеу кезінде индекстер жиі қайта жазылады, себебі бар кіру, ол оның индексін сақтайды. Бұл қайта индекстеу құжатты кірістіру немесе жою кезінде де орын алады.

MongoDB деп аталатын нәрсе бар «толтыру факторы», бұл мәселені азайту үшін құжаттардың өсуіне мүмкіндік береді.
Сіз массивтерді индекстеусіз жасай аласыз деп ойлауыңыз мүмкін. Өкінішке орай, индекстердің болмауы басқа мәселелерге әкелуі мүмкін. Құжаттар басынан аяғына дейін сканерленетіндіктен, массивтің соңындағы элементтерді іздеу ұзағырақ уақыт алады және мұндай құжатпен байланысты операциялардың көпшілігі баяу.

Агрегациядағы кезеңдердің реті маңызды екенін ұмытпаңыз

Сұрауларды оңтайландырғышы бар дерекқор жүйесінде сіз жазған сұраулар оны қалай алуға болатынын емес, алғыңыз келетін нәрсені түсіндіреді. Бұл механизм мейрамханада тапсырыс беруге ұқсас жұмыс істейді: әдетте сіз жай ғана тағамға тапсырыс бересіз және аспазға егжей-тегжейлі нұсқаулар бермейсіз.

MongoDB-де сіз аспазға нұсқау бересіз. Мысалы, деректердің өтетініне көз жеткізу керек reduce пайдалану құбырында мүмкіндігінше ертерек $match и $project, және сұрыптау кейін ғана орын алады reduce, және іздеу дәл сіз қалаған ретпен орындалады. Қажетсіз жұмыстарды болдырмайтын, қадамдарды оңтайлы ретке келтіретін және біріктіру түрлерін таңдайтын сұрауды оңтайландырғыштың болуы сізді бұзуы мүмкін. MongoDB көмегімен сіз ыңғайлылық құнына көбірек бақылауға ие боласыз.

сияқты құралдар Studio 3T ішінде жинақтау сұрауларының құрылысын жеңілдетеді MongoDB. Агрегация өңдегіші мүмкіндігі бір уақытта бір кезеңде конвейер мәлімдемелерін қолдануға және оңай түзету үшін әрбір кезеңде кіріс және шығыс деректерін тексеруге мүмкіндік береді.

Жылдам жазуды пайдалану

Ешқашан MongoDB жазу опцияларын жылдамдығы жоғары, бірақ сенімділігі төмен етіп орнатпаңыз. Бұл режим «файл және ұмыту» пәрмен жазу орындалмай тұрып қайтарылғандықтан жылдам болып көрінеді. Деректер дискіге жазылмай тұрып жүйе бұзылса, ол жоғалады және сәйкес келмейтін күйге түседі. Бақытымызға орай, 64-биттік MongoDB жүйесінде журнал жүргізу қосылған.

MMAPv1 және WiredTiger сақтау механизмдері бұның алдын алу үшін журналды пайдаланады, дегенмен WiredTiger соңғы тұрақтыға дейін қалпына келтіре алады. бақылау нүктесі, журналға жазу өшірілген болса.

Журнал жүргізу қалпына келтірілгеннен кейін дерекқордың дәйекті күйде болуын қамтамасыз етеді және журналға жазылғанша барлық деректерді сақтайды. Жазбалардың жиілігі параметр арқылы конфигурацияланады commitIntervalMs.

Жазбаларға сенімді болу үшін конфигурация файлында журнал жүргізу қосылғанын тексеріңіз (storage.journal.enabled), ал жазбалар жиілігі жоғалтуға болатын ақпарат көлеміне сәйкес келеді.

Индекссіз сұрыптау

Іздеу және жинақтау кезінде деректерді сұрыптау қажеттілігі жиі туындайды. Бұл сұрыпталатын деректер көлемін азайту үшін нәтижені сүзгілеуден кейін соңғы кезеңдердің бірінде орындалады деп үміттенейік. Және бұл жағдайда да сұрыптау үшін сізге қажет болады индекс. Жалғыз немесе құрама индексті пайдалануға болады.

Сәйкес индекс болмаса, MongoDB онсыз жасайды. Барлық құжаттардың жалпы өлшеміне 32 Мбайт жад шегі бар сұрыптау операциялары, және MongoDB осы шекке жетсе, ол қате жібереді немесе қайтарады бос жазбалар жинағы.

Индекс қолдауынсыз іздеу

Іздеу сұраулары SQL тіліндегі JOIN операциясына ұқсас функцияны орындайды. Жақсы жұмыс істеу үшін оларға сыртқы кілт ретінде пайдаланылатын кілт мәнінің индексі қажет. Бұл анық емес, өйткені пайдалану көрсетілмейді explain(). Мұндай индекстер жазылған индекске қосымша болып табылады explain(), оны өз кезегінде құбыр операторлары пайдаланады $match и $sort, олар құбырдың басында кездескен кезде. Енді индекстер кез келген кезеңді қамтуы мүмкін жинақтау құбыры.

Көп жаңартуларды пайдаланудан бас тарту

Әдіс db.collection.update() бар құжаттың бір бөлігін немесе сіз көрсеткен параметрге байланысты толық ауыстыруға дейін бүкіл құжатты өзгерту үшін пайдаланылады. update. Опцияны орнатпасаңыз, ол жинақтағы барлық құжаттарды өңдемейтіні соншалықты анық емес multi сұрау критерийлеріне сәйкес келетін барлық құжаттарды жаңарту.

Хэш кестесіндегі кілттер ретінің маңыздылығын ұмытпаңыз

JSON жүйесінде нысан нөл өлшемді немесе одан да көп атау/мән жұптарының ретсіз жиынынан тұрады, мұнда атау - жол және мән - жол, сан, логикалық, нөлдік, нысан немесе массив.

Өкінішке орай, BSON іздеу кезінде тапсырысқа көп көңіл бөледі. MongoDB ішінде кірістірілген нысандардағы кілттердің реті мәселелеряғни, { firstname: "Phil", surname: "factor" } - бұл бірдей емес { { surname: "factor", firstname: "Phil" }. Яғни, сіз олардың табылғаныңызға сенімді болғыңыз келсе, құжаттарыңызда атау/мән жұптарының ретін сақтауыңыз керек.

Шатаспаңыз "нөл" и «белгісіз»

құн «белгісіз» сәйкес JSON-де ешқашан жарамсыз болды ресми стандарт JSON (ECMA-404 5-бөлім), ол JavaScript-те қолданылса да. Оның үстіне, BSON үшін ол ескірген және түрлендіріледі $null, бұл әрқашан жақсы шешім емес. Қолданудан аулақ болыңыз «белгісіз» MongoDB ішінде.

Пайдаланыңыз $limit() жоқ $sort()

Сіз MongoDB-де дамып жатқанда жиі сұраудан немесе жинақтаудан қайтарылатын нәтиже үлгісін көру пайдалы. Бұл тапсырма үшін сізге қажет $limit(), бірақ бұрын пайдаланбасаңыз, ол ешқашан соңғы кодта болмауы керек $sort. Бұл механик қажет, өйткені әйтпесе нәтиже ретіне кепілдік бере алмайсыз және деректерді сенімді түрде көре алмайсыз. Нәтиженің жоғарғы жағында сұрыптауға байланысты әртүрлі жазбалар аласыз. Сенімді жұмыс істеу үшін сұраулар мен біріктірулер детерминирленген болуы керек, яғни олар орындалған сайын бірдей нәтижелер береді. Құрамында код $limit(), бірақ жоқ $sort, детерминирленген болмайды және кейіннен қадағалау қиын болатын қателерді тудыруы мүмкін.

қорытынды

MongoDB-тен көңілін қалдырудың жалғыз жолы - оны ДҚБЖ сияқты дерекқордың басқа түрімен тікелей салыстыру немесе белгілі бір күтулерге негізделген оны пайдалануға келу. Бұл апельсинді шанышқымен салыстыру сияқты. Мәліметтер базасы жүйелері белгілі бір мақсаттарға қызмет етеді. Бұл айырмашылықтарды өзіңіз түсініп, бағалағаныңыз дұрыс. MongoDB әзірлеушілеріне оларды ДҚБЖ жолынан төмен түсіретін жолға қысым жасау ұят болар еді. Деректер тұтастығын қамтамасыз ету және сәтсіздікке және зиянды шабуылдарға төзімді деректер жүйелерін құру сияқты ескі мәселелерді шешудің жаңа және қызықты жолдарын көргім келеді.

MongoDB ACID транзакциялық мүмкіндігін 4.0 нұсқасында енгізуі инновациялық жолмен маңызды жақсартуларды енгізудің жақсы мысалы болып табылады. Көп құжатты және көп мәлімдемелі транзакциялар енді атомдық болып табылады. Сондай-ақ құлыптарды алу және тұрып қалған транзакцияларды тоқтату үшін қажетті уақытты реттеуге, сондай-ақ оқшаулау деңгейін өзгертуге болады.

MongoDB қолданбасын бастамас бұрын білгім келетін 14 нәрсе

Ары қарай оқу:

Ақпарат көзі: www.habr.com

пікір қалдыру