Pereiti prie turinio

NoSQL (non-relational duombazės)


Rekomenduojami pranešimai

Gerą dieną, programuotojai,

 

Užsimaniau padiskutuoti su jumis apie ne-reliacines duomenų bazes (pavadinimas gaunasi gan baisus :D), kitaip tariant, viską, kas apibūdinama sąvoka NoSQL. :)

 

Ar yra jas rimtai išbandžiusių, gal net naudojančių production'e? Kada verta naudoti ir kada ne? Kaip projektuoti duomenų bazės dizainą be ryšių (nes 99% laiko susidurdamas su SQL būtent ryšiais ir mąstau :D)?

 

Čia tik mano klausimai, tikiuosi jų bus ir iš kitų narių ir tema privers visiems :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tokių duombazių univere dar nėjom :)

 

Na, logiškai galvojant, jos naudojamos tada, kai tarp lentelių nėra ryšių. +1 man už išmąstymą :D

Na, iš to, kiek domėjaus, labiau tada, kai relational stabdo :D Tačiau pagalvok pats, kokiam normaliam Web 2.0 projekte kažkokie objektai duombazėje neturės sąsajų? Kažkaip įmanoma įgyvendinti tai ir be tradicinių ryšių, kuriuos turim RDB. Mane būtent ir domina tai darančių žmonių patirtis - kaip tai padaryti :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Dėkui, bet skaičiau prieš ~15 min. būtent šitą įrašą :)

 

Visgi ten nelabai yra kas nors parašyta apie tai, kaip keitėsi DB dizainas pereinant iš MySQL į MongoDB. Tarkim, MongoDB turi tokį dalyką kaip references, galima būtų padaryt quick-and-dirty ryšius grynai su jais (many-to-many pavyktų netgi geriau, nei SQL'uose). Tačiau kažkur skaičiau tokį teiginį jog „jei pasiimsi NoSQL ir viską darysi taip pat, kaip darydavai reliacinėje DB, iš to nebus didelės naudos“ :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Būtent mongoDB yra document-oriented duombazė. Kas reiškia, kad ji realiai labiau programiška nei reliacinė duombazė. Dokumentas iš esmės = objektas. Ar objektai turi ryšius? Ne. :)

Ok, bet tada neatrodo labai tinkama interaktyviam web projektui, tarkime, Twitter klonui. Žinutė turi turėti autorių, bet autoriaus nedarysi „embedded“ - kas, jei norės pasikeisti vardą ar avatarą? Nekeisi juk šimtuose ar tūkstančiuose žinučių... :)

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Ok, bet tada neatrodo labai tinkama interaktyviam web projektui, tarkime, Twitter klonui. Žinutė turi turėti autorių, bet autoriaus nedarysi „embedded“ - kas, jei norės pasikeisti vardą ar avatarą? Nekeisi juk šimtuose ar tūkstančiuose žinučių... :)

 

Keisi. Thats the point (turbūt) :) Arba gali turėti autoriaus objektą kuriame yra jo id. Beje mongodb kiekvienas dokumentas gauna unikalų id šiaip ar taip. Taigi autoriaus objektas su jo id ir žinučių objektai su viduj autoriaus id. Labai reliacinis variantas, bet niekas netrukdo jau naudoti. Šiaip pagrindinis pliusas nosql'ų yra tai, kad nereikia galvoti apie duombazės struktūrą ir ryšius. Kuri sau objektus ir keitalioji juos visus. nosql yra velniškai greitos.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Keisi. Thats the point (turbūt) :) Arba gali turėti autoriaus objektą kuriame yra jo id. Beje mongodb kiekvienas dokumentas gauna unikalų id šiaip ar taip. Taigi autoriaus objektas su jo id ir žinučių objektai su viduj autoriaus id. Labai reliacinis variantas, bet niekas netrukdo jau naudoti. Šiaip pagrindinis pliusas nosql'ų yra tai, kad nereikia galvoti apie duombazės struktūrą ir ryšius. Kuri sau objektus ir keitalioji juos visus. nosql yra velniškai greitos.

Aišku, na, vis tiek tokiu atveju gaunasi maždaug reliacinis. O kokie realiai būtų atvejai, kai ryšių apskritai nereikėtų ir puikiai tiktų document-oriented duomenų bazė? :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Aišku, na, vis tiek tokiu atveju gaunasi maždaug reliacinis. O kokie realiai būtų atvejai, kai ryšių apskritai nereikėtų ir puikiai tiktų document-oriented duomenų bazė? :)

 

Nesveikai greitas cms'as kur kiekvienas puslapis yra tiesiog mongodb dokumentas. CMS vartotojui nelabai rūpi kaip under the hood susiję meniu ir kokia jų hierachija (tiksliau jos nebuvimas). Jis tik suveda duomenis. Rezultate gauname puslapį, kurio atvertimas kainuoja lygiai vieną užklausą į duombazę. :) Čia toks visiškai ekspromtu pavyzdys.

Nuoroda į pranešimą
Dalintis kituose puslapiuose
  • po 3 savaičių...
  • po 2 mėnesių...

Nesenai dariau nedideli projektėli klientui, pradžiai jam reikėjo galimybės urmu keisti savo prekių inventoriaus kiekį ir kainą. Viskas vyksta per Shopify API. Shopify gražina informaciją apie produktus JSON formatu, pvz.:

 

{
 "products": [
   {
     "product_type": "Cult Products",
     "handle": "ipod-nano",
     "created_at": "2011-10-20T14:05:13-04:00",
     "body_html": "<p>It's the small iPod with one very big idea: Video. Now the world's most popular music player, available in 4GB and 8GB models, lets you enjoy TV shows, movies, video podcasts, and more. The larger, brighter display means amazing picture quality. In six eye-catching colors, iPod nano is stunning all around. And with models starting at just $149, little speaks volumes.</p>",
     "title": "IPod Nano - 8GB",
     "template_suffix": null,
     "updated_at": "2011-10-20T14:05:13-04:00",
     "id": 632910392,
     "tags": "Emotive, Flash Memory, MP3, Music",
     "images": [
       {
         "position": 1,
         "created_at": "2011-10-20T14:05:13-04:00",
         "product_id": 632910392,
         "updated_at": "2011-10-20T14:05:13-04:00",
         "src": "http://static.shopify.com/s/files/1/6909/3384/products/ipod-nano.png?0",
         "id": 850703190
       }
     ],
     "variants": [
       {
         "position": 1,
         "price": "199.00",
         "created_at": "2011-10-20T14:05:13-04:00",
         "requires_shipping": true,
         "title": "Pink",
         "inventory_quantity": 10,
         "compare_at_price": null,
         "inventory_policy": "continue",
         "updated_at": "2011-10-20T14:05:13-04:00",
         "inventory_management": "shopify",
         "id": 808950810,
         "taxable": true,
         "grams": 200,
         "sku": "IPOD2008PINK",
         "option1": "Pink",
         "fulfillment_service": "manual",
         "option2": null,
         "option3": null
       },
       {
         "position": 2,
         "price": "199.00",
         "created_at": "2011-10-20T14:05:13-04:00",
         "requires_shipping": true,
         "title": "Red",
         "inventory_quantity": 20,
         "compare_at_price": null,
         "inventory_policy": "continue",
         "updated_at": "2011-10-20T14:05:13-04:00",
         "inventory_management": "shopify",
         "id": 49148385,
         "taxable": true,
         "grams": 200,
         "sku": "IPOD2008RED",
         "option1": "Red",
         "fulfillment_service": "manual",
         "option2": null,
         "option3": null
       },
       {
         "position": 3,
         "price": "199.00",
         "created_at": "2011-10-20T14:05:13-04:00",
         "requires_shipping": true,
         "title": "Green",
         "inventory_quantity": 30,
         "compare_at_price": null,
         "inventory_policy": "continue",
         "updated_at": "2011-10-20T14:05:13-04:00",
         "inventory_management": "shopify",
         "id": 39072856,
         "taxable": true,
         "grams": 200,
         "sku": "IPOD2008GREEN",
         "option1": "Green",
         "fulfillment_service": "manual",
         "option2": null,
         "option3": null
       },
       {
         "position": 4,
         "price": "199.00",
         "created_at": "2011-10-20T14:05:13-04:00",
         "requires_shipping": true,
         "title": "Black",
         "inventory_quantity": 40,
         "compare_at_price": null,
         "inventory_policy": "continue",
         "updated_at": "2011-10-20T14:05:13-04:00",
         "inventory_management": "shopify",
         "id": 457924702,
         "taxable": true,
         "grams": 200,
         "sku": "IPOD2008BLACK",
         "option1": "Black",
         "fulfillment_service": "manual",
         "option2": null,
         "option3": null
       }
     ],
     "vendor": "Apple",
     "published_at": "2007-12-31T19:00:00-05:00",
     "options": [
       {
         "name": "Title"
       }
     ]
   }
 ]
}

 

Išsaugoti tokią informaciją MySQL duomenų bazėj būtu vargas, reikėtu kelių lentelių, kiekvienos lentelės laukus aprašyti, paskui naudoji JOIN'us.

 

Su MongoDB viskas daug paprasčiau, nereikia kelių lentelių, nereikia struktūros aprašymo:

$result = json_decode($json);

foreach ($result->products as $product)
{
   $result= $db->products->insert($product);
}

 

Kai reikia surasti produktą pagal varianto SKU:

$cursor = $db->products->find(array('variants.sku' => 'IPOD2008BLACK'));

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...