14 peth yr hoffwn pe bawn yn eu gwybod cyn dechrau gyda MongoDB

Paratowyd y cyfieithiad o'r erthygl ar y noson cyn dechrau'r cwrs "Cronfeydd data nad ydynt yn perthyn".

14 peth yr hoffwn pe bawn yn eu gwybod cyn dechrau gyda MongoDB

Uchafbwyntiau:

  • Mae'n hynod bwysig datblygu sgema er ei fod yn ddewisol yn MongoDB.
  • Yn yr un modd, rhaid i fynegeion gyd-fynd â'ch sgema a'ch patrymau mynediad.
  • Ceisiwch osgoi defnyddio gwrthrychau mawr ac araeau mawr.
  • Byddwch yn ofalus gyda gosodiadau MongoDB, yn enwedig o ran diogelwch a dibynadwyedd.
  • Nid oes gan MongoDB optimizer ymholiad, felly rhaid i chi fod yn ofalus wrth berfformio gweithrediadau ymholiad.

Rwyf wedi bod yn gweithio gyda chronfeydd data ers amser maith, ond dim ond yn ddiweddar y darganfuwyd MongoDB. Mae yna ychydig o bethau yr hoffwn pe bawn i'n eu gwybod cyn i mi ddechrau gweithio gydag ef. Pan fydd gan berson brofiad mewn maes penodol eisoes, mae ganddo ragdybiaethau ynghylch beth yw cronfeydd data a beth mae'n ei wneud. Yn y gobaith o'i gwneud hi'n haws i eraill ddeall, rwy'n cyflwyno rhestr o gamgymeriadau cyffredin.

Creu gweinydd MongoDB heb ddilysu

Yn anffodus, mae MongoDB wedi'i osod heb ddilysu yn ddiofyn. Ar gyfer gweithfan y ceir mynediad iddi'n lleol, mae'r arfer hwn yn normal. Ond gan fod MongoDB yn system aml-ddefnyddiwr sy'n hoffi defnyddio llawer iawn o gof, bydd yn well ei roi ar weinydd gyda chymaint o RAM â phosib, hyd yn oed os mai dim ond ar gyfer datblygu y byddwch chi'n ei ddefnyddio. Gall gosod ar y gweinydd trwy'r porth rhagosodedig fod yn broblemus, yn enwedig os gellir gweithredu unrhyw god javascript yn y cais (er enghraifft, $where fel syniad ar gyfer pigiadau).

Mae yna sawl dull dilysu, ond yr hawsaf yw gosod ID defnyddiwr / cyfrinair. Defnyddiwch y syniad hwn wrth i chi feddwl am ddilysu ffansi yn seiliedig ar LDAP. O ran diogelwch, dylid diweddaru MongoDB yn gyson, a dylid gwirio logiau bob amser am fynediad heb awdurdod. Er enghraifft, rwy'n hoffi dewis porthladd gwahanol fel y porthladd rhagosodedig.

Peidiwch ag anghofio rhwymo'r wyneb ymosod i MongoDB

Rhestr Wirio Diogelwch MongoDB yn cynnwys awgrymiadau da ar gyfer lleihau'r risg o ymyrraeth rhwydwaith a gollyngiad data. Mae'n hawdd ei ddileu a dweud nad oes angen lefel uchel o ddiogelwch ar weinydd datblygu. Fodd bynnag, nid yw mor syml â hynny ac mae hyn yn berthnasol i holl weinyddion MongoDB. Yn benodol, os nad oes rheswm cymhellol i'w ddefnyddio mapReduce, group neu $lle, mae angen i chi analluogi'r defnydd o god mympwyol yn JavaScript trwy ysgrifennu yn y ffeil ffurfweddu javascriptEnabled:false. Gan nad yw ffeiliau data wedi'u hamgryptio yn MongoDB safonol, mae'n gwneud synnwyr rhedeg MongoDB gyda nhw Defnyddiwr Neilltuol, sydd â mynediad llawn i ffeiliau, gyda mynediad cyfyngedig yn unig iddynt a'r gallu i ddefnyddio rheolaethau mynediad ffeil y system weithredu ei hun.

Gwall wrth ddatblygu'r gylched

Nid yw MongoDB yn defnyddio sgema. Ond nid yw hyn yn golygu nad oes angen y cynllun. Os ydych chi eisiau storio dogfennau heb unrhyw batrwm cyson, gall eu storio fod yn gyflym ac yn hawdd, ond gall fod yn anodd eu hadalw yn ddiweddarach. damn caled.

Erthygl glasurol "6 Rheol Bawd ar gyfer Dylunio Sgema MongoDB" Mae'n werth ei ddarllen, a nodweddion fel Archwiliwr Sgema yn yr offeryn trydydd parti Studio 3T, mae'n werth ei ddefnyddio ar gyfer gwiriadau rheolaidd o gylchedau.

Peidiwch ag anghofio y drefn

Gall anghofio trefn ddidoli achosi mwy o rwystredigaeth a gwastraffu mwy o amser nag unrhyw ffurfweddiad anghywir arall. Yn ddiofyn mae MongoBD yn defnyddio didoli deuaidd. Ond mae'n annhebygol o fod yn ddefnyddiol i unrhyw un. Roedd mathau deuaidd, sensitif i acen, yn cael eu hystyried yn anacroniaeth chwilfrydig ynghyd â gleiniau, caftans a mwstas cyrliog yn ôl yn 80au'r ganrif ddiwethaf. Nawr mae eu defnydd yn anfaddeuol. Mewn bywyd go iawn, mae "beic modur" yr un peth â "Beic modur". Ac mae “Prydain” a “Prydain” yr un lle. Yn syml, mae llythyren fach yn cyfateb i briflythyren. A pheidiwch â'm rhoi ar ben ffordd ar ddidoli diacritig. Wrth greu cronfa ddata yn MongoDB, defnyddiwch goladu acen-ansensitif a cofrestr, sy'n cyfateb i'r iaith a diwylliant defnyddwyr system. Bydd hyn yn gwneud chwilio trwy ddata llinynnol yn llawer haws.

Creu casgliadau gyda dogfennau mawr

Mae MongoDB yn hapus i gynnal dogfennau mawr hyd at 16MB mewn casgliadau, a GridFS Wedi'i gynllunio ar gyfer dogfennau mawr sy'n fwy na 16 MB. Ond dim ond oherwydd y gellir gosod dogfennau mawr yno, nid yw'n syniad da eu storio. Bydd MongoDB yn gweithio orau os ydych chi'n storio dogfennau unigol sydd ychydig o kilobytes o ran maint, gan eu trin yn debycach i resi mewn tabl SQL eang. Bydd dogfennau mawr yn ffynhonnell problemau gyda cynhyrchiant.

Creu dogfennau gydag araeau mawr

Gall dogfennau gynnwys araeau. Mae'n well os yw nifer yr elfennau yn yr arae ymhell o fod yn rhif pedwar digid. Os caiff elfennau eu hychwanegu at arae yn aml, bydd yn tyfu'n rhy fawr i'r ddogfen sy'n ei chynnwys a bydd angen iddi fod symud, sy'n golygu y bydd yn angenrheidiol diweddaru mynegeion hefyd. Wrth ail-fynegeio dogfen gydag amrywiaeth fawr, bydd y mynegeion yn aml yn cael eu trosysgrifo, gan fod cofnod, sy'n storio ei fynegai. Mae'r ail-fynegeio hwn hefyd yn digwydd pan fydd dogfen yn cael ei mewnosod neu ei dileu.

Mae gan MongoDB rywbeth o'r enw "Ffactor llenwi", sy'n rhoi lle i ddogfennau dyfu i leihau'r broblem hon.
Efallai y byddwch chi'n meddwl y gallwch chi wneud heb fynegeio arae. Yn anffodus, gall diffyg mynegeion achosi problemau eraill i chi. Gan fod dogfennau'n cael eu sganio o'r dechrau i'r diwedd, bydd chwilio am elfennau ar ddiwedd yr arae yn cymryd mwy o amser, a bydd y rhan fwyaf o weithrediadau sy'n gysylltiedig â dogfen o'r fath yn araf.

Peidiwch ag anghofio bod trefn y camau mewn cydgrynhoi yn bwysig

Mewn system cronfa ddata gydag optimizer ymholiad, mae'r ymholiadau rydych chi'n eu hysgrifennu yn esboniadau o'r hyn rydych chi am ei gael, nid sut i'w gael. Mae'r mecanwaith hwn yn gweithio trwy gyfatebiaeth ag archebu mewn bwyty: fel arfer rydych chi'n archebu pryd yn unig, ac nid yw'n rhoi cyfarwyddiadau manwl i'r cogydd.

Yn MongoDB, rydych chi'n cyfarwyddo'r cogydd. Er enghraifft, mae angen i chi sicrhau bod y data'n mynd drwodd reduce cyn gynted â phosibl ar y gweill gan ddefnyddio $match и $project, a didoli yn digwydd dim ond ar ôl reduce, a bod y chwiliad yn digwydd yn yr union drefn rydych chi ei eisiau. Gall cael optimizer ymholiad sy'n dileu gwaith diangen, yn dilyniannu camau yn y ffordd orau bosibl, ac yn dewis mathau o uno eich difetha. Gyda MongoDB, mae gennych fwy o reolaeth ar gost hwylustod.

Offer fel Stiwdio 3T Bydd yn symleiddio'r gwaith o adeiladu ymholiadau cydgasglu yn MongoDB. Mae'r nodwedd Golygydd Agregu yn caniatáu ichi gymhwyso datganiadau piblinell un cam ar y tro, ac archwilio data mewnbwn ac allbwn ar bob cam i symleiddio dadfygio.

Defnyddio Recordio Cyflym

Peidiwch byth â gosod opsiynau ysgrifennu MongoDB i gael cyflymder uchel ond dibynadwyedd isel. Y modd hwn "ffeil-ac-anghofio" ymddangos yn gyflym oherwydd bod y gorchymyn yn cael ei ddychwelyd cyn i'r ysgrifennu ddigwydd. Os bydd y system yn chwalu cyn i'r data gael ei ysgrifennu ar ddisg, bydd yn cael ei golli ac yn y pen draw mewn cyflwr anghyson. Yn ffodus, mae MongoDB 64-bit wedi galluogi logio.

Mae'r peiriannau storio MMAPv1 a WiredTiger yn defnyddio logio i atal hyn, er y gall WiredTiger adfer i'r cysonyn olaf pwynt rheoli, os yw mewngofnodi wedi'i analluogi.

Mae cyfnodolion yn sicrhau bod y gronfa ddata mewn cyflwr cyson ar ôl ei hadfer ac yn cadw'r holl ddata nes iddo gael ei ysgrifennu i'r dyddlyfr. Mae amlder recordiadau yn cael ei ffurfweddu gan ddefnyddio'r paramedr commitIntervalMs.

I fod yn sicr o'r cofnodion, gwnewch yn siŵr bod mewngofnodi wedi'i alluogi yn y ffeil ffurfweddu (storage.journal.enabled), ac mae amlder y recordiadau yn cyfateb i faint o wybodaeth y gallwch fforddio ei golli.

Didoli heb fynegai

Wrth chwilio a chydgrynhoi, yn aml mae angen didoli data. Gobeithio y gwneir hyn yn un o'r camau olaf, ar ôl hidlo'r canlyniad er mwyn lleihau faint o ddata sy'n cael ei ddidoli. A hyd yn oed yn yr achos hwn, ar gyfer didoli bydd angen ichi mynegai. Gallwch ddefnyddio mynegai sengl neu gyfansawdd.

Os nad oes mynegai addas, bydd MongoDB yn gwneud hebddo. Mae terfyn cof o 32 MB ar gyfanswm maint yr holl ddogfennau yn gweithrediadau didoli, ac os yw MongoDB yn cyrraedd y terfyn hwn, yna bydd naill ai'n taflu gwall neu'n dychwelyd set cofnodion gwag.

Chwilio heb gefnogaeth mynegai

Mae ymholiadau chwilio yn cyflawni swyddogaeth debyg i'r gweithrediad JOIN yn SQL. Er mwyn gweithio orau, mae angen mynegai gwerth yr allwedd a ddefnyddir fel yr allwedd dramor arnynt. Nid yw hyn yn amlwg oherwydd nid yw'r defnydd yn cael ei adlewyrchu yn explain(). Mae mynegeion o'r fath yn ychwanegol at y mynegai a ysgrifennwyd ynddo explain(), sydd yn ei dro yn cael ei ddefnyddio gan weithredwyr piblinellau $match и $sort, pan fyddant yn cyfarfod ar ddechrau'r biblinell. Gall mynegeion yn awr gwmpasu unrhyw gam piblinell agregu.

Optio allan o ddefnyddio aml-ddiweddariadau

Dull db.collection.update() a ddefnyddir i newid rhan o ddogfen bresennol neu'r ddogfen gyfan, hyd at un newydd yn ei lle, yn dibynnu ar y paramedr a nodir gennych update. Yr hyn sydd ddim mor amlwg yw na fydd yn prosesu pob dogfen yn y casgliad oni bai eich bod yn gosod yr opsiwn multi diweddaru'r holl ddogfennau sy'n bodloni'r meini prawf cais.

Peidiwch ag anghofio pwysigrwydd trefn yr allweddi mewn tabl hash

Yn JSON, mae gwrthrych yn cynnwys casgliad heb ei drefnu o faint sero neu fwy o barau enw/gwerth, lle mae enw yn llinyn a gwerth yn llinyn, rhif, boolean, nwl, gwrthrych, neu arae.

Yn anffodus, mae BSON yn rhoi llawer o bwyslais ar drefn wrth chwilio. Yn MongoDB, trefn yr allweddi o fewn gwrthrychau adeiledig materion, h.y. { firstname: "Phil", surname: "factor" } - nid yw hyn yr un peth â { { surname: "factor", firstname: "Phil" }. Hynny yw, mae'n rhaid i chi storio trefn y parau enw/gwerth yn eich dogfennau os ydych am fod yn sicr o ddod o hyd iddynt.

Peidiwch â drysu "Null" и "anniffiniedig"

Gwerth "anniffiniedig" erioed yn ddilys yn JSON, yn ôl safon swyddogol JSON (ECMA-404 Adran 5), er ei fod yn cael ei ddefnyddio yn JavaScript. Ar ben hynny, ar gyfer BSON mae wedi darfod ac yn cael ei drawsnewid i $null, nad yw bob amser yn ateb da. Osgoi defnyddio "anniffiniedig" yn MongoDB.

Defnyddio $limit() без $sort()

Yn aml iawn pan fyddwch chi'n datblygu yn MongoDB, mae'n ddefnyddiol gweld sampl o'r canlyniad a fydd yn cael ei ddychwelyd o ymholiad neu gydgrynhoad. Ar gyfer y dasg hon bydd angen $limit(), ond ni ddylai byth fod yn y cod terfynol oni bai eich bod yn ei ddefnyddio o'r blaen $sort. Mae'r mecanig hwn yn angenrheidiol oherwydd fel arall ni allwch warantu trefn y canlyniad, ac ni fyddwch yn gallu gweld y data yn ddibynadwy. Ar frig y canlyniad fe gewch chi gofnodion gwahanol yn dibynnu ar y didoli. Er mwyn gweithio'n ddibynadwy, rhaid i ymholiadau a chydgrynhoi fod yn benderfynyddol, hynny yw, cynhyrchu'r un canlyniadau bob tro y cânt eu gweithredu. Cod sy'n cynnwys $limit(), ond na $sort, ni fydd yn benderfyniaethol a gall wedyn achosi gwallau a fydd yn anodd eu holrhain.

Casgliad

Yr unig ffordd i fod yn siomedig â MongoDB yw ei gymharu'n uniongyrchol â math arall o gronfa ddata, fel DBMS, neu ddod i'w ddefnyddio yn seiliedig ar rai disgwyliadau. Mae fel cymharu oren i fforc. Mae systemau cronfa ddata yn gwasanaethu dibenion penodol. Mae'n well deall a gwerthfawrogi'r gwahaniaethau hyn drosoch eich hun. Byddai'n drueni rhoi pwysau ar ddatblygwyr MongoDB dros lwybr a oedd yn eu gorfodi i lawr llwybr DBMS. Rwyf am weld ffyrdd newydd a diddorol o ddatrys hen broblemau, megis sicrhau cywirdeb data a chreu systemau data sy'n gallu gwrthsefyll methiant ac ymosodiadau maleisus.

Mae cyflwyniad MongoDB o drafodion ACID yn fersiwn 4.0 yn enghraifft dda o gyflwyno gwelliannau pwysig mewn ffordd arloesol. Mae trafodion aml-ddogfen ac aml-ddatganiad bellach yn atomig. Mae hefyd yn bosibl addasu'r amser sydd ei angen i gaffael cloeon a therfynu trafodion sownd, yn ogystal â newid y lefel ynysu.

14 peth yr hoffwn pe bawn yn eu gwybod cyn dechrau gyda MongoDB

Darllen mwy:

Ffynhonnell: hab.com

Ychwanegu sylw