Vadovai

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ų formaLentelės su apibrėžtais stulpeliaisDokumentai, raktų ir reikšmių poros, platūs stulpeliai ar grafai
StruktūraSchema apibrėžiama iš anksto, keičiama migracijomisDažnai lanksti; struktūrą užtikrina programos kodas, jei apskritai
RyšiaiĮmontuoti: išoriniai raktai ir jungimaiPaprastai tvarkomi įdėtais duomenimis arba programos kodu
Užklausų kalbaSQL, bendras standartasSkiriasi kiekvienam produktui
NuoseklumasStiprios transakcijos yra standartasPriklauso nuo produkto ir nustatymų; daugelis dabar siūlo transakcijas
Mastelio keitimasTradiciškai didinamas stipresniu serveriu; plėtra į kelis serverius galima, bet sunkiauDaugelis sukurti taip, kad paskirstytų duomenis per daugybę serverių
Geriausiai tinkaVerslo duomenims, ataskaitoms, bet kam su daugybe ryšiųLabai dideliems paprastų įrašų kiekiams, talpykloms, lankščiam turiniui
PavyzdžiaiPostgres, MySQL, SQLite, SQL ServerMongoDB, Redis, DynamoDB, Firestore, Cassandra, Neo4j

„NoSQL“ nėra viena dalykas. Pagrindinės rūšys:

RūšisKaip saugo duomenisTipinis naudojimas
Dokumentų (MongoDB, Firestore)JSON tipo dokumentaiTurinys, 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ų rinkiniaisDideli, daug rašymo reikalaujantys duomenų rinkiniai
Grafų (Neo4j)Mazgai ir jungtysSocialiniai 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

TerminasReikšmė
Reliacinė duomenų bazėSQL duomenų bazė su susietomis lentelėmis.
SchemaApibrėžta duomenų struktūra.
Jungimas (join)Susijusių dviejų lentelių eilučių sujungimas vienoje užklausoje.
DokumentasSavarankiškas JSON tipo įrašas dokumentų duomenų bazėje.
DenormalizacijaDuomenų kopijavimas į kelias vietas greitesniam skaitymui.
ACIDTransakcijų patikimumo garantijos: viskas arba nieko, nuoseklumas, izoliacija ir patvarumas.
Horizontalus mastelio keitimasDuomenų 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.

Mythex · Pricing · Kurkite bet ką su dirbtiniu intelektu · Svetainių ir programėlių šablonai · Mythex palyginimas · Programėlių kūrimo su dirbtiniu intelektu žodynėlis · Nemokami programėlių kūrimo su dirbtiniu intelektu įrankiai · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)