30
Spreadsheet jako engine relačních databází Jakub Daniel Matematicko-fyzikální Fakulta 2011

Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,

Spreadsheet jako engine relačních databází

Jakub DanielMatematicko-fyzikální Fakulta 2011

Page 2: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,

Spreadsheet

● Jeden z nejčastěji používaných typů software● Podobnost s relačními databázovými sytémy

● Udržuje a zpracovává data

– Data

– Formule

● Odlišnost od relačních databázových systémů● Dostupný a méně zatížen potřebou rozsáhlejších znalostí uživatele

● Nižší výkonnost

● Patrnější omezení na velikost dat a relací zaznamenatelných a zpracovatelných systémem

● Odlišný způsob integrace s jiným software

Page 3: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,

Motivace

● Spreadsheet bývá součástí mnoha instalací desktopových operačních systémů

● Popř. není tolik nákladné si jej opatřit (stejně tak ale existují MySQL, PostreSQL a jiné)

● Jejich použití je koncovým uživatelům blízké, nebo alespoň není příliš komplikované

● Pro malé firmy a koncové uživatele není nízký výkon bolestný● Menší objemy dat, na nichž rozdíl není patrný

● Overhead práce se samotným systémem je nižší, jelikož je uživateli ponecháno přívětivější rozhraní

Page 4: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,

Cíle

● Implementace běžné databázové funkcionality● Selection, Projection, Semijoin, Join, Cartesian Product, Union,

Difference, Grouping, Aggregation

● Využítí čisté spreadsheet funkcionality běžných implementací● Nejen MS Excel ale i OpenOffice, LibreOffice, Gnumeric, Google docs

● Bez použití maker nebo scriptovacích jazyků, VB …

● Porovnání efektivity na konkrétních příkladech● V této prezentaci zmíním pouze samotný verdikt

Page 5: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,

Technické předpoklady

● Notace● R1C1 – nezávislost významu na samotném umístění formule

– R1C1, RmCn, R[i]Cn, RmC[j], R[i]C[j], RCn, RC[i], RmC, R[i]C

– Není-li u řádku resp. sloupce číslo uvedeno, jedná se o řádek resp. sloupec, v němž je umístěn výraz, jehož je odkaz součástí

– Hranaté závorky značí relativní adresování buňek (R[-1]C, buňka ve stejném sloupci o řádek výš)

● Požadované funkce● IF(cond, true_br, false_br)

● MATCH(range, cell, 0) vrátí index v range prvního výskytu hodnoty v cell nebo error

● MATCH(range, cell, 1) na vzestupně setříděném range vrátí index nejvetší menší hodnoty než cell

● INDEX(range, cell) vrátí hodnotu z range na pozici dané cell

● SUMPRODUCT vrátí skalární součin

– Lze nahradit pomocí COUNTIFS, SUMIFS v novějších implementacích (Excel 2007+)

● Relace jsou definované na celých číslech● Omezených implementací spreadsheet (maximální velikost)

● Reprezentovány v po sobě jdoucích sloupcích

● Řádky neobsahující prázdné pole (““) odpovídají n-ticím, které patří do relace

● Řádky obsahující prázdné pole (ve sloupcích reprezentace relace) jsou celé prázdné

Page 6: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,

SUMPRODUCT

Page 7: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,

Architektura spreadsheet databáze

● Worksheet● Oddělená matice, ve které lze uchovávat data i formule

● Lze mezi nimi vést reference, což umožňuje oddělovat data od formulí

● Každá tabulka / pohled odpovídá jednomu worksheet● Prázdná tabulka odpovídá téměř prázdnému worksheetu

● Vyjímkou jsou formule zajišťující vlastnosti jako

– PRIMARY KEY, FOREIGN KEY

● Worksheety jsou součástí Workbooků, mezi nimiž v některých implementacích lze také vést odkazy

● Pro tuto problematiku poskytuje možnost optimalizace přepočítávání dat a izolace dat (robustnost proti poškození tabulek, s nimiž uživatel přímo nepracuje)

Page 8: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,

Implementace užitečných funkcí

● Error trapping● Formule mohou být pro nějaký vstup „nedefinované“, v takovém případě selžou (pro nás

není důležité rozlišovat důvody chyb)

● IF(ISERROR(F), ““, F)

– Libobolné selhání je ošetřeno dle potřeby (v tomto případě prázdný výsledek v daném poli)

● Standardizace● Reprezentace relace je „volná“, resp. „standardní“, pokud uspořádání neprázdných řádků a

řádků popisujících n-tice v relaci je libovolné, resp. prázdné řádky, následují až po řádcích n-tic v relaci

● Standardizace převádí „volnou“ reprezentaci na „standardní“ reprezentaci

– Ck << SUMPRODUCT((RxCj:RCj <> ““) * 1) … počet předcházejících standardních řádků

– Cl << MATCH(ROW() - x + 1; Ck; 0) … najdi řádek, kterému předchází aktuální INDEX standardních řádků

– Cm << IF(ISERROR(RCl); ““; INDEX(Cj, RCl)) … nahraď chyby prázdnými řádky (chyby nastaly pouze na těch řádcích, jimž předcházelo málo standardních řádků, tj. prázdné řádky)

Page 9: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,

Implementace užitečných funkcí

● Třídění

ROW() ... současná pozice

+

SUMPRODUCT((RC1:RyC1 <= RC1) * 1) … počet následujících menších

-

SUMPRODUCT((R1C1:RC1 >= RC1) * 1) … počet předcházejících větších

● Mazání duplikátů● SUMPRODUCT((RCj:RyCj = RCj) * (RCk:RyCk = RCk) * …)

– Počet následujicích duplikátů řádku

● IF(RCm = 1; RCn; ““)

– Pokud je v aktuálním řádku 1, pošli na výstup, jinak vrať prázdný výsledek

Page 10: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,

Implementace základní funkcionality

● Selekce

● IF(P, RC[-počet_sloupců_relace], ““)

– P je predikát na sloupcích relace (používající AND, OR, NOT)

● Projekce

● Pouze vynechá kopírovaní sloupců (pokud není projekce přímo výstupem, pak není třeba dělat nic, pouze se v dalších výpočtech sloupce ignorují)

● Union

● RaCb << COUNT(Rx1Cj:Ry

1:Cj) … ulož počet řádků jedné relace

● IF(ROW() <= RaCb; RCj; INDEX(Rx2Ck:Ry

2Ck;ROW() - RaCb));

● Difference

● SUMPRODUCT((Rx2Cj

2:Ry

2Ci

2=RCi

1)*(Rx

2Cj

2:Ry

2Cj

2=RCj

1) ...) … počet shodných řádků

druhé relace s řádky první relace

● IF(RCk = 0; RCi1; ““) … vybere buňku řádku první relace, pokud nebyl v druhé relaci

Page 11: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,

Implementace agregačních funkcí

● SUM● SUMPRODUCT((RxCj:RyCj=RCj) * …* Ck)

● Odstranění duplikátů

● COUNT● Speciální případ SUM (přes sloupec jedniček)

● SUMPRODUCT((RxCj:RyCj=RCj) * …)

● Odstranění duplikátů

● AVG● SUM / COUNT

● MAX● Sestupné setřídění podle agregovaného sloupce

● Odstranění duplikátů přes zbylé sloupce

– Ponechá první výskyt

● Maximální hodnota ve zbylém řádku pro danou hodnotu

● MIN● Opačné hodnoty

Page 12: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,

Implementace základní funkcionality

● Kartézský součin● Nejprve relace standardizujeme

● R1Cs << COUNT(RxCi:RyCi) … počet řádků jedné relace

● R2Cs << COUNT(RuCj:RvCj) … počet řádků druhé relace● IF(ROW() <= R1Cs * R2Cs; INDEX(RxCi:RyCi; INT((ROW() - 1)/R2Cs) + 1); ““)

– Vytvoří R2Cs kopií sloupce Ci (nejprve R2Cs kopií první hodnoty, pak další ...)

● IF(ROW() <= R1Cs * R2Cs; INDEX(RuCj:RvCj; MOD(ROW() - 1; R2Cs) + 1); ““)

– Vytvoří R1Cs kopií sloupce Cj

● SEMIJOIN● IF(ISERROR(MATCH(RCj

1;RxCj

2:RyCj

2;0); ““; RCj

1) … zahodí řádky R

1,

které nejdou spojit s řádky R2

● IF(RCk = ““; ““; RCj2) … pokud šel řádek na výstup, doplní ho zbýlými

hodnotami v ostatních nespojujících sloupcích

Page 13: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,
Page 14: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,
Page 15: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,
Page 16: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,
Page 17: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,
Page 18: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,
Page 19: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,
Page 20: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,

Poznámka k příkladu

Současné implementace spreadsheetů umožňují v notaci uvést Ci, čímž se uživatel odkazuje na celý sloupec. Tato funkcionalita neexistovala v dřívějších verzích nejpoužívanějších implementací.

Pro tento příklad by to znamenalo značné zjednodušení a zobecnění zápisů „R3C[-1]:R19C[-1]“ na „C[-1]“

Page 21: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,

Implementace pokročilé funkcionality

● JOIN● Ačkoli je JOIN možné implementovat pomocí kartézského součinu a selekce,

uvádí autor článku efektivnější implementaci

● Předpokládá setříděné tabulky (třídící algoritmus již máme)

● FOREIGN KEY JOIN (Many-to-one) lze implementovat snadno, spojovací sloupec je klíčovým atributem, hodnoty v něm nejsou duplikovány

– C1:C2 JOIN C3:C4 ON C1 = C3 (C3 PRIMARY KEY)● C5:C6 << IF(RC1 = ““; ““; RC[-4]) … kopíruje C1, C2● C7:C8 << IF(RC1 = ““; ““; INDEX(C[-3]; MATCH(RC1; C3; 0)) … vyhledá odpovídající C3, C4

● Many-to-many JOIN

– Formulí popisujících toto spojení je již více než by na slidu bylo přehledné, proto snad postačí uvést ideu

● Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1, první výskyt RC1 v C1, počet výskytů RC1 v C1. To samé pro druhou tabulku R2

● Provedeme I1 SEMIJOIN I2 a I2 SEMIJOIN I1, čímž vyloučíme řádky, které se nespojí● Nakonec spočteme Kartézský součin na jednotlivých blocích

Page 22: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,

User-Friendliness

Uvedené konverze nejsou příliš přehledné a proto autor článku navrhuje vytvoření webové aplikace,

která by převedla SQL zápis na “ekvivalentní“ spreadsheet implementaci

Page 23: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,

Odlišnosti od RDBMS

● V implementacích spreadsheet aplikací chybí analogie NULL● V úvodních příkladech článku se vůbec hodnoty NULL

neuvažují● Aby byly příklady operací srozumitelné a nezanášely se dalšími IF

● Avšak principiálně je lze zavést (jako specialní string hodnota), což není BÚNO

● Transakce● Nejsou potřeba, jelikož nedochází k paralelnímu přístupu

● Commit … manuální vyhodnocení po konzistentní změně

● Rollback … načtení z disku

Page 24: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,

Emulace funkcionality SQL 92

● DDL (Data Definition Language)● Oddělené vstupní a datové tabulky (filtrování vstupu – Integritní omezení)

● TYPE, LEN umožňují částečnou typovou kontrolu dat. Problematické jsou ““ a “NULL“

● DATE je řešeno formátováním, jinak je to jen číslo

● UNIQUE / PRIMARY KEY odpovída odstraňení duplikátů

● FOREIGN KEY je ověřeno přes SEMIJOIN

– ON DELETE CASCADE je automatický, jiná opatření ON DELETE nejsou možná

● Smazání klíče invaliduje záznam a ten tak neprojde filtrem a není zobrazen v datové tabulce

● Ve vstupní tabulce však vše zůstává (u těchto záznamů je možné zobrazovat varování, pokud se nepovedlo řádek vložit)

● DML (Data Manipulation Language)● Vnější interface je manuální

● DCL (Data Control Language)● Irelevantní, jelikož spreadsheet nerozlišuje uživatele a neřeší paralelní zpracování

Page 25: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,

Příklad integritních omezení

● Uvažme následující schéma● Models(ModelID, …)

● Ord(Id, ModelID, Version, Descr), ModelID odkazuje na Models.ModelID

● V spreadsheet implementaci zavedeme následující worksheety● OrdInput

– n-tice zadané uživatelem

● OrdData

– n-tice odpovídající integritním omezením

– IF(OrdInput!RC5=“Invalid Data“; ““; OrdInput!RC) … pokud na vstupních datech nedošlo k chybě, překopíruje do tabulky Ord

● ModelsData

– Data odkazované tabulky

● Pro názornost jsou na následujícím obrázku všechny tabulky v jednom worksheetu

● Omezení INT, resp. SMALLINT, pro účely ukázky jsou 1024, 512

● Opět lze v novějších implementacích nahradit „RxCj:RyCj“ výrazem „Cj“

Page 26: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,
Page 27: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,

Testy

● Excel 2010 Beta, Intel(R) Core(TM)2 Duo CPU 2.40GHz 2GB RAM● Deseti tisíce řádků

● Využití obou jader

● Operace Standardizace, Třídění, Odstraňování duplikátů, JOINy

– Při použití SUMIFS místo SUMPRODUCT se některé operace zrychlily z jednotek minut na jednotky sekundy

● Insert

– Pokud se přidává na konec tabulky, vyvolá přepočet jedné formule a podle měření zabere 20-30 milisekund

● Delete, Update

– Je potřeba přepočítat lineárně mnoho řádků s pozicí mazaného, změněného řádku

Page 28: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,

Závěr

● Výkonnost● Rozsahy (RiCj:RmCn) jsou většinou ve formulých procházeny sekvenčně

● Formule jsou často v lineárním počtu polí k velikosti vstupní tabulky

● Výsledné přepočítání pak zabere nejméně kvadratický čas

● Existuje prostor pro zlepšení, doposud tato oblast nebyla příliš prozkoumána

● Lze odkazovat i na odlišné workbooky, v nichž se nepřepočítávají formule

● Lze vypnout automatické vyhodnocování a lze si jej vyžádat explicitně

● Funkcionalita● Z povahy spreadsheet aplikací a z jejich původního účelu plynou jistá omezení

(nevykonávají se dotazy, ale vytváří se de facto pohledy)

● Spolu s překladačem SQL do spreadsheet by bylo využití velmi pohodlné a tím přístupné vetší škále uživatelů

● Je otázkou, zda lze pomocí spreadsheetů vyjádřit dotazy v SQL99, Datalogu

– WITH … SELECT

Page 29: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,

Zdroje

● Jerzy Tyszkiewicz: Spreadsheet As a Relational Database Engine. Institute of Informatics, University of Warsaw, 2010

Page 30: Spreadsheet jako engine relačních databázípokorny/dj/prezentace/3_71.pdf · n-tic v relaci Standardizace ... Pro tabulku R1 vytvoříme tabulku (INDEX), kde budou hodnoty RC1,

Otázky?