- (1. resz) Full stack fejlesztő önállóan, kezdőknek
- (2. resz) Programozás alapjai Go nyelven
- (3. resz) Hálózat programozás alapjai Go nyelven
- (4. resz) Backend fejlesztés Go nyelven
- (5. resz) Adatbázisok: hogy működnek, hogy válasszunk?
- (6. resz) Frontend fejlesztés alapjai
Az adatbázisok elsődleges feladata hogy megbízhatóan tárolja az adatokat és kereshetővé tegye. Nagyon sok féle adatbázis van, fontos hogy mindig a feladathoz megfelelőt válasszuk. A modern webes rendszerek általában több adatbázist is használnak párhuzamosan, akár ugyanazon adatok tárolására.
A kiszolgált kérések típusa szerint 2 nagy csoportja van az adatbázisoknak:
OLTP (Online transaction processing)
Nagy mennyisegű, gyors, egyszerű kéréseket szolgálnak ki, relativ kevés adaton. Például webáruházaknál a rendelés feladása, regisztráció elmentése, kosár lekérdezése.
OLAP (Online analytical processing)
Kis mennyiségű, komplex, sokáig tartó kéréseket szolgálnak ki, nagy mennyiségű adaton. Általában adatelemzésre, statisztikákra használjuk.
Ezek nem kizárólagos csoportok, sok adatbázis támogatja ay OLTP és az OLAP műveletek is.
Milyen tipusu adatokat tudunk tarolni?
A különböző típusú adatokra, vannak specializált adatbázisok, amik hatékonyan tudnak dolgozni az adott adattípussal.
Kulcs-érték tárolók
Egyszerűen használható adatbázisok, amik általában kulcs + érték párokat tudnak tárolni. A kulcs alapján lehet lekérdezni az adatokat. Pl.: gyorsítótár
Két másik esetben is gyakran előfordul:
- Nagy teljesítményigényű programoknál
- Magasabb szintű adatbázisok tárolómotorjaként
Példák
- Badger Go nyelven írt, beágyazható közvetlenül a programba és a Dgraph alapja is
- Memcached Gyorsítótár
- Redis Sokoldalú memória alapú adatbázis, kulcs-érték tárolónak is használható
- RocksDB A Facebook fejleszti, sok adatbázis épül rá
- LMDB Kicsi, nagyon gyors, beágyazható adatbázis, sok adatbázis épül rá
- TiKV Eloszott tranzakciókra képes kulcs-érték tároló, a TiDB alapja
Relációs adatbázisok
Előre definiált, összekapcsolható séma szerint tárolja az adatokat. Általában SQL nyelven lehet programozni. Ezek a leggyakrabban használt adatbázisok a webes rendszerekben, szinte mindig jelen van.
Példák
- PostgreSQL Ez a legnagyobb tudású nyílt forráskódú relációs adatbáziskezelő, sokoldalúan használható
- MariaDB A MySQL forkolt és továbbfejlesztett változata
- CockroachDB Elsődlegesen cloud környezetre van fejlesztve, PostgreSQL kompatibilis
- TiDB Elsődlegesen cloud környezetre van fejlesztve, MySQL kompatibilis
Dokumentum-orientált
Dokumentumokban tárolja az adatokat, előre definiált séma nélkül. A dokumentumok kulcs-érték párokból álló adatok. Általában ugyan arra a célra használjuk mint a relációs adatbázisokat. Régebben a relációs adatbázisok nem támogatták ilyen módon a dokumentumok tárolását, de azóta felzárkóztak és a legtöbb felhasználási módra előnyösebbek a relációs adatbázisok.
Példák
Oszlop-orientált
Elsődlegesen OLAP típusú kérések kiszolgálására szolgálnak. Ezeknél a lekérdezéseknél nagyságrendekkel gyorsabbak mint a sor-orienentált adatbázisok mert jobban ki tudják használni a CPU gyorsítótárakat, tömörítő algoritmusokat, SIMD utasításokat.
Példák
Vektor-orientált
A vektoros adatbázisok alapvetően a vektorok közötti hasonlóság alapú keresésekre szolgálnak. Általában neurális hálók által generált reprezentációkat tároljuk benne. Így működnek a szemantikus keresők (mint pl a google), modern ajánló rendszerek, multimedia keresők (kép, hang, video).
Példák
Szöveg (full-text)
A szöveges keresők nagy mennyiségű szövegben tudnak hatékonyan keresni, mint a webáruházak termék leírásai, szerver napló fileok.
Példák
Gráf
A gráf olyan adatszerkezet ami csomópontokból áll és az ezeket összekötő élekből. Sokmindent lehet ilyen formában reprezentálni (pl.: felhasználók preferenciái, szociális hálózatok, tudás hálózatok).
Példák
- Dgraph
- Neo4j
- Ent Nem adatbázis, hanem egy go modul, amivel relációs adatbázisokat használhatunk gráf adatbázisként
Idősor
Az idősor olyan adat (legtöbbször szám), amit időponthoz kötötten tárolunk el, és időpont vagy intervallum alapján keresünk. (pl.: mérési adatok)
Példák
Hogyan tárolják az adatbázisok az adatok?
Az adatbázisok memóriában és fileokban is tárolnak bizonyos adatokat, de van egy fő tárolási mód, a másik csak kiegészítő.
Elsődlegesen RAM alapú tárolás
A kéréseket a RAM-ban lévő adatokból szolgálják ki, a filerendszert naplózásra és az adatok mentésére használják. Ezek nagyságrendekkel gyorsabbak mint a file alapú tárolók, hatékonyabban férnek hozzá az adatokhoz és egyszerűbb a megvalósításuk. A hátrányuk az hogy a RAM lényegesebb drágább és kisebb mint HDD vagy SSD.
Elsődlegesen file alapú tárolás
SSD vagy HDD tárolón a filerendszerben tárolják az adatokat és a kiszolgálás is innen történik. A RAM-ot főleg gyorsítótárazásra használják. Ezek komplexebbek és lassabbak, viszont nagyságrendekkel több adatot tudnak tárolni, olcsóbban. Az adat és index fileok kezelésére a 2 legelterjedtebb algoritmus az LSMT variánsok és a B-Tree variánsok.
A 2 féle algoritmusra az írási és olvasási sebesség közötti kompromisszum miatt van szükség. Minél nagyobb az írási sebesség, az olvasási annál lassabb lesz és forditva.
Hogy tudnak gyorsan keresni az adatbázisok?
Ha nem tudjuk milyen sorrendben vannak az adatok, akkor csak úgy tudunk egy elemet megkeresni hogy az összeset ellenőrizzük. Ez sok adatnál a gyakorlatban túl lassú lenne.
A gyors keresésre az adatbázisok indexeket használnak. Az indexek sorba rendezve tárolják az adatokat, a sorrend ismeretében pedig nem kell minden elemet megnézni.
Az alap ötlet ugyan az, mint amikor egy könyvben keresünk egy adott számú oldalt. A leggyorsabban úgy találjuk meg hogy kinyitjuk a könyvet a közepén, megnézzük hogy amit keresünk a közepétől merre van, újra megfelezzük az oldalakat és így tovább, amíg meg nem találjuk. Így legrosszabb esetben log2(n) oldalt kell megnéznünk n helyett. Ezt az algoritmust bináris keresésnek hívják.
Viszont a bináris keresés csak akkor működik ha teljesen rendezett adatok között keresünk. Az adatok rendezése is erőforrás igényes, ezért a legtöbb adatbázis nem tartja teljesen rendezetten az adatokat.
Több féle algoritmus létezik az indexelésre, hogy melyik a legjobb az adott esetben, attól függ:
- Milyen típusú az adat (pl.: szám, szöveg, földrajzi, vektor)
- Az adat mennyisége
- Milyen gyakran változnak a meglévő adatok
- Milyen gyakran jönnek új adatok
- Milyen hardveren tároljuk (ssd, hdd, ram)
- Milyen lekérdezéseket kell végrehajtani
- Mennyi lekérdezést kell végrehajtani
Az indexelő algoritmusok a rendezés és a keresés erőforrásigényei között egyensúlyoznak, úgy hogy a fenti kritériumokkal együtt optimális legyen az egész rendszer teljesítéménye. RAM alapú tárolóknál az index mérete is kritikus lehet.
Elosztott adatbázisok
Az elosztott adatbázisok, több gépen futnak, tárolnak adatok és hálózaton kommunikálnak.
Előnyei
- Hibatűrés: Ha van elég gép a rendszerben, akkor egy néhány gép kiesése nem okoz szolgáltatás kiesést
- Skálázhatóság és teljesítmény: Több gép összekapcsolásával nagyságrendekkel nagyobb teljesítmény érhető el, mint amire egy gép képes lehet és szinte a végtelenségig bővíthető
Hátrányai
- Lassúság: Az egy gépből kihozható teljesítmény általában sokkal kisebb mint egy nem-eloszott rendszerben (kivéve ha teljesen feladjuk a hibatűrést)
- Hibák: Meglepően sok módon romolhat el, bonyolultabb a hibakeresés és a helyreállítás is
A hálózat relatív lassú és megbízhatatlan (ráadásul sokféle képpen megbízhatatlan). Ez azt okoza hogy, ha a hálózat valamilyen hiba miatt két hálózatra szakad, akkor a rendszernek választania kell hogy potenciálisan inkonzisztens adatot szolgál ki vagy hibát ad vissza. Ha nincs semmilyen hiba, akkor is a késleltetés lesz magas, vagy nem garantálható a konzisztencia. (PACELC theorem)
A különböző adatbázisok, különböző kompromisszumokat kötnek a rendelkezésre állás, konzisztencia, hálózati hiba tolerancia terén.
Adatbázis választásnál ezeket ellenőrizzük
- Adattípus: kezeli a szükséges adattípust és támogatja a szükséges lekérdezéseket
- Adatmennyiség: tudja kezelni a szükséges és a jövőben várható adatmennyiséget és nem romlik a teljesítménye elfogadhatatlan mértékben a várható mennyiségnél
- Konkurens kliensek száma: támogat annyi felhasználót egyszerre ami szükséges
- Írási és olvasási minta: megfelelő a teljesítménye a várható írási / olvasási gyakoriság, mennyiség mellett. Ezt ellenőrizni kell akkor is ha már nagy mennyiségű adat van a rendszerben.
- Elosztott adatbázisnál: támogatja a nekünk elfogadható rendelkezésreállási, hibatűrési és konzistencia szintet
- Licensz: használhatjuk arra amire szeretnénk, nem minden használati módra vonatkozik ugyan az a licensz
- Ár / üzleti modell: egyes adatbázisoknak az az üzleti modellje hogy az ingyenes verzióval behúzzák az felhasználókat és később muszáj lesz a fizetős változatot használni, ami akár nagy költség vagy jogilag problémás is lehet