SQL vs NoSQL: kurią duomenų bazę turėtų naudoti jūsų programėlė?
SQL duomenų bazės (dar vadinamos reliacinėmis) saugo duomenis lentelėse su apibrėžta struktūra — eilutėmis ir stulpeliais — ir susieja susijusias lenteles tarpusavyje. Užklausas rašote SQL kalba. Postgres, MySQL ir SQLite yra pavyzdžiai. NoSQL duomenų bazės naudoja kitus duomenų saugojimo būdus — dokumentus, raktų ir reikšmių poras, plačius stulpelius ar grafus — ir paprastai leidžia lankstesnę struktūrą. MongoDB, Redis, DynamoDB ir Firestore yra pavyzdžiai. Daugeliui verslo programėlių SQL duomenų bazė yra protingas numatytasis pasirinkimas; NoSQL pasižymi konkrečiais darbais.
Kodėl šis pasirinkimas svarbus kuriant su DI
Duomenų bazė yra viena sunkiausiai vėliau pakeičiamų programėlės dalių. Ekranus galima perdaryti per popietę; perkelti metus kaupiamus klientų duomenis į kitokio tipo duomenų bazę yra projektas.
Kai DI programėlių kūrėjas jums prideda duomenų saugyklą, jis parenka vieną iš šių. Skirtumo žinojimas padeda:
- Suprasti, kaip atrodo jūsų duomenys ir ar jie gali atsakyti į klausimus, kuriuos uždasite vėliau („pajamos pagal mėnesį pagal produktą“).
- Vertinti platformų pasirinkimus. Kai kurios platformos sukurtos ant dokumentų duomenų bazės, kitos — ant reliacinės. Žr. Supabase vs Firebase kaip įprastą kiekvieno tipo pavyzdį.
- Vengti priklausomybės nuo tiekėjo. SQL yra bendras standartas, todėl reliacinius duomenis paprastai lengviau perkelti tarp teikėjų.
Kasdienė analogija
SQL duomenų bazė yra tarsi kruopščiai suprojektuotų skaičiuoklių rinkinys su griežtais stulpeliais: vienas lapas klientams, kitas užsakymams, o kiekviena užsakymo eilutė nurodo į kliento eilutę pagal ID. Kiekvienos lapo eilutės stulpeliai vienodi. Tam reikia šiek tiek planavimo, bet užduoti klausimus per lapus yra lengva ir duomenys išlieka tvarkingi.
NoSQL dokumentų duomenų bazė yra tarsi segtuvų spinta su aplankais. Kiekvieno kliento aplanke gali būti jo duomenys ir užsakymai kartu, o vienas aplankas gali turėti papildomų popierių, kurių kituose nėra. Visos vieno kliento istorijos paėmimas yra greitas. Atsakymas į klausimą „ką visi užsakė praeitą mėnesį?“ reiškia atverti daug aplankų.
Tikri skirtumai
| SQL (reliacinė) | NoSQL | |
|---|---|---|
| Duomenų forma | Lentelės su apibrėžtais stulpeliais | Dokumentai, raktų ir reikšmių poros, platūs stulpeliai ar grafai |
| Struktūra | Schema apibrėžiama iš anksto, keičiama migracijomis | Dažnai lanksti; struktūrą užtikrina programos kodas, jei apskritai |
| Ryšiai | Įmontuoti: išoriniai raktai ir jungimai | Paprastai tvarkomi įdėtais duomenimis arba programos kodu |
| Užklausų kalba | SQL, bendras standartas | Skiriasi kiekvienam produktui |
| Nuoseklumas | Stiprios transakcijos yra standartas | Priklauso nuo produkto ir nustatymų; daugelis dabar siūlo transakcijas |
| Mastelio keitimas | Tradiciškai didinamas stipresniu serveriu; plėtra į kelis serverius galima, bet sunkiau | Daugelis sukurti taip, kad paskirstytų duomenis per daugybę serverių |
| Geriausiai tinka | Verslo duomenims, ataskaitoms, bet kam su daugybe ryšių | Labai dideliems paprastų įrašų kiekiams, talpykloms, lankščiam turiniui |
| Pavyzdžiai | Postgres, MySQL, SQLite, SQL Server | MongoDB, Redis, DynamoDB, Firestore, Cassandra, Neo4j |
„NoSQL“ nėra viena dalykas. Pagrindinės rūšys:
| Rūšis | Kaip saugo duomenis | Tipinis naudojimas |
|---|---|---|
| Dokumentų (MongoDB, Firestore) | JSON tipo dokumentai | Turinys, katalogai, programėlės su įvairiais įrašais |
| Raktų ir reikšmių (Redis, DynamoDB) | Reikšmė, ieškoma pagal raktą | Talpykla, sesijos, skaitikliai |
| Plačių stulpelių (Cassandra) | Eilutės su lanksčiais stulpelių rinkiniais | Dideli, daug rašymo reikalaujantys duomenų rinkiniai |
| Grafų (Neo4j) | Mazgai ir jungtys | Socialiniai tinklai, rekomendacijos |
Darbinis pavyzdys: tie patys parduotuvės duomenys dviem būdais
Imkime nedidelę internetinę parduotuvę su klientu ir jos užsakymais.
SQL (reliacinė): duomenys išskaidyti į lenteles ir susieti ID.
-- customers: id=1, name='Lena Ortiz'
-- orders: id=101, customer_id=1, total=42.00
-- id=103, customer_id=1, total=25.00
SELECT c.name, SUM(o.total)
FROM customers c JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
Jei Lena pakeičia el. paštą, pakeitimas įvyksta vienoje vietoje. Klausimas „bendri pardavimai kiekvienam klientui šį mėnesį“ yra viena užklausa.
NoSQL (dokumentas): jos užsakymai gali gyventi jos dokumente.
{
"_id": "cust_1",
"name": "Lena Ortiz",
"email": "lena@example.com",
"orders": [
{ "id": 101, "total": 42.00, "items": ["Green tea"] },
{ "id": 103, "total": 25.00, "items": ["Teapot"] }
]
}
Lenos profilio puslapio su visais jos užsakymais įkėlimas yra vienas skaitymas. Tačiau klausimai, kertantys visus klientus — geriausiai parduodamas produktas šį mėnesį — reikalauja daugiau darbo, o jei tos pačios produkto detalės nukopijuotos į daugybę užsakymų, jų sinchronizavimas tampa programos užduotimi.
Nė vienas nėra neteisingas. Klausimas, kurį modelį jūsų programėlė naudoja dažniausiai.
Kaip pasirinkti
Reliacinė SQL duomenų bazė paprastai yra tinkamas numatytasis pasirinkimas, jei:
- Jūsų duomenys turi daug ryšių: naudotojai, komandos, rezervacijos, sąskaitos, produktai.
- Jums reikės ataskaitų, filtrų ir sumų per įrašus.
- Teisingumas svarbus: pinigai, atsargų likučiai, leidimai.
NoSQL duomenų bazę verta apsvarstyti, jei:
- Jums reikia greitos talpyklos ar sesijų saugyklos — čia dažnai naudojamas Redis, dažniausiai kartu su SQL duomenų baze.
- Jūsų įrašų yra labai daug, jie paprasti ir nepriklausomi, pavyzdžiui, įvykių žurnalai ar jutiklių rodmenys.
- Dirbate platformoje, sukurtoje aplink vieną iš jų, pavyzdžiui, Firebase Firestore, o jos realaus laiko funkcijos yra pagrindinis privalumas.
Daugelis programėlių naudoja abu: SQL kaip pagrindinį tiesos šaltinį, o NoSQL saugyklą talpykloms ar konkrečiai funkcijai.
Pagrindiniai terminai
| Terminas | Reikšmė |
|---|---|
| Reliacinė duomenų bazė | SQL duomenų bazė su susietomis lentelėmis. |
| Schema | Apibrėžta duomenų struktūra. |
| Jungimas (join) | Susijusių dviejų lentelių eilučių sujungimas vienoje užklausoje. |
| Dokumentas | Savarankiškas JSON tipo įrašas dokumentų duomenų bazėje. |
| Denormalizacija | Duomenų kopijavimas į kelias vietas greitesniam skaitymui. |
| ACID | Transakcijų patikimumo garantijos: viskas arba nieko, nuoseklumas, izoliacija ir patvarumas. |
| Horizontalus mastelio keitimas | Duomenų paskirstymas per daugybę serverių, o ne vieno didesnio naudojimas. |
Dažni mitai
- „NoSQL reiškia be schemos.“ Jūsų duomenys visada turi formą. Su NoSQL duomenų bazė jos gali neužtikrinti, todėl tai turi daryti jūsų kodas.
- „SQL nesimastelio.“ Reliacinės duomenų bazės valdo labai dideles paslaugas. Dauguma programėlių niekada nepriartėja prie savo ribų.
- „NoSQL visada greitesnis.“ Tik tiems modeliams, kuriems jis sukurtas. Skersinė ataskaita gali būti lėtesnė.
- „Reikia pasirinkti vieną visam laikui.“ Daugelis programėlių sujungia abu. Be to, SQL duomenų bazės, pavyzdžiui, Postgres, saugo ir JSON, todėl kelių lankščių laukų nereikia NoSQL.
- „NoSQL reiškia, kad negalima naudoti SQL.“ Pavadinimas paprastai skaitomas kaip „ne tik SQL“, o kai kurie NoSQL produktai siūlo SQL panašias užklausų kalbas.
Ko klausti savo DI kūrėjo
- „Kokio tipo duomenų bazę naudoja ši programėlė ir kodėl ji tinka mano duomenims?“
- „Nubrėžkite lenteles ar kolekcijas ir kaip jos susijusios.“
- „Kokių ataskaitų norėsiu po šešių mėnesių? Ar ši duomenų bazė jas lengvai atsakys?“
- „Jei kai kurie laukai iš tiesų lankūs, saugokite juos kaip JSON Postgres, o ne pridėkite antrą duomenų bazę.“
- „Pridėkite talpyklą tik tada, jei turime išmatuotą greičio problemą.“
Duomenų bazės Mythex
Mythex kiekvienam projektui, kuriam jos reikia, suteikia atskirą Postgres duomenų bazę — reliacinę SQL duomenų bazę — pridedamą, kai programėlei jos prireikia, arba paprašius pokalbyje, arba su komanda /database (Database). Tai tinka daugeliui verslo programėlių: naudotojams, rezervacijoms, užsakymams ir ataskaitoms. Jei jums reikia konkrečios išorinės paslaugos, pavyzdžiui, valdomos dokumentų duomenų bazės, agentas gali parašyti kodą, kuris prie jos prisijungia naudojant raktus, saugomus kaip projekto paslaptis. Norėdami sužinoti daugiau apie pačią kalbą, perskaitykite kas yra SQL.
Klausimai
Koks pagrindinis skirtumas tarp SQL ir NoSQL?
SQL duomenų bazės saugo duomenis lentelėse su apibrėžta struktūra ir susieja susijusias lenteles tarpusavyje, o užklausas rašote SQL kalba. NoSQL duomenų bazės naudoja kitus modelius — dokumentus, raktų ir reikšmių poras, plačius stulpelius ar grafus — ir paprastai leidžia lankstesnę struktūrą, o kiekvienas produktas turi savo užklausų būdą.
Ar NoSQL greitesnis nei SQL?
Apskritai ne. Kiekviena yra greita tam tikriems prieigos modeliams, kuriems ji sukurta. Raktų ir reikšmių saugykla labai greitai paima vieną elementą pagal raktą; reliacinė duomenų bazė stipri filtruojant, jungiant ir apibendrinant susijusius duomenis. Dizainas ir indeksavimas svarbesni nei kategorija.
Kuri geresnė startuoliui ar mažai programėlei?
Dauguma verslo programėlių — klientai, užsakymai, rezervacijos, naudotojai ir leidimai — saugiai veikia su reliacine SQL duomenų baze, pavyzdžiui, Postgres. NoSQL prasmingas konkretiems poreikiams, pavyzdžiui, talpykloms, realaus laiko sinchronizacijai tam tikrose platformose ar labai dideliam kiekiui paprastų, nepriklausomų įrašų.
Ar MongoDB yra SQL ar NoSQL?
MongoDB yra NoSQL dokumentų duomenų bazė. Ji saugo įrašus lankščiais JSON tipo dokumentais, o ne lentelių eilutėmis.
Ar SQL duomenų bazė gali saugoti JSON?
Taip. Postgres turi jsonb tipą JSON saugoti ir užklausti, o MySQL ir SQLite taip pat palaiko JSON. Tai leidžia daugeliui programėlių turėti reliacinę pagrindą su keliais lankščiais laukais, be atskiros NoSQL duomenų bazės.