Introduktion till funktionella beroenden

I den hÀr artikeln kommer vi att prata om funktionella beroenden i databaser - vad de Àr, var de anvÀnds och vilka algoritmer som finns för att hitta dem.

Vi kommer att övervÀga funktionella beroenden i samband med relationsdatabaser. För att uttrycka det vÀldigt grovt, i sÄdana databaser lagras information i form av tabeller. DÀrefter anvÀnder vi ungefÀrliga begrepp som inte Àr utbytbara i strikt relationsteori: vi kallar sjÀlva tabellen för en relation, kolumnerna - attribut (deras uppsÀttning - ett relationsschema) och uppsÀttningen radvÀrden pÄ en delmÀngd av attribut - en tuppel.

Introduktion till funktionella beroenden

Till exempel, i tabellen ovan, (Benson, M, M orgel) Àr en tuppel av attribut (Patient, Paul, lÀkare).
Mer formellt skrivs detta sĂ„ hĂ€r: Introduktion till funktionella beroenden[Patient, kön, lĂ€kaređŸ‡§đŸ‡· (Benson, M, M orgel).
Nu kan vi introducera begreppet funktionellt beroende (FD):

Definition 1. Relationen R uppfyller den federala lagen X → Y (dĂ€r X, Y ⊆ R) om och endast om för nĂ„gra tupler Introduktion till funktionella beroenden, Introduktion till funktionella beroenden ∈ R hĂ„ller: if Introduktion till funktionella beroenden[X] = Introduktion till funktionella beroenden[X], alltsĂ„ Introduktion till funktionella beroenden[Y] = Introduktion till funktionella beroenden[Y]. I det hĂ€r fallet sĂ€ger vi att X (determinanten eller definierande uppsĂ€ttningen av attribut) funktionellt bestĂ€mmer Y (den beroende uppsĂ€ttningen).

Med andra ord, nĂ€rvaron av en federal lag X → Y betyder att om vi har tvĂ„ tuplar in R och de matchar i attribut X, dĂ„ kommer de att sammanfalla i attribut Y.
Och nu, i ordning. LÄt oss titta pÄ attributen Patient О Kön som vi vill ta reda pÄ om det finns beroenden mellan dem eller inte. För en sÄdan uppsÀttning attribut kan följande beroenden finnas:

  1. Patient → Kön
  2. Kön → Patient

Som definierats ovan, för att det första beroendet ska hĂ„lla, varje unikt kolumnvĂ€rde Patient endast ett kolumnvĂ€rde mĂ„ste matcha Kön. Och för exempeltabellen Ă€r detta verkligen fallet. Detta fungerar dock inte i motsatt riktning, det vill sĂ€ga att det andra beroendet inte Ă€r uppfyllt, och attributet Kön Ă€r inte en avgörande faktor för Patient. LikasĂ„ om vi tar beroendet LĂ€kare → Patient, kan du se att det bryts, eftersom vĂ€rdet robin detta attribut har flera olika betydelser - Ellis och Graham.

Introduktion till funktionella beroenden

Introduktion till funktionella beroenden

SĂ„ledes gör funktionella beroenden det möjligt att bestĂ€mma de befintliga relationerna mellan uppsĂ€ttningar av tabellattribut. HĂ€rifrĂ„n och framĂ„t kommer vi att övervĂ€ga de mest intressanta kopplingarna, eller snarare sĂ„dana X → Yvad de Ă€r:

  • icke-trivial, det vill sĂ€ga den högra sidan av beroendet Ă€r inte en delmĂ€ngd av den vĂ€nstra (Y ̞⊆ X);
  • minimal, det vill sĂ€ga det finns inget sĂ„dant beroende Z → YAtt Z ⊂ X.

De beroenden som ansĂ„gs fram till denna punkt var strikta, det vill sĂ€ga att de inte gav nĂ„gra krĂ€nkningar pĂ„ bordet, men utöver dem finns det ocksĂ„ de som tillĂ„ter viss inkonsekvens mellan tuplarnas vĂ€rden. SĂ„dana beroenden placeras i en separat klass, som kallas ungefĂ€rlig, och tillĂ„ts krĂ€nkas för ett visst antal tupler. Denna mĂ€ngd regleras av den maximala felindikatorn emax. Till exempel felfrekvensen Introduktion till funktionella beroenden = 0.01 kan betyda att beroendet kan krĂ€nkas av 1% av de tillgĂ€ngliga tuplarna pĂ„ den betraktade uppsĂ€ttningen attribut. Det vill sĂ€ga, för 1000 poster kan maximalt 10 tupler bryta mot den federala lagen. Vi kommer att övervĂ€ga ett lite annorlunda mĂ„tt, baserat pĂ„ parvis olika vĂ€rden pĂ„ tuplarna som jĂ€mförs. För beroende X → Y pĂ„ attityd r det anses sĂ„ hĂ€r:

Introduktion till funktionella beroenden

LĂ„t oss berĂ€kna felet för LĂ€kare → Patient frĂ„n exemplet ovan. Vi har tvĂ„ tupler vars vĂ€rden skiljer sig Ă„t pĂ„ attributet Patient, men sammanfaller LĂ€kare: Introduktion till funktionella beroenden[LĂ€kare, patient] = (Robin, Ellis) Och Introduktion till funktionella beroenden[LĂ€kare, patient] = (Robin, Graham). Efter definitionen av ett fel mĂ„ste vi ta hĂ€nsyn till alla motstridiga par, vilket innebĂ€r att det kommer att finnas tvĂ„ av dem: (Introduktion till funktionella beroenden, Introduktion till funktionella beroenden) och dess inversion (Introduktion till funktionella beroenden, Introduktion till funktionella beroenden). LĂ„t oss ersĂ€tta det i formeln och fĂ„:

Introduktion till funktionella beroenden

LÄt oss nu försöka svara pÄ frÄgan: "Varför Àr allt för?" Faktum Àr att federala lagar Àr annorlunda. Den första typen Àr de beroenden som bestÀms av administratören vid databasdesignstadiet. De Àr vanligtvis fÄ till antalet, strikta, och huvudapplikationen Àr datanormalisering och relationsschemadesign.

Den andra typen Àr beroenden, som representerar "dolda" data och tidigare okÀnda relationer mellan attribut. Det vill sÀga att sÄdana beroenden inte tÀnktes pÄ vid designtillfÀllet och de Äterfinns för den befintliga datamÀngden, sÄ att man senare, baserat pÄ de mÄnga identifierade federala lagarna, kan dra nÄgra slutsatser om den lagrade informationen. Det Àr just dessa beroenden vi jobbar med. De hanteras av ett helt omrÄde av datautvinning med olika söktekniker och algoritmer byggda pÄ deras bas. LÄt oss ta reda pÄ hur de funna funktionella beroenden (exakta eller ungefÀrliga) i alla data kan vara anvÀndbara.

Introduktion till funktionella beroenden

Idag Àr en av de viktigaste tillÀmpningarna för beroenden datarensning. Det handlar om att utveckla processer för att identifiera "smutsiga data" och sedan korrigera dem. FramtrÀdande exempel pÄ "smutsig data" Àr dubbletter, datafel eller stavfel, saknade vÀrden, inaktuella data, extra mellanslag och liknande.

Exempel pÄ ett datafel:

Introduktion till funktionella beroenden

Exempel pÄ dubbletter i data:

Introduktion till funktionella beroenden

Till exempel har vi en tabell och en uppsÀttning federala lagar som mÄste verkstÀllas. Datarensning i detta fall innebÀr att data Àndras sÄ att de federala lagarna blir korrekta. I det hÀr fallet bör antalet Àndringar vara minimalt (denna procedur har sina egna algoritmer, som vi inte kommer att fokusera pÄ i den hÀr artikeln). Nedan Àr ett exempel pÄ en sÄdan datatransformation. Till vÀnster Àr det ursprungliga förhÄllandet, dÀr de nödvÀndiga FLs uppenbarligen inte Àr uppfyllda (ett exempel pÄ en krÀnkning av en av FLs markeras med rött). Till höger Àr det uppdaterade förhÄllandet, med de gröna cellerna som visar de Àndrade vÀrdena. Efter denna procedur började de nödvÀndiga beroenden upprÀtthÄllas.

Introduktion till funktionella beroenden

En annan populÀr applikation Àr databasdesign. HÀr Àr det vÀrt att pÄminna om normala former och normalisering. Normalisering Àr processen att bringa en relation i överensstÀmmelse med en viss uppsÀttning krav, som var och en definieras av den normala formen pÄ sitt eget sÀtt. Vi kommer inte att beskriva kraven för olika normala former (detta görs i vilken bok som helst om en databaskurs för nybörjare), men vi kommer bara att notera att var och en av dem anvÀnder begreppet funktionella beroenden pÄ sitt eget sÀtt. NÀr allt kommer omkring Àr FL:er i sig integritetsbegrÀnsningar som tas med i berÀkningen nÀr du designar en databas (i sammanhanget för denna uppgift kallas FLs ibland för supernycklar).

LÄt oss övervÀga deras ansökan för de fyra normala formerna pÄ bilden nedan. Kom ihÄg att Boyce-Codds normala form Àr mer strikt Àn den tredje formen, men mindre strikt Àn den fjÀrde. Vi övervÀger inte det senare för tillfÀllet, eftersom dess formulering krÀver en förstÄelse för multi-vÀrderade beroenden, som inte Àr intressanta för oss i den hÀr artikeln.

Introduktion till funktionella beroenden
Introduktion till funktionella beroenden
Introduktion till funktionella beroenden
Introduktion till funktionella beroenden

Ett annat omrÄde dÀr beroenden har hittat sin tillÀmpning Àr att reducera dimensionaliteten hos funktionsutrymmet i uppgifter som att bygga en naiv Bayes-klassificerare, identifiera signifikanta egenskaper och omparametrisera en regressionsmodell. I originalartiklarna kallas denna uppgift bestÀmning av redundant och funktionsrelevans [5, 6], och den löses med aktiv anvÀndning av databaskoncept. Med tillkomsten av sÄdana verk kan vi sÀga att det idag finns en efterfrÄgan pÄ lösningar som gör att vi kan kombinera databasen, analysen och implementeringen av ovanstÄende optimeringsproblem till ett verktyg [7, 8, 9].

Det finns mÄnga algoritmer (bÄde moderna och inte sÄ moderna) för att söka efter federala lagar i en datamÀngd. SÄdana algoritmer kan delas in i tre grupper:

  • Algoritmer som anvĂ€nder traversering av algebraiska gitter (Lattic traversal algoritmer)
  • Algoritmer baserade pĂ„ sökningen efter överenskomna vĂ€rden (Difference- och agree-set algoritmer)
  • Algoritmer baserade pĂ„ parvisa jĂ€mförelser (beroendeinduktionsalgoritmer)

En kort beskrivning av varje typ av algoritm presenteras i tabellen nedan:
Introduktion till funktionella beroenden

Du kan lÀsa mer om denna klassificering [4]. Nedan finns exempel pÄ algoritmer för varje typ:

Introduktion till funktionella beroenden

Introduktion till funktionella beroenden

För nÀrvarande dyker det upp nya algoritmer som kombinerar flera metoder för att hitta funktionella beroenden. Exempel pÄ sÄdana algoritmer Àr Pyro [2] och HyFD [3]. En analys av deras arbete förvÀntas i följande artiklar i denna serie. I den hÀr artikeln kommer vi bara att undersöka de grundlÀggande begreppen och lemma som Àr nödvÀndiga för att förstÄ tekniker för detektering av beroende.

LÄt oss börja med en enkel - skillnad- och överens-uppsÀttning, som anvÀnds i den andra typen av algoritmer. DifferensmÀngd Àr en uppsÀttning tupler som inte har samma vÀrden, medan överens-mÀngd tvÀrtom Àr tupler som har samma vÀrden. Det Àr vÀrt att notera att vi i det hÀr fallet endast övervÀger den vÀnstra sidan av beroendet.

Ett annat viktigt koncept som man stötte pÄ ovan Àr det algebraiska gittret. Eftersom mÄnga moderna algoritmer fungerar pÄ detta koncept mÄste vi ha en uppfattning om vad det Àr.

För att introducera begreppet ett gitter Àr det nödvÀndigt att definiera en delvis ordnad mÀngd (eller delvis ordnad mÀngd, förkortad som poset).

Definition 2. En mĂ€ngd S sĂ€gs vara delvis ordnad av den binĂ€ra relationen â©œ om för alla a, b, c ∈ S följande egenskaper Ă€r uppfyllda:

  1. Reflexivitet, det vill sĂ€ga a â©œ a
  2. Antisymmetri, det vill sĂ€ga om a â©œ b och b â©œ a, dĂ„ a = b
  3. Transitivitet, det vill sĂ€ga för a â©œ b och b â©œ c följer det att a â©œ c


En sĂ„dan relation kallas en (lös) partiell ordningsrelation, och sjĂ€lva mĂ€ngden kallas en delvis ordnad mĂ€ngd. Formell notation: ⟹S, ⩜⟩.

Som det enklaste exemplet pĂ„ en delvis ordnad mĂ€ngd kan vi ta mĂ€ngden av alla naturliga tal N med den vanliga ordningsrelationen â©œ. Det Ă€r lĂ€tt att verifiera att alla nödvĂ€ndiga axiom Ă€r uppfyllda.

Ett mer meningsfullt exempel. Betrakta mĂ€ngden av alla delmĂ€ngder {1, 2, 3}, ordnade efter inklusionsrelationen ⊆. Faktum Ă€r att denna relation uppfyller alla delordningsvillkor, sĂ„ ⟹P ({1, 2, 3}), ⊆⟩ Ă€r en partiellt ordnad mĂ€ngd. Bilden nedan visar strukturen för denna uppsĂ€ttning: om ett element kan nĂ„s med pilar till ett annat element, Ă€r de i en ordningsrelation.

Introduktion till funktionella beroenden

Vi kommer att behöva ytterligare tvÄ enkla definitioner frÄn matematikomrÄdet - supremum och infimum.

Definition 3. LĂ„t ⟹S, ⩜⟩ vara en delvis ordnad mĂ€ngd, A ⊆ S. Den övre grĂ€nsen för A Ă€r ett element u ∈ S sĂ„ att ∀x ∈ S: x â©œ u. LĂ„t U vara mĂ€ngden av alla övre grĂ€nser för S. Om det finns ett minsta element i U, sĂ„ kallas det supremum och betecknas sup A.

Konceptet med en exakt nedre grÀns introduceras pÄ liknande sÀtt.

Definition 4. LĂ„t ⟹S, ⩜⟩ vara en delvis ordnad mĂ€ngd, A ⊆ S. Infimum av A Ă€r ett element l ∈ S sĂ„ att ∀x ∈ S: l â©œ x. LĂ„t L vara mĂ€ngden av alla nedre grĂ€nser för S. Om det finns ett största element i L, sĂ„ kallas det ett infimum och betecknas som inf A.

Betrakta som ett exempel den ovan delvis ordnade uppsĂ€ttningen ⟹P ({1, 2, 3}), ⊆⟩ och hitta supremum och infimum i den:

Introduktion till funktionella beroenden

Nu kan vi formulera definitionen av ett algebraiskt gitter.

Definition 5. LĂ„t ⟹P,⩜⟩ vara en delvis ordnad mĂ€ngd sĂ„ att varje delmĂ€ngd med tvĂ„ element har en övre och nedre grĂ€ns. DĂ„ kallas P ett algebraiskt gitter. I det hĂ€r fallet skrivs sup{x, y} som x √ y, och inf {x, y} som x ∧ y.

LĂ„t oss kontrollera att vĂ„rt arbetsexempel ⟹P ({1, 2, 3}), ⊆⟩ Ă€r ett gitter. För alla a, b ∈ P ({1, 2, 3}), a√b = aâˆȘb och a∧b = a∩b. TĂ€nk till exempel pĂ„ uppsĂ€ttningarna {1, 2} och {1, 3} och hitta deras infimum och supremum. Om vi ​​skĂ€r dem kommer vi att fĂ„ uppsĂ€ttningen {1}, som kommer att vara infimum. Vi fĂ„r det högsta genom att kombinera dem - {1, 2, 3}.

I algoritmer för att identifiera fysiska problem representeras sökutrymmet ofta i form av ett gitter, dÀr uppsÀttningar av ett element (lÀs den första nivÄn i söknÀtverket, dÀr den vÀnstra sidan av beroenden bestÄr av ett attribut) representerar varje attribut av den ursprungliga relationen.
Först betraktar vi beroenden av formen ∅ → Enstaka attribut. Det hĂ€r steget lĂ„ter dig bestĂ€mma vilka attribut som Ă€r primĂ€rnycklar (för sĂ„dana attribut finns det inga determinanter, och dĂ€rför Ă€r den vĂ€nstra sidan tom). Vidare rör sig sĂ„dana algoritmer uppĂ„t lĂ€ngs gallret. Det Ă€r vĂ€rt att notera att inte hela gittret kan korsas, det vill sĂ€ga om den önskade maximala storleken pĂ„ vĂ€nster sida skickas till ingĂ„ngen, kommer algoritmen inte att gĂ„ lĂ€ngre Ă€n en nivĂ„ med den storleken.

Figuren nedan visar hur ett algebraiskt gitter kan anvĂ€ndas i problemet med att hitta en FZ. HĂ€r varje kant (X, XY) representerar ett beroende X → Y. Vi har till exempel klarat den första nivĂ„n och vet att missbruket bibehĂ„lls A → B (vi kommer att visa detta som en grön koppling mellan hörnen A Đž B). Detta innebĂ€r att ytterligare, nĂ€r vi rör oss upp lĂ€ngs gallret, kanske vi inte kontrollerar beroendet A, C → B, eftersom det inte lĂ€ngre kommer att vara minimalt. PĂ„ samma sĂ€tt skulle vi inte kontrollera det om beroendet hölls C → B.

Introduktion till funktionella beroenden
Introduktion till funktionella beroenden

Dessutom anvÀnder som regel alla moderna algoritmer för att söka efter federala lagar en datastruktur som en partition (i den ursprungliga kÀllan - avskalad partition [1]). Den formella definitionen av en partition Àr följande:

Definition 6. LĂ„t X ⊆ R vara en uppsĂ€ttning attribut för relation r. Ett kluster Ă€r en uppsĂ€ttning index av tupler i r som har samma vĂ€rde för X, det vill sĂ€ga c(t) = {i|ti[X] = t[X]}. En partition Ă€r en uppsĂ€ttning kluster, exklusive kluster med enhetslĂ€ngd:

Introduktion till funktionella beroenden

Med enkla ord, en partition för ett attribut X Àr en uppsÀttning listor, dÀr varje lista innehÄller radnummer med samma vÀrden för X. I modern litteratur kallas strukturen som representerar partitioner position list index (PLI). EnhetslÀngdkluster utesluts för PLI-komprimeringsÀndamÄl eftersom de Àr kluster som bara innehÄller ett postnummer med ett unikt vÀrde som alltid Àr lÀtt att identifiera.

LÄt oss titta pÄ ett exempel. LÄt oss ÄtergÄ till samma tabell med patienter och bygga partitioner för kolumnerna Patient О Kön (en ny kolumn har dykt upp till vÀnster, dÀr tabellens radnummer Àr markerade):

Introduktion till funktionella beroenden

Introduktion till funktionella beroenden

Dessutom, enligt definitionen, partitionen för kolumnen Patient kommer faktiskt att vara tom, eftersom enstaka kluster exkluderas frÄn partitionen.

Partitioner kan erhÄllas av flera attribut. Och det finns tvÄ sÀtt att göra detta: genom att gÄ igenom tabellen, bygga en partition med alla nödvÀndiga attribut pÄ en gÄng, eller bygga den genom att anvÀnda operationen för skÀrningspunkten av partitioner med hjÀlp av en delmÀngd av attribut. Sökalgoritmer för federal lag anvÀnder det andra alternativet.

Med enkla ord, för att till exempel fÄ en partition efter kolumner ABC, kan du ta partitioner för AC О B (eller nÄgon annan uppsÀttning disjunkta delmÀngder) och skÀr dem med varandra. Operationen av skÀrningspunkten mellan tvÄ partitioner vÀljer kluster med den största lÀngden som Àr gemensamma för bÄda partitionerna.

LÄt oss titta pÄ ett exempel:

Introduktion till funktionella beroenden

Introduktion till funktionella beroenden

I det första fallet fick vi en tom partition. Om du tittar noga pĂ„ tabellen, sĂ„ finns det faktiskt inga identiska vĂ€rden för de tvĂ„ attributen. Om vi ​​Àndrar tabellen nĂ„got (fallet till höger) fĂ„r vi redan en icke-tom korsning. Dessutom innehĂ„ller raderna 1 och 2 faktiskt samma vĂ€rden för attributen Kön Đž Doctor.

DÀrefter kommer vi att behöva ett sÄdant koncept som partitionsstorlek. Formellt:

Introduktion till funktionella beroenden

Enkelt uttryckt Àr partitionsstorleken antalet kluster som ingÄr i partitionen (kom ihÄg att enstaka kluster inte ingÄr i partitionen!):

Introduktion till funktionella beroenden

Introduktion till funktionella beroenden

Nu kan vi definiera ett av nyckellemman, som för givna partitioner tillÄter oss att avgöra om ett beroende hÄlls eller inte:

Lemma 1. Beroendet A, B → C gĂ€ller om och endast om

Introduktion till funktionella beroenden

Enligt lemma mÄste fyra steg utföras för att avgöra om ett beroende gÀller:

  1. BerÀkna partitionen för den vÀnstra sidan av beroendet
  2. BerÀkna partitionen för höger sida av beroendet
  3. BerÀkna produkten av det första och andra steget
  4. JÀmför storlekarna pÄ partitionerna som erhÄlls i det första och tredje steget

Nedan Àr ett exempel pÄ att kontrollera om beroendet hÄller enligt detta lemma:

Introduktion till funktionella beroenden
Introduktion till funktionella beroenden
Introduktion till funktionella beroenden
Introduktion till funktionella beroenden

I den hÀr artikeln har vi undersökt begrepp som funktionellt beroende, ungefÀrligt funktionsberoende, tittat pÄ var de anvÀnds, samt vilka algoritmer för att söka efter fysiska funktioner som finns. Vi undersökte ocksÄ i detalj de grundlÀggande men viktiga begreppen som aktivt anvÀnds i moderna algoritmer för att söka efter federala lagar.

Referenser:

  1. Huhtala Y. et al. TANE: En effektiv algoritm för att upptĂ€cka funktionella och ungefĂ€rliga beroenden //Datorjournalen. – 1999. – T. 42. – Nej. 2. – s. 100-111.
  2. Kruse S., Naumann F. Effektiv upptĂ€ckt av ungefĂ€rliga beroenden // Proceedings of the VLDB Endowment. – 2018. – T. 11. – Nej. 7. – s. 759-772.
  3. Papenbrock T., Naumann F. A hybrid approach to functional dependency discovery //Proceedings of the 2016 International Conference on Management of Data. – ACM, 2016. – s. 821-833.
  4. Papenbrock T. et al. Functional dependency discovery: En experimentell utvĂ€rdering av sju algoritmer //Proceedings of the VLDB Endowment. – 2015. – T. 8. – Nej. 10. – s. 1082-1093.
  5. Kumar A. et al. Att gĂ„ med eller inte gĂ„ med?: Funderar du tvĂ„ gĂ„nger pĂ„ att gĂ„ med innan du vĂ€ljer funktioner //Proceedings of the 2016 International Conference on Management of Data. – ACM, 2016. – s. 19-34.
  6. Abo Khamis M. et al. InlĂ€rning i databasen med glesa tensorer //Proceedings of the 37th ACM SIGMOD-SIGACT-SIGAI Symposium on Principles of Database Systems. – ACM, 2018. – s. 325-340.
  7. Hellerstein J.M. et al. MADlib-analysbiblioteket: eller MAD-fĂ€rdigheter, SQL //Proceedings of the VLDB Endowment. – 2012. – T. 5. – Nej. 12. – s. 1700-1711.
  8. Qin C., Rusu F. Spekulativa approximationer för terascale distribuerad gradient descent optimering //Proceedings of the Fourth Workshop on Data analytics in the Cloud. – ACM, 2015. – P. 1.
  9. Meng X. et al. Mllib: Machine learning in apache spark //The Journal of Machine Learning Research. – 2016. – T. 17. – Nej. 1. – s. 1235-1241.

Artikelförfattare: Anastasia Birillo, forskare vid JetBrains forskning, CS center student О Nikita Bobrov, forskare vid JetBrains forskning

KĂ€lla: will.com

LĂ€gg en kommentar