Pambuka kanggo Dependensi Fungsional

Ing artikel iki kita bakal ngomong babagan dependensi fungsional ing basis data - apa iku, ing ngendi digunakake lan algoritma apa sing bisa ditemokake.

Kita bakal nimbang dependensi fungsional ing konteks database relasional. Kanggo sijine iku banget kira-kira, ing database kuwi informasi disimpen ing wangun tabel. Sabanjure, kita nggunakake konsep kira-kira sing ora bisa diijolake ing teori relasional sing ketat: kita bakal nyebut tabel kasebut minangka hubungan, kolom - atribut (sete - skema hubungan), lan set nilai baris ing subset atribut. - tuple.

Pambuka kanggo Dependensi Fungsional

Contone, ing tabel ing ndhuwur, (Benson, M, M organ) minangka tuple saka atribut (Pasien, Paul, Dokter).
Luwih resmi, iki ditulis kaya ing ngisor iki: Pambuka kanggo Dependensi Fungsional[Pasien, Jenis Kelamin, Dokter] = (Benson, M, M organ).
Saiki kita bisa ngenalake konsep ketergantungan fungsional (FD):

Definisi 1. Hubungan R netepi hukum federal X → Y (ngendi X, Y ⊆ R) yen lan mung yen kanggo tuple sembarang Pambuka kanggo Dependensi Fungsional, Pambuka kanggo Dependensi Fungsional ∈ R ngemu: yen Pambuka kanggo Dependensi Fungsional[X] = Pambuka kanggo Dependensi Fungsional[X] banjur Pambuka kanggo Dependensi Fungsional[Y] = Pambuka kanggo Dependensi Fungsional[Y]. Ing kasus iki, kita ngomong yen X (penentu, utawa nemtokake set atribut) kanthi fungsional nemtokake Y (set gumantung).

Ing tembung liyane, ing ngarsane saka hukum federal X → Y tegese yen kita duwe rong tuple ing R lan padha cocog ing atribut X, banjur padha bakal pas karo atribut Y.
Lan saiki, supaya. Ayo katon ing atribut Patient и Jinis kanggo kang kita arep kanggo mangerteni apa ana dependensi antarane wong-wong mau utawa ora. Kanggo set atribut kasebut, dependensi ing ngisor iki bisa uga ana:

  1. Pasien → Jenis Kelamin
  2. Jenis Kelamin → Pasien

Kaya sing ditegesake ing ndhuwur, supaya ketergantungan pisanan ditahan, saben nilai kolom unik Patient mung siji nilai kolom kudu cocog Jinis. Lan kanggo tabel conto iki pancen bener. Nanging, iki ora bisa digunakake ing arah ngelawan, yaiku, ketergantungan kapindho ora puas, lan atribut Jinis ora dadi penentu kanggo sing sabar. Kajaba iku, yen kita njupuk katergantungan Dokter → Pasien, sampeyan bisa ndeleng sing wis nerak, wiwit Nilai Robin atribut iki nduweni macem-macem makna - Ellis lan Graham.

Pambuka kanggo Dependensi Fungsional

Pambuka kanggo Dependensi Fungsional

Mangkono, dependensi fungsional ndadekake bisa nemtokake hubungan sing ana ing antarane set atribut tabel. Saka kene kita bakal nimbang sambungan paling menarik, utawa luwih X → Yapa padha:

  • non-trivial, sing, sisih tengen katergantungan ora subset saka kiwa (Y ̸⊆ X);
  • minimal, sing, ora ana katergantungan kuwi Z → Y, sing Z ⊂ X.

Ketergantungan sing dianggep nganti titik iki ketat, yaiku, ora nyedhiyakake pelanggaran ing meja, nanging saliyane, ana uga sing ngidini sawetara inconsistency antarane nilai tuple. Ketergantungan kasebut diselehake ing kelas sing kapisah, diarani kira-kira, lan diijini dilanggar kanggo sawetara tuple. Jumlah iki diatur dening emax indikator kesalahan maksimum. Contone, tingkat kesalahan Pambuka kanggo Dependensi Fungsional = 0.01 bisa ateges sing katergantungan bisa nerak 1% saka tuples kasedhiya ing pesawat dianggep atribut. Tegese, kanggo 1000 cathetan, maksimal 10 tuple bisa nglanggar Hukum Federal. Kita bakal nimbang metrik sing rada beda, adhedhasar nilai pasangan sing beda saka tuple sing dibandhingake. Kanggo ketagihan X → Y ing sikap r dianggep kaya mangkene:

Pambuka kanggo Dependensi Fungsional

Ayo ngetung kesalahan kanggo Dokter → Pasien saka conto ing ndhuwur. Kita duwe rong tuple sing nilaine beda karo atribut kasebut Patient, nanging pas karo Dokter: Pambuka kanggo Dependensi Fungsional[Dokter, Pasien] = (Robin, Ellis) lan Pambuka kanggo Dependensi Fungsional[Dokter, Pasien] = (Robin, Graham). Sawise definisi kesalahan, kita kudu nggatekake kabeh pasangan sing konflik, tegese bakal ana loro: (Pambuka kanggo Dependensi Fungsional, Pambuka kanggo Dependensi Fungsional) lan kosok balene (Pambuka kanggo Dependensi Fungsional, Pambuka kanggo Dependensi Fungsional). Ayo ngganti menyang rumus lan entuk:

Pambuka kanggo Dependensi Fungsional

Saiki ayo nyoba mangsuli pitakon: "Yagene kabeh kanggo?" Nyatane, hukum federal beda-beda. Jinis pisanan yaiku dependensi sing ditemtokake dening administrator ing tahap desain database. Biasane sawetara jumlahe, ketat, lan aplikasi utama yaiku normalisasi data lan desain skema relasional.

Jinis kapindho yaiku dependensi, sing makili data "didhelikake" lan hubungan sing sadurunge ora dingerteni antarane atribut. Tegese, dependensi kasebut ora dipikirake nalika ngrancang lan ditemokake kanggo set data sing wis ana, supaya mengko, adhedhasar akeh hukum federal sing diidentifikasi, kesimpulan apa wae bisa digambar babagan informasi sing disimpen. Iku sabenere dependensi iki kita bisa karo. Dheweke ditangani kanthi kabeh bidang data pertambangan kanthi macem-macem teknik telusuran lan algoritma sing dibangun kanthi basis. Ayo ngerteni kepiye dependensi fungsional sing ditemokake (tepat utawa kira-kira) ing data apa wae bisa migunani.

Pambuka kanggo Dependensi Fungsional

Saiki, salah sawijining aplikasi utama dependensi yaiku reresik data. Iku kalebu proses ngembangaken kanggo ngenali "data reged" lan banjur mbenerake. Conto penting saka "data reged" yaiku duplikat, kesalahan data utawa kesalahan ketik, nilai sing ilang, data sing wis kadaluwarsa, spasi ekstra, lan liya-liyane.

Tuladha kesalahan data:

Pambuka kanggo Dependensi Fungsional

Conto duplikat ing data:

Pambuka kanggo Dependensi Fungsional

Contone, kita duwe meja lan sakumpulan hukum federal sing kudu dileksanakake. Reresik data ing kasus iki kalebu ngganti data supaya Hukum Federal dadi bener. Ing kasus iki, jumlah modifikasi kudu minimal (prosedur iki nduweni algoritma dhewe, sing ora bakal kita fokusake ing artikel iki). Ing ngisor iki conto transformasi data kasebut. Ing sisih kiwa punika sesambetan asli, kang, temenan, FLs perlu ora ketemu (conto nglanggar salah siji saka FLs disorot abang). Ing sisih tengen ana hubungan sing dianyari, kanthi sel ijo sing nuduhake nilai sing diganti. Sawise prosedur iki, dependensi sing dibutuhake wiwit dijaga.

Pambuka kanggo Dependensi Fungsional

Aplikasi populer liyane yaiku desain database. Kene iku worth ngelingi wangun normal lan normalisasi. Normalisasi minangka proses nyetujoni sesambungan karo seperangkat syarat tartamtu, saben-saben ditetepake kanthi wujud normal kanthi cara dhewe. Kita ora bakal njlèntrèhaké syarat saka macem-macem formulir normal (iki wis rampung ing sembarang buku ing kursus database kanggo pamula), nanging kita mung bakal Wigati sing saben wong nggunakake konsep dependensi fungsi ing cara dhewe. Sawise kabeh, FL minangka watesan integritas sing dianggep nalika ngrancang basis data (ing konteks tugas iki, FL kadhangkala disebut superkey).

Ayo dipikirake aplikasi kanggo papat wangun normal ing gambar ing ngisor iki. Elinga yen Boyce-Codd wangun normal luwih ketat saka wangun katelu, nanging kurang ketat saka papat. Saiki kita ora nganggep sing terakhir, amarga formulasi kasebut mbutuhake pangerten babagan dependensi multi-nilai, sing ora menarik kanggo kita ing artikel iki.

Pambuka kanggo Dependensi Fungsional
Pambuka kanggo Dependensi Fungsional
Pambuka kanggo Dependensi Fungsional
Pambuka kanggo Dependensi Fungsional

Wilayah liyane ing ngendi dependensi nemokake aplikasi kasebut yaiku nyuda dimensi ruang fitur ing tugas kayata mbangun klasifikasi Bayes naif, ngenali fitur sing signifikan, lan reparameterisasi model regresi. Ing artikel asli, tugas iki diarani penentuan relevansi keluwih lan fitur [5, 6], lan ditanggulangi kanthi nggunakake konsep basis data sing aktif. Kanthi tekane karya kasebut, kita bisa ujar manawa saiki ana panjaluk solusi sing ngidini kita nggabungake database, analytics lan implementasine masalah optimasi ing ndhuwur dadi siji alat [7, 8, 9].

Ana akeh algoritma (loro modern lan ora modern) kanggo nggoleki hukum federal ing kumpulan data. Algoritma kasebut bisa dipérang dadi telung klompok:

  • Algoritma nggunakake traversal of aljabar lattices (Lattice traversal algorithms)
  • Algoritma adhedhasar telusuran nilai sing disepakati (Algoritma prabédan lan sarujuk)
  • Algoritma adhedhasar perbandingan pasangan (Algoritma induksi dependensi)

Katrangan ringkes saben jinis algoritma ditampilake ing tabel ing ngisor iki:
Pambuka kanggo Dependensi Fungsional

Sampeyan bisa maca liyane babagan klasifikasi iki [4]. Ing ngisor iki conto algoritma kanggo saben jinis:

Pambuka kanggo Dependensi Fungsional

Pambuka kanggo Dependensi Fungsional

Saiki, algoritma anyar katon sing nggabungake sawetara pendekatan kanggo nemokake dependensi fungsional. Conto algoritma kasebut yaiku Pyro [2] lan HyFD [3]. Analisis karyane diarepake ing artikel ing seri iki. Ing artikel iki kita mung bakal nliti konsep dhasar lan lemma sing perlu kanggo mangerteni teknik deteksi dependensi.

Ayo dadi miwiti karo prasaja - prabédan- lan setuju-set, digunakake ing jinis kaloro algoritma. Difference-set yaiku sakumpulan tuple sing ora nduweni nilai sing padha, dene set-set setuju, sebaliknya, yaiku tuple sing nduweni nilai sing padha. Wigati dicathet yen ing kasus iki kita mung nimbang sisih kiwa katergantungan.

Konsep penting liyane sing ditemokake ing ndhuwur yaiku kisi aljabar. Amarga akeh algoritma modern sing digunakake ing konsep iki, kita kudu duwe gagasan apa iku.

Kanggo ngenalake konsep kisi, perlu kanggo nemtokake set sing diurutake sebagian (utawa set sing diurutake sebagian, disingkat poset).

Definisi 2. A himpunan S diarani sebagean diurutake kanthi relasi biner ⩽ yen kanggo kabeh a, b, c ∈ S sifat-sifat ing ngisor iki kacukupan:

  1. Refleksivity, yaiku, a ⩽ a
  2. Antisimetri, yaiku, yen a ⩽ b lan b ⩽ a, banjur a = b
  3. Transitivity, yaiku, kanggo a ⩽ b lan b ⩽ c banjur a ⩽ c


Sesambungan kang kaya mangkono iku diarani sesambungan urutan sebagean (longgar), lan sesambungan kasebut dhewe diarani sesambungan parsial. Notasi formal: ⟨S, ⩽⟩.

Minangka conto paling gampang saka himpunan sing diurutake sebagian, kita bisa njupuk himpunan kabeh nomer alami N kanthi relasi urutan biasa ⩽. Gampang kanggo verifikasi manawa kabeh aksioma sing dibutuhake wis kepenak.

Conto sing luwih migunani. Coba himpunan kabeh subset {1, 2, 3}, miturut relasi inklusi ⊆. Pancen, hubungan iki nyukupi kabeh kahanan urutan parsial, mula ⟨P ({1, 2, 3}), ⊆⟩ minangka kumpulan sing diurutake sebagian. Tokoh ing ngisor iki nuduhake struktur pesawat iki: yen siji unsur bisa ngrambah dening panah kanggo unsur liyane, banjur padha ing sesambetan urutan.

Pambuka kanggo Dependensi Fungsional

Kita butuh rong definisi sing luwih gampang saka bidang matematika - supremum lan infimum.

Definisi 3. Ayo ⟨S, ⩽⟩ dadi himpunan sing diurut sebagian, A ⊆ S. Watesan ndhuwur A minangka unsur u ∈ S supaya ∀x ∈ S: x ⩽ u. Ayo U dadi set kabeh wates ndhuwur S. Yen ana unsur paling cilik ing U, banjur diarani supremum lan dilambangake sup A.

Konsep wates ngisor sing tepat ditepungake kanthi cara sing padha.

Definisi 4. Ayo ⟨S, ⩽⟩ dadi himpunan sing diurutake sebagian, A ⊆ S. Infimum saka A yaiku unsur l ∈ S supaya ∀x ∈ S: l ⩽ x. Ayo L dadi set kabeh wates ngisor S. Yen ana unsur paling gedhe ing L, banjur diarani infimum lan diarani inf A.

Coba conto himpunan sing diurutake sebagian ⟨P ({1, 2, 3}), ⊆⟩ lan temokake supremum lan infimum ing:

Pambuka kanggo Dependensi Fungsional

Saiki kita bisa ngrumusake definisi kisi aljabar.

Definisi 5. Ayo ⟨P,⩽⟩ dadi himpunan sing diurutake sebagian supaya saben subset rong unsur duwe wates ndhuwur lan ngisor. Banjur P diarani kisi aljabar. Ing kasus iki, sup{x, y} ditulis minangka x ∨ y, lan inf {x, y} minangka x ∧ y.

Priksa manawa conto kerja ⟨P ({1, 2, 3}), ⊆⟩ minangka kisi. Pancen, kanggo sembarang a, b ∈ P ({1, 2, 3}), a∨b = a∪b, lan a∧b = a∩b. Contone, nimbang set {1, 2} lan {1, 3} lan golek infimum lan supremum. Yen kita intersect, kita bakal entuk set {1}, sing bakal dadi infimum. Kita entuk supremum kanthi nggabungake - {1, 2, 3}.

Ing algoritma kanggo ngenali masalah fisik, papan telusuran asring diwakili ing bentuk kisi, ing ngendi set siji unsur (waca tingkat pertama kisi telusuran, ing sisih kiwa saka dependensi kasusun saka siji atribut) makili saben atribut saka hubungan asli.
Kaping pisanan, kita nimbang dependensi saka wangun ∅ → Atribut tunggal. Langkah iki ngidini sampeyan nemtokake atribut sing minangka kunci utama (kanggo atribut kasebut ora ana penentu, mula sisih kiwa kosong). Salajengipun, algoritma kasebut pindhah munggah ing sadawane kisi. Wigati dicathet yen ora kabeh kisi bisa dilewati, yaiku, yen ukuran maksimum sing dikarepake ing sisih kiwa diterusake menyang input, mula algoritma kasebut ora bakal ngluwihi level kanthi ukuran kasebut.

Tokoh ing ngisor iki nuduhake carane kisi aljabar bisa digunakake ing masalah nemokake FZ. Ing kene saben pinggir (X, XY) nggambarake ketergantungan X → Y. Contone, kita wis liwati tingkat pisanan lan ngerti sing kecanduan wis maintained A → B (kita bakal nampilake iki minangka sambungan ijo antarane vertex A и B). Iki tegese luwih, nalika kita munggah ing sadawane kisi, kita bisa uga ora mriksa katergantungan A, C → B, amarga ora bakal minimal maneh. Kajaba iku, kita ora bakal mriksa yen ketergantungan kasebut dianakake C → B.

Pambuka kanggo Dependensi Fungsional
Pambuka kanggo Dependensi Fungsional

Kajaba iku, minangka aturan, kabeh algoritma modern kanggo nggoleki hukum federal nggunakake struktur data kayata partisi (ing sumber asli - partisi stripped [1]). Dhéfinisi formal partisi kaya ing ngisor iki:

Definisi 6. Ayo X ⊆ R minangka kumpulan atribut kanggo hubungan r. Kluster yaiku sakumpulan indeks tuple ing r sing nduweni nilai sing padha kanggo X, yaiku, c(t) = {i|ti[X] = t[X]}. Partisi minangka sakumpulan kluster, ora kalebu klompok dawa unit:

Pambuka kanggo Dependensi Fungsional

Ing tembung prasaja, partisi kanggo atribut X punika pesawat saka dhaftar, ngendi saben dhaftar ngemot nomer baris karo nilai padha kanggo X. Ing literatur modern, struktur sing makili partisi diarani indeks dhaptar posisi (PLI). Kluster dawa unit ora kalebu kanggo tujuan kompresi PLI amarga klompok kasebut mung ngemot nomer rekaman kanthi nilai unik sing bakal gampang dingerteni.

Ayo padha ndeleng conto. Ayo bali menyang meja sing padha karo pasien lan mbangun partisi kanggo kolom Patient и Jinis (kolom anyar wis katon ing sisih kiwa, ing ngendi nomer baris tabel ditandhani):

Pambuka kanggo Dependensi Fungsional

Pambuka kanggo Dependensi Fungsional

Menapa malih, miturut definisi, partisi kanggo kolom Patient bakal bener kosong, wiwit kluster siji tilar saka pemisahan.

Partisi bisa dipikolehi kanthi sawetara atribut. Lan ana rong cara kanggo nindakake iki: liwat meja, mbangun partisi kanthi nggunakake kabeh atribut sing dibutuhake bebarengan, utawa mbangun nggunakake operasi persimpangan partisi nggunakake subset atribut. Algoritma telusuran hukum federal nggunakake pilihan kapindho.

Ing tembung prasaja, kanggo, contone, njaluk pemisahan dening kolom ABC, sampeyan bisa njupuk partisi kanggo AC и B (utawa set liyane saka subset disjoint) lan intersect karo saben liyane. Operasi persimpangan saka rong partisi milih klompok sing paling dawa sing umum kanggo partisi kasebut.

Ayo ndeleng conto:

Pambuka kanggo Dependensi Fungsional

Pambuka kanggo Dependensi Fungsional

Ing kasus sing sepisanan, kita nampa partisi kosong. Yen sampeyan ndeleng meja kanthi rapet, mula ora ana nilai sing padha kanggo loro atribut kasebut. Yen kita rada ngowahi tabel (kasus ing sisih tengen), kita bakal entuk persimpangan sing ora kosong. Kajaba iku, baris 1 lan 2 pancen ngemot nilai sing padha kanggo atribut kasebut Jinis и Dokter.

Sabanjure, kita butuh konsep kayata ukuran partisi. Formal:

Pambuka kanggo Dependensi Fungsional

Cukup, ukuran partisi yaiku jumlah klompok sing kalebu ing partisi (elinga yen klompok siji ora kalebu ing partisi!):

Pambuka kanggo Dependensi Fungsional

Pambuka kanggo Dependensi Fungsional

Saiki kita bisa nemtokake salah sawijining lema kunci, sing kanggo partisi tartamtu ngidini kita nemtokake manawa ana ketergantungan utawa ora:

Lemah 1. Ketergantungan A, B → C tetep yen lan mung yen

Pambuka kanggo Dependensi Fungsional

Miturut lemma, kanggo nemtokake manawa ana ketergantungan, papat langkah kudu ditindakake:

  1. Etung partisi kanggo sisih kiwa saka dependensi
  2. Etung partisi kanggo sisih tengen dependensi
  3. Etung produk saka langkah pisanan lan kaloro
  4. Bandhingake ukuran partisi sing dipikolehi ing langkah pisanan lan katelu

Ing ngisor iki minangka conto mriksa apa katergantungan kasebut miturut lema iki:

Pambuka kanggo Dependensi Fungsional
Pambuka kanggo Dependensi Fungsional
Pambuka kanggo Dependensi Fungsional
Pambuka kanggo Dependensi Fungsional

Ing artikel iki, kita nliti konsep kayata katergantungan fungsional, katergantungan fungsional kira-kira, ndeleng ing ngendi digunakake, uga algoritma apa kanggo nggoleki fungsi fisik. Kita uga nliti kanthi rinci konsep dhasar nanging penting sing aktif digunakake ing algoritma modern kanggo nggoleki hukum federal.

Referensi:

  1. Huhtala Y. et al. TANE: Algoritma efisien kanggo nemokake dependensi fungsional lan kira-kira // Jurnal komputer. – 1999. – T. 42. – No. 2. – kaca 100-111.
  2. Kruse S., Naumann F. Panemuan sing efisien saka dependensi kira-kira // Prosiding Endowment VLDB. – 2018. – T. 11. – No. 7. – kaca 759-772.
  3. Papenbrock T., Naumann F. Pendekatan hibrida kanggo panemuan dependensi fungsional // Prosiding Konferensi Internasional 2016 babagan Manajemen Data. – ACM, 2016. – kaca 821-833.
  4. Papenbrock T. et al. Panemuan dependensi fungsional: Evaluasi eksperimen saka pitung algoritma //Prosiding Endowment VLDB. – 2015. – T. 8. – No. 10. – kaca 1082-1093.
  5. Kumar A. et al. Gabung utawa ora melu?: Mikir kaping pindho babagan gabung sadurunge pilihan fitur //Prosiding Konferensi Internasional 2016 babagan Manajemen Data. – ACM, 2016. – kaca 19-34.
  6. Abo Khamis M. et al. Pembelajaran ing basis data kanthi tensor jarang //Prosiding Simposium ACM SIGMOD-SIGACT-SIGAI kaping 37 babagan Prinsip Sistem Database. – ACM, 2018. – kaca 325-340.
  7. Hellerstein JM et al. Perpustakaan analytics MADlib: utawa katrampilan MAD, SQL //Prosiding Endowment VLDB. – 2012. – T. 5. – No. 12. – kaca 1700-1711.
  8. Qin C., Rusu F. Perkiraan spekulatif kanggo optimasi gradien sing disebarake terascale // Prosiding Workshop Keempat babagan analytics Data ing Cloud. – ACM, 2015. – P. 1.
  9. Meng X. et al. Mllib: Pembelajaran mesin ing apache spark //Jurnal Riset Pembelajaran Mesin. – 2016. – T. 17. – No. 1. – kaca 1235-1241.

Penulis artikel: Anastasia Birillo, peneliti ing Riset JetBrains, Mahasiswa CS Center и Nikita Bobrov, peneliti ing Riset JetBrains

Source: www.habr.com

Add a comment