Gagnagrunnur

**Gagnagrunnur** er safn upplýsinga sem er geymt í tölvu á skipulagðan hátt til þess að forrit geti svarað spurningum um gögnin. Hugbúnaðurinn sem heldur utan um gagnagrunninn er kallaður gagnasafnskerfi. Oft er ekki gerður greinamunur á þessu tvennu, heldur er bara talað um gagnagrunn og er þá átt við bæði hugbúnaðinn og gögnin. Fræðigreinin sem fæst við gagnagrunna nefnist gagnasafnsfræði.

Til eru mismunandi gagnalíkön, þ.e. aðferðir til að skipuleggja gögnin. Eitt slíkt líkan byggist á því að safna upplýsingum um sérhvern hlut í eina færslu og raða síðan þessum hlutum í tré eða stigveldi og nefnist það stigskipt gagnalíkan. Vinsælast er þó venslalíkanið (e. relation model) sem byggist á því að raða upplýsingum í töflur.

Vinsælasta fyrirspurnarmálið fyrir gagnagrunna er SQL, sem hefðbundið er notað með venslagagnagrunnum (e. relational database). Það er t.d. notað með PostgreSQL grunninum, sem er einn vinsælasti grunnurinn, ekki bara af grunnum sem eru frjáls (og ókeypis) hugbúnaður. Annar slíkur mjög vinsæll er MySQL og MariaDB t.d. samhæfður.

SQLite, sem er ívafsgrunnur (annar vinsæll DuckDB), en ekki fjölnotendagrunnur sem er venjan en fyrirspurnarmálið er samt SQL, og er mest notaði einstaki gagnagrunnur í heimi, því notaður af flestum hesltu stýrkerfum t.d. Android). Aðrir mikið notaðir og þekktir grunnar (þar sem forritskóðinn er ekki opinn/frjáls og því grunnurinn ekki endilega ókeypis) af sömu tegund eru Oracle, Microsoft SQL Server. Til eru sérstakir grunnar, t.d. OLAP (e. online analytical processing) grunnar, fyrir "vöruhús gagna" (e. data warehouse), s.s. ClickHouse (sem líka er tíma-seríu grunnur).

Redis er dæmi um key–value (og vector) gagnagrunn.

Tímaseríugrunnar eru til að taka við gögnum sem breytast með tíma (t.d. mælingar á hitastigi frá fullt af mælum) og geta oft tekið inn milljónir mælinga á sekúndu, oft stillanlegir þannig að eldri gögn eyðast sjálfkrafa út eftir ákveðinn skilgreindan tíma. Sumir ná sjálfgefið í t.d. nýjustu 5. mínútur af hverri tímaseríu, við fyrirspurn, t.d. VictoriaMetrics grunnurinn, en önnur fyrirspurn gæti verið að ná í meðalhitastig á hverjum klukkutíma, einhverja tíma aftur, eða frá byrjun. Þetta er líka hægt með hefðbundum, OLTP (e. online transaction processing) venslagagnagrunni en notkun þeirra er oftast nær önnur, og þeir eru ekki sérhæfðir í þessum tilgangi. Þannig grunnar ná ekki að þjappa gögnum eins mikið og eru því hægari, nema gagmamagnið sé þeim mun minna. Algengt er að tímaseríugrunnar hafi annars konar fyrirspurnarmál líkt með VictoriaMetrics og InfluxDB grunnana, en það þarf ekki að vera, ClickHouse notar SQL og QuestDB gerir það líka og til er tímaseríu-viðbót (e. extension) fyrir PostgreSQL. Tímaseríugrunnar eru almennt dálkagrunnar (e. column-oriented DBMS) sem er útfærsluaðferð er hluti af ástæðunni fyrir að þeir eru hraðari fyrir ákv. vinnslu, og sú aðferð er notað í öllum fyrrnefndu tímaseríugrunnunum, en ekki t.d með PostgreSQL (nema með TimescaleDB viðbótinni), því sá grunnur og aðrir svipaðir, s.s. OLTP grunnar eru hannaðir týpískt fyrir ACID (e.g. atomicity, consistency, isolation, durability) hegðun, sem sumir aðrir grunnar fórna að hluta eða öllu leyti fyrir hraða, t.d. með því að leyfa "eventual consistency", en ekki consistency strax. Þ.e. í sumum tilvikum er mikilvægt að sjá samræmda sýn (e. consistency) yfir gögn eftir hverja færslu (e. transaction), svo t.d. sama sæti sé ekki selt í bíó tveimur viðskiptavinum. En ef verið er að taka við pöntunum frá viðskiptavinum í stórum stíl, kannski frá öllum í heiminum, þá getur verið mikilvægara að það gerist hratt, en ekki eins örugglega, í skilningnum í lagi er ef tekið er inn meira af pöntunum en vörustaða á lager ræður við. Valkosturinn gæti verið að gagnagrunnur réði annars ekki við álagið og tæki því hægt við pöntunum (og hægvirkari vefsíður eru þekktar fyrir að fæla viðskiptavini frá) eða jafnvel gæti tölvukerfið hrunið. Flestir hefðbundnir gagnagrunnur ráða samt líklega við álag sem kannski má vænta af innanlandssölu á Íslandi.

## Tengt efni
* Gagnasafnskerfi
* SQL. **S**tructured **Q**uery **L**anguage