Introduktion till funktionella beroenden

I den hÀr artikeln kommer vi att diskutera funktionella beroenden i databaser - vad det Àr, var det tillÀmpas och vilka algoritmer som finns för att hitta dem.

Vi kommer att betrakta funktionella beroenden i sammanhanget av relationella databaser. Om vi ska tala mycket förenklat, sÄ lagras informationen i sÄdana databaser i form av tabeller. Vi kommer att anvÀnda ungefÀrliga begrepp som i strikt relationell teori inte Àr utbytbara: sjÀlva tabellen kallar vi en relation, kolumnerna - attribut (mÀngden av dessa - schemat för relationen), och mÀngden av vÀrden i en rad pÄ en delmÀngd av attribut Àr en tuppel.

Introduktion till funktionella beroenden

Till exempel, i tabellen ovan, (Benson, M, M organ) Àr en tuppel av attributen (Patient, Kön, LÀkare).
Mer formellt skrivs detta pÄ följande sÀtt: Introduktion till funktionella beroenden[Patient, Kön, LÀkare] = (Benson, M, M organ).
Nu kan vi införa begreppet funktionellt beroende (FB):

Definition 1. Relation R uppfyller FB X → Y (dĂ€r X, Y ⊆ R) om och endast om för alla tupple Introduktion till funktionella beroenden, Introduktion till funktionella beroenden ∈ R gĂ€ller: om Introduktion till funktionella beroenden[X] = Introduktion till funktionella beroenden[X], dĂ„ Introduktion till funktionella beroenden[Y] = Introduktion till funktionella beroenden[Y]. I sĂ„ fall sĂ€ger vi att X (determinant eller definierande mĂ€ngd av attribut) funktionellt definierar Y (beroende mĂ€ngd).

Med andra ord, existensen av FB X → Y betyder att om vi har tvĂ„ tupple i R och de överensstĂ€mmer med attributen X, sĂ„ kommer de Ă€ven att överensstĂ€mma med attributen Y.
Och nu i ordning. LÄt oss betrakta attributen Patient och Kön för vilka vi vill veta om det finns beroenden mellan dem eller inte. För en sÄdan uppsÀttning attribut kan följande beroenden existera:

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

Enligt definitionen ovan, för att den första beroendet ska hĂ„lla, mĂ„ste varje unikt vĂ€rde i kolumnen Patient ha ett motsvarande vĂ€rde i kolumnen Kön. Och för exempel-tabellen Ă€r detta verkligen fallet. Men i den omvĂ€nda riktningen fungerar det inte, det vill sĂ€ga det andra beroendet uppfylls inte, och attributet Kön Ă€r inte en determinant för Patient.PĂ„ samma sĂ€tt, om vi tar beroendet LĂ€kare → Patient, kan vi observera att det bryts, eftersom vĂ€rdet Robin för detta attribut har flera olika vĂ€rden - Ellis och Graham.

Introduktion till funktionella beroenden

Introduktion till funktionella beroenden

DĂ€rmed gör funktionella beroenden det möjligt att faststĂ€lla de befintliga relationerna mellan mĂ€ngder av tabellattribut. HĂ€r framöver kommer vi att betrakta de mest intressanta relationerna, mer specifikt sĂ„dana X → Y, som Ă€r:

  • icke-triviala, det vill sĂ€ga att den högra delen av beroendet inte Ă€r en delmĂ€ngd av den vĂ€nstra (Y ̞⊆ X);
  • minimala, vilket innebĂ€r att det inte finns nĂ„got sĂ„dant beroende Z → Y, att Z ⊂ X.

De beroenden vi tidigare har diskuterat var strikta, det vill sĂ€ga de förutsatte inga brott mot tabellen, men bortom dessa finns det ocksĂ„ sĂ„dana som tillĂ„ter viss inkonsekvens mellan vĂ€rdena i tupler. Dessa beroenden placeras i en separat klass, kallas approximativa och tillĂ„ts att brytas pĂ„ ett visst antal tupler. Detta antal regleras av den maximala felprocenten emax. Till exempel, en felandel Introduktion till funktionella beroenden = 0,01 kan betyda att beroendet fĂ„r brytas i 1% av de befintliga tuplerna i den aktuella mĂ€ngden av attribut. Det vill sĂ€ga för 1000 poster kan maximalt 10 tupler bryta mot det funktionella beroendet. Men vi kommer att betrakta en nĂ„got annan metrisk baserad pĂ„ parvis olika vĂ€rden av de jĂ€mförda tuplerna. För beroendet X → Y pĂ„ relationen Ă€r lika med noll. berĂ€knas det 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 överensstĂ€mmer pĂ„ Doktorn: Introduktion till funktionella beroenden[Doktor, Patient] = (Robin, Ellis) och Introduktion till funktionella beroenden[Doktor, Patient] = (Robin, Graham). Enligt feldefinitionen mĂ„ste vi ta hĂ€nsyn till alla konfliktpar, vilket innebĂ€r att det finns 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 sĂ€tta in i formeln och fĂ„:

Introduktion till funktionella beroenden

Och nu försöker vi svara pÄ frÄgan: "Vad Àr syftet med allt detta?" Faktum Àr att funktionella beroenden kan variera. Den första typen Àr sÄdana beroenden som definieras av administratören i designfasen av databasen. De Àr vanligtvis fÄ, strikta och deras huvudsyfte Àr datanormalisering och design av relationsscheman.

Den andra typen Àr beroenden som representerar "dolda" data och tidigare okÀnda relationer mellan attribut. Det vill sÀga, sÄdana beroenden tÀnktes inte pÄ i designskedet och upptÀcks först för en befintlig datamÀngd, för att sedan, baserat pÄ ett stort antal upptÀckta funktionella beroenden, dra slutsatser om den lagrade informationen. Det Àr just sÄdana beroenden vi arbetar med. Detta Àr ett helt omrÄde inom datautvinning med olika söktekniker och algoritmer byggda pÄ dessa. LÄt oss utforska hur de upptÀckta funktionella beroendena (exakta eller approximativa) kan vara anvÀndbara i vissa data.

Introduktion till funktionella beroenden

Idag identifieras datarensning bland de viktigaste tillÀmpningsomrÄdena för beroenden. Det innebÀr utveckling av processer för att avslöja "smutsiga data" följt av rÀttelse. FramtrÀdande exempel pÄ "smutsiga data" Àr dubbletter, fel i data eller stavfel, saknade vÀrden, förÄldrade data, överflödiga mellanslag och liknande.

Exempel pÄ fel i data:

Introduktion till funktionella beroenden

Exempel pÄ dubbletter i data:

Introduktion till funktionella beroenden

Till exempel har vi en tabell och ett antal funktionella beroenden som mÄste uppfyllas. Datarensning innebÀr i det hÀr fallet att Àndra data sÄ att funktionella beroenden blir korrekta. Antalet modifieringar mÄste vara minimalt (det finns specifika algoritmer för denna procedur, som vi inte kommer att fokusera pÄ i denna artikel). Nedan ges ett exempel pÄ en sÄdan datatransformation. Till vÀnster visas den ursprungliga relationen, dÀr det uppenbarligen inte uppfylls nödvÀndiga funktionella beroenden (exemplet pÄ brott mot en av de funktionella beroendena markeras med röd fÀrg). Till höger presenteras den uppdaterade relationen, dÀr de gröna cellerna visar de Àndrade vÀrdena. Efter att ett sÄdant förfarande genomförts började nödvÀndiga beroenden att upprÀtthÄllas.

Introduktion till funktionella beroenden

Ett annat populÀrt tillÀmpningsomrÄde Àr databasdesign. HÀr Àr det viktigt att nÀmna normala former och normalisering. Normalisering Àr processen att anpassa en relation till ett visst antal krav, dÀr varje krav definieras unikt av den normala formen. Vi kommer inte att beskriva kraven för de olika normala formerna (detta görs i varje bok om databaskurser för nybörjare), utan bara pÄpeka att var och en av dem anvÀnder konceptet funktionella beroenden pÄ sitt sÀtt. För i grunden Àr funktionella beroenden (FD) begrÀnsningar för integritet, som beaktas vid databasdesign (i detta sammanhang kallas FD ibland supernycklar).

LÄt oss se deras tillÀmpning för de fyra normala formerna i bilden nedan. Kom ihÄg att Boyce-Codd normalform Àr striktare Àn den tredje formen, men mindre strikt Àn den fjÀrde. Den sista kommer vi inte att betrakta för tillfÀllet, eftersom förstÄelsen av mÄngvÀrdiga beroenden krÀvs för denna, vilket inte Àr vÄrt fokus i denna artikel.

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 minskning av dimensionerna i funktionsrummet för uppgifter som att bygga en naiv Bayesklassificerare, extrahera betydande funktioner och reparmetrisera ett regressionsmodell. I originalartiklar kallas denna uppgift för definiering av redundanta funktioner (feature redundancy) och relevanta (feature relevancy), och den löses med aktiv anvÀndning av databaskoncept. Med framvÀxten av sÄdana arbeten kan vi sÀga att det idag finns en efterfrÄgan pÄ lösningar som kan kombinera databas, analys och genomförande av ovanstÄende optimeringsproblem i ett enda verktyg.

Det finns mÄnga algoritmer för att söka efter funktionella beroenden i datamÀngder (bÄde moderna och mindre moderna). Dessa algoritmer kan delas in i tre grupper:

  • Algoritmer som anvĂ€nder traversering av algebraiska gitter (Lattice traversal algorithms)
  • Algoritmer som baseras pĂ„ sökandet efter överenskomna vĂ€rden (Difference- and agree-set algorithms)
  • Algoritmer som baseras pĂ„ parvisa jĂ€mförelser (Dependency induction algorithms)

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

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

Introduktion till funktionella beroenden

Introduktion till funktionella beroenden

Det dyker nu upp nya algoritmer som kombinerar flera tillvÀgagÄngssÀtt för att identifiera funktionella beroenden. Exempel pÄ sÄdana algoritmer Àr Pyro [2] och HyFD [3]. En djupare analys av deras funktion kommer att göras i följande artiklar i denna serie. I denna artikel kommer vi endast att gÄ igenom de grundlÀggande begreppen och lemman som Àr nödvÀndiga för att förstÄ teknikerna för att identifiera beroenden.

Vi börjar med det enkla — diïŹ€erence-set och agree-set, som anvĂ€nds i den andra typen av algoritmer. DiïŹ€erence-set Ă€r en mĂ€ngd tupler som inte överensstĂ€mmer i vĂ€rden, medan agree-set Ă„ sin sida bestĂ„r av tupler som överensstĂ€mmer i vĂ€rden. Det Ă€r vĂ€rt att notera att vi i det hĂ€r fallet endast betraktar den vĂ€nstra sidan av beroendet.

Ett viktigt begrepp som nÀmnts tidigare Àr den algebraiska latticen. Eftersom mÄnga moderna algoritmer arbetar med detta begrepp behöver vi ha en uppfattning om vad det Àr.

För att introducera begreppet lattice mĂ„ste vi börja med definitionen av en delvis ordnad mĂ€ngd (eller partially ordered set, förkortat — poset).

Definition 2. Det sĂ€gs att mĂ€ngden S Ă€r delvis ordnad genom den binĂ€ra relationen ⩜ om egenskaperna nedan gĂ€ller för alla a, b, c ∈ S:

  1. Reflexivitet, det vill sĂ€ga a ⩜ a
  2. Antisymmetri, det vill sĂ€ga om a ⩜ b och b ⩜ a, sĂ„ Ă€r a = b
  3. Transitivitet, det vill sĂ€ga för a ⩜ b och b ⩜ c gĂ€ller att a ⩜ c


En sĂ„dan relation kallas för en (icke-strikt) delordningsrelation, och mĂ€ngden sjĂ€lv kallas en delvis ordnad mĂ€ngd. Formellt betecknat: ⟹S, ⩜⟩.

Ett enkelt exempel pĂ„ en delvis ordnad mĂ€ngd Ă€r mĂ€ngden av alla naturliga tal N med den vanliga ordningsrelationen ⩜. Det Ă€r lĂ€tt att verifiera att alla nödvĂ€ndiga axiom uppfylls.

Ett mer innehĂ„llsrikt exempel. LĂ„t oss betrakta mĂ€ngden av alla delmĂ€ngder {1, 2, 3}, ordnad genom inklusion ⊆. Faktum Ă€r att denna relation uppfyller alla villkor för delordning, sĂ„ ⟹P ({1, 2, 3}), ⊆⟩ Ă€r en delvis ordnad mĂ€ngd. Nedan visas strukturen av denna mĂ€ngd: om man kan nĂ„ ett element frĂ„n ett annat via pilarna, sĂ„ Ă€r de i enordningsrelation.

Introduktion till funktionella beroenden

Vi behöver ytterligare tvĂ„ enkla definitioner frĂ„n matematikens omrĂ„de — supremum (supremum) och infimum (infimum).

Definition 3. LĂ„t ⟹S, ⩜⟩ vara en delvis ordnad mĂ€ngd, A ⊆ S. En övre grĂ€ns 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, kallas det supremum och betecknas som sup A.

PÄ liknande sÀtt introduceras begreppet exakt nedre grÀns.

Definition 4. LĂ„t ⟹S, ⩜⟩ vara en delvis ordnad mĂ€ngd, A ⊆ S. En nedre grĂ€ns för 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, kallas det infimum och betecknas som inf A.

LĂ„t oss ta det delvis ordnade mĂ€ngden ⟹P ({1, 2, 3}), ⊆⟩ som exempel och hitta dess supremum och infimum:

Introduktion till funktionella beroenden

Nu kan vi formulera definitionen av en algebraisk gitter.

Definition 5. LĂ„t ⟹P, ⩜⟩ vara en delvis ordnad mĂ€ngd dĂ€r varje tvĂ„elementsmĂ€ngd har exakta övre och nedre grĂ€nser. DĂ„ kallas P för en algebraisk gitter. HĂ€r skrivs sup{x, y} som x √ y, och inf {x, y} som x ∧ y.

Vi kontrollerar att vĂ„rt arbetsprov ⟹P ({1, 2, 3}), ⊆⟩ Ă€r ett gitter. Faktiskt, för alla a, b ∈ P ({1, 2, 3}), Ă€r a√b = aâˆȘb, och a∧b = a∩b. Till exempel, ta mĂ€ngderna {1, 2} och {1, 3} och hitta deras infimum och supremum. Om vi korsar dem fĂ„r vi mĂ€ngden {1}, vilket kommer att vara infimum. Supremum fĂ„r vi genom att unionera dem — {1, 2, 3}.

I algoritmer för att identifiera FDs representeras sökomrÄdet ofta i form av ett gitter, dÀr mÀngder med ett enda element (lÀs första nivÄn av sökgittern, dÀr den vÀnstra delen av beroenden bestÄr av en enda attribut) representerar varje attribut i den ursprungliga relationen.
Till en början övervĂ€gs beroenden av typen ∅ → Ett ensamt attribut. Detta steg gör det möjligt att bestĂ€mma vilka attribut som Ă€r primĂ€ra nycklar (för sĂ„dana attribut finns det inga determinanter, och dĂ€rför Ă€r den vĂ€nstra delen tom). Vidare fortsĂ€tter sĂ„dana algoritmer att röra sig uppĂ„t i gitret. Det Ă€r ocksĂ„ vĂ€rt att notera att gitret inte behöver genomsökas helt, det vill sĂ€ga att om man matar in den önskade maximala storleken pĂ„ den vĂ€nstra delen, sĂ„ kommer algoritmen inte att gĂ„ lĂ€ngre Ă€n nivĂ„n med denna storlek.

I bilden nedan visas hur en algebraisk gitter kan anvĂ€ndas i en problemstĂ€llning för att söka efter FZ. HĂ€r representerar varje kant (X, XY) ett beroende X → Y. Till exempel har vi passerat första nivĂ„n och vet att beroendet hĂ„lls A → B (vi representerar detta med en grön koppling mellan noderna A och B). SĂ„ledes, nĂ€r vi gĂ„r vidare uppĂ„t i gitteret, behöver vi inte kontrollera beroendet A, C → B, eftersom det redan inte kommer att vara minimalt. PĂ„ liknande sĂ€tt skulle vi inte behöva kontrollera det om beroendet C → B.

Introduktion till funktionella beroenden
Introduktion till funktionella beroenden

hĂ„lls. Dessutom anvĂ€nder alla moderna algoritmer för FZ-sökning vanligtvis en datastruktur som kallas partition (i originalet – stripped partition [1]). Den formella definitionen av partition ser ut pĂ„ följande sĂ€tt:

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

Introduktion till funktionella beroenden

Enkelt uttryckt utgör partitionen för attributet X 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 för position list index (PLI). Kluster av enhetslÀngd utesluts för att komprimera PLI, eftersom det Àr kluster som endast innehÄller numret pÄ posten med ett unikt vÀrde som alltid lÀtt kan faststÀllas.

LÄt oss titta pÄ ett exempel. Vi ÄtervÀnder till samma tabell med patienter och bygger partitioner för kolumnerna Patient och Kön (en ny kolumn har lagts till till vÀnster, dÀr radnumren i tabellen markeras):

Introduktion till funktionella beroenden

Introduktion till funktionella beroenden

DÀrvid, enligt definitionen, kommer partitionen för kolumnen Patient faktiskt vara tom, eftersom enskilda kluster utesluts frÄn partitionen.

Partitioner kan genereras baserat pÄ flera attribut. För detta finns det tvÄ vÀgar: genom att gÄ igenom tabellen för att bygga en partition omedelbart för alla nödvÀndiga attribut, eller att bygga den med hjÀlp av operationen att korsa partitioner baserat pÄ en delmÀngd av attribut. Algoritmer för FZ-sökning anvÀnder det andra alternativet.

Enkelt uttryckt, för att t.ex. fÄ en partition för kolumnerna ABC, kan man ta partitionerna för AC och B (eller vilket annat uppsÀttning av icke-överlappande delmÀngder som helst) och korsa dem med varandra. En korskning av tvÄ partitioner identifierar de lÀngsta kluster 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 vi tittar nÀrmare pÄ tabellen finns det faktiskt inga identiska vÀrden för de tvÄ attributen. Om vi istÀllet modifierar tabellen nÄgot (fallet till höger), sÄ fÄr vi en icke-tom korsning. HÀr innehÄller raderna 1 och 2 faktiskt samma vÀrden för attributen. Kön och Doktor.

DÀrefter kommer vi att behöva begreppet partitionens storlek. Formellt:

Introduktion till funktionella beroenden

Enklare uttryckt Àr partitionens storlek antalet kluster som ingÄr i partitionen (kom ihÄg att enskilda kluster inte ingÄr i partitionen!):

Introduktion till funktionella beroenden

Introduktion till funktionella beroenden

Nu kan vi definiera ett av de nyckellemmor som för angivna partitioner gör det möjligt att faststÀlla om beroendet hÄlls eller inte:

Lemma 1. Beroendet A, B → C hĂ„lls om och endast om

Introduktion till funktionella beroenden

Enligt lemmana, för att avgöra om ett beroende hÄlls, mÄste fyra steg utföras:

  1. BerÀkna partitionen för den vÀnstra delen av beroendet
  2. BerÀkna partitionen för den högra delen 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

Nedanför finns ett exempel pÄ kontroll av om beroendet hÄlls enligt denna lemma:

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

I denna artikel har vi gÄtt igenom begreppen funktionellt beroende, approximativt funktionellt beroende, diskuterat var de anvÀnds, samt vilka algoritmer som finns för att söka efter FB. Vi har ocksÄ noggrant gÄtt igenom grundlÀggande, men viktiga begrepp som aktivt anvÀnds i moderna algoritmer för att söka efter FB.

Referenser:

  1. Huhtala Y. et al. TANE: En effektiv algoritm för att upptÀcka funktionella och approximativa beroenden // The computer journal. - 1999. - Vol. 42. - No. 2. - S. 100-111.
  2. Kruse S., Naumann F. Effektiv upptÀckte av approximativa beroenden // Proceedings of the VLDB Endowment. - 2018. - Vol. 11. - No. 7. - S. 759-772.
  3. Papenbrock T., Naumann F. En hybridmetod för upptÀckte av funktionella beroenden // Proceedings of the 2016 International Conference on Management of Data. - ACM, 2016. - S. 821-833.
  4. Papenbrock T. et al. UpptÀckte av funktionella beroenden: En experimentell utvÀrdering av sju algoritmer // Proceedings of the VLDB Endowment. - 2015. - Vol. 8. - No. 10. - S. 1082-1093.
  5. Kumar A. et al. Att gÄ med eller inte?: TÀnka efter tvÄ gÄnger om join-ningar innan funktionell urval // Proceedings of the 2016 International Conference on Management of Data. - ACM, 2016. - S. 19-34.
  6. Abo Khamis M. et al. In-database learning with sparse tensors //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. The MADlib analytics library: or MAD skills, the SQL //Proceedings of the VLDB Endowment. – 2012. – Vol. 5. – No. 12. – S. 1700-1711.
  8. Qin C., Rusu F. Speculative approximations for terascale distributed gradient descent optimization //Proceedings of the Fourth Workshop on Data analytics in the Cloud. – ACM, 2015. – S. 1.
  9. Meng X. et al. Mllib: Machine learning in apache spark //The Journal of Machine Learning Research. – 2016. – Vol. 17. – No. 1. – S. 1235-1241.

Författarna till artikeln: Anastasia Birillo, forskare vid JetBrains Research, studenter vid CS-centret och Nikita Bobrov, forskare vid JetBrains Research

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster