<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=UF1A3._Teoria_1a_part</id>
	<title>UF1A3. Teoria 1a part - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=UF1A3._Teoria_1a_part"/>
	<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=UF1A3._Teoria_1a_part&amp;action=history"/>
	<updated>2026-08-30T05:14:27Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>http://wiki.joanillo.org/index.php?title=UF1A3._Teoria_1a_part&amp;diff=297737&amp;oldid=prev</id>
		<title>Joan: Es crea la pàgina amb «__TOC__ =T13: Model‌ ‌relacional=  ==Coneixements previs== Partim del model ER (esquema conceptual), que ja hem treballat a classe, i volem arribar a un esquema l...».</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=UF1A3._Teoria_1a_part&amp;diff=297737&amp;oldid=prev"/>
		<updated>2021-10-18T18:40:14Z</updated>

		<summary type="html">&lt;p&gt;Es crea la pàgina amb «__TOC__ =T13: Model‌ ‌relacional=  ==Coneixements previs== Partim del model ER (esquema conceptual), que ja hem treballat a classe, i volem arribar a un esquema l...».&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;__TOC__&lt;br /&gt;
=T13: Model‌ ‌relacional=&lt;br /&gt;
&lt;br /&gt;
==Coneixements previs==&lt;br /&gt;
Partim del model ER (esquema conceptual), que ja hem treballat a classe, i volem arribar a un esquema lògic (model relacional).&lt;br /&gt;
==Introducció==&lt;br /&gt;
Un model és un conjunt de normes que ens permeten descriure el món real. Els models són importants perquè unifiquen la forma de representar la informació fent possible l’entesa entre les diferents persones.&lt;br /&gt;
&lt;br /&gt;
El procés general en la creació d'un sistema de base de dades consisteix en:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Especificacions-&amp;gt;Model E-R-&amp;gt;Model relacional-&amp;gt;Model físic.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Model relacional==&lt;br /&gt;
El model relacional es desenvolupa a partir del model enitat-relació (ER) i és el penúltim&lt;br /&gt;
pas per a desenvolupar el model físic, que conformen les instruccions a executar. A&lt;br /&gt;
diferència del model ER, es disposen d'una sèrie de tècniques o passos per a crear el&lt;br /&gt;
model relacional.&lt;br /&gt;
&lt;br /&gt;
Igual que el model ER, el model relacional és un model semàntic: es centra amb el&lt;br /&gt;
significat de les dades a través de la seva representació.&lt;br /&gt;
==Objectius==&lt;br /&gt;
El model relacional consisteix en realitzar un disseny de la informació, normalment a partir d'un model ER previ, tenint com a objetius bàsics:&lt;br /&gt;
#Minimitzar la redundància de dades.&lt;br /&gt;
#Assegurar l'accés eficient a la informació.&lt;br /&gt;
Per aconseguir aquests objectius s'estableixen 5 formes normals o 5 regles que cal complir. Tot bon disseny cal que compleixi amb aquestes regles, tot i que a nivell ''pràctic'' és suficient amb les 3 primeres.&lt;br /&gt;
&lt;br /&gt;
=T14: Terminologia=&lt;br /&gt;
La terminologia que s'utilitza en el model ER és diferent a l'utilitzada en el model&lt;br /&gt;
relacional. És per aquest motiu que cal definir alguns termes i fer la correspondència&lt;br /&gt;
amb el model ER.&lt;br /&gt;
==Registre==&lt;br /&gt;
Un registre es correspon a una entitat del model ER. En aquest sentit, un registre estarà&lt;br /&gt;
forma per un conjunt de dades normalment de diferents tipus.&lt;br /&gt;
==Taula==&lt;br /&gt;
Una taula és una estructura que permet emmagatzemar un conjunt de registres. Una&lt;br /&gt;
taula és l'equivalent a un conjunt d'entitats en el model ER, tot i que, com veurem&lt;br /&gt;
posteriorment, algunes taules són el resultat d'una relació entre diferents conjunts&lt;br /&gt;
d'entitats.&lt;br /&gt;
==Camp==&lt;br /&gt;
Un camp es correspon a una dada d'un registre. Un camp és l'equivalent a un atribut del&lt;br /&gt;
model ER, tot i que no tots els atributs es transformen en camps. Cada camp tindrà&lt;br /&gt;
associat un tipus, que normalment ve determinat pel domini de l'atribut o la naturalesa.&lt;br /&gt;
==Clau primària==&lt;br /&gt;
Una clau primària és un atribut identificador associat a un conjunt d'entitats. Per tant,&lt;br /&gt;
una clau primària serà sempre un o varis camps que em permeten identificar un&lt;br /&gt;
registre dins una taula. Si la clau primària està formada per varis camps s'obté una clau&lt;br /&gt;
composta.&lt;br /&gt;
==Clau candidata o secundària o alternativa==&lt;br /&gt;
En el model ER a vegades hi ha varis atributs que podem escollir com a atribut&lt;br /&gt;
identificador. Per exemple, si tinc un conjunt d'entitats ''treballador'' tinc 2 possibles&lt;br /&gt;
candidats (com a mínim) a ser identificador: ''número seguretat social'' i ''dni''. Tots els&lt;br /&gt;
camps associats a atributs identificadors que no formin part de la clau primària són&lt;br /&gt;
claus candidates.&lt;br /&gt;
&lt;br /&gt;
=T15: Dependència funcional=&lt;br /&gt;
Una dependència funcional es dóna quan a partir d'un o varis atributs d'un conjunt de relacions es pot determinar el valor de qualsevol altre atribut. Existirà una dependència funcional entre l'atribut ''a1'' i ''a2'' que pertanyen al mateix conjunt de relacions (supertaula, informació no estructurada) si sabent el valor de l'atribut ''a1'' sempre sé el valor de l'atribut ''a2''. Expressarem que ''a2'' té una dependència funcional d' ''a1'' o bé que ''a1'' determina a ''a2'' utilitzant una fletxa (→) i incloent entre {} tots els atributs que queden determinats.&lt;br /&gt;
*a1 → {a2} : '''a1 determina a a2''' o a2 té una dependència funcional d'a1&lt;br /&gt;
*a2 → {a1} : '''a2 determina a a1''' o a1 té una dependència funcional d'a2&lt;br /&gt;
&lt;br /&gt;
==Sistema càlcul dependència funcional==&lt;br /&gt;
Una dependència funcional moltes vegades es pot deduir pel que representa l'atribut.&lt;br /&gt;
&lt;br /&gt;
Així, per exemple, si tinc un atribut ''codi postal'' i un atribut ''capital'' (per a les capitals de província), està clar que donat un codi postal jo sempre podré dir quina població és: el nom de la ''capital'' té una dependència funcional respecte al codi postal, o que el codi postal em determina el nom de la capital. En canvi, el nom de la ''capital'' no determina el ''codi postal'', ja que Barcelona té molts codis postals: 08012, 08006, 08025,... si dic ''Barcelona'' no puc donar només un&lt;br /&gt;
únic codi postal! El ''codi postal'' no té una dependència funcional en relació al nom de la ''capital''.&lt;br /&gt;
&lt;br /&gt;
'''NOTA''': hem posat l'exemple de les capitals de província, perquè per a municipis petits el CP no determina la població. Poden haver-hi varis municipis petits amb un mateix codi postal. Per exemple, Bagà i Gisclareny tenen el mateix codi postal: 08695.&lt;br /&gt;
==Càlcul dependència funcional==&lt;br /&gt;
Les dependències funcionals no sempre són tan clares com el codi postal i el nom d'una capital. Quan es dóna aquesta situació , cal disposar d'un sistema per a poder&lt;br /&gt;
determinar quines són les dependències funcionals. Per explicar el sistema suposarem que tenim un conjunt d'entitats ''A'' amb els atributs ''a1'', ''a2'' i ''a3''.&lt;br /&gt;
&lt;br /&gt;
#Crearem una sèrie d'entitats que siguin representatives.&lt;br /&gt;
#Mirarem quin atribut o atributs no tenen repeticions&lt;br /&gt;
#Si hi ha un atribut que no té cap repetició, la resta d'atributs tindran una dependència funcional respecte a aquest atribut.&lt;br /&gt;
&lt;br /&gt;
==Exemple==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
atrib1	atrib2	atrib3&lt;br /&gt;
------	------	------&lt;br /&gt;
va11	va21	va31&lt;br /&gt;
va12	va22	va31&lt;br /&gt;
va13	va23	va31&lt;br /&gt;
va14	va24	va32&lt;br /&gt;
va15	va25	va33&lt;br /&gt;
va16	va26	va33&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Observem com l'atribut 1 i 2 (''atrib1'' i ''atrib2'') no tenen cap valor repetit per les entitats de mostra. Si em diuen un valor de ''atrib1'' o de ''atrib2'' sempre se sap a quin valor correspon per la resta d'atributs (''atrib3''). Per tant, puc afirmar que:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
atrib1 → {atrib2, atrib3}&lt;br /&gt;
atrib2 → {atrib1, atrib3}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si el nostre conjunt d'entitats tingués com a mostra de valors:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
atrib1	atrib2	atrib3&lt;br /&gt;
------	------	------&lt;br /&gt;
va11	va21	va31&lt;br /&gt;
va12	va22	va31&lt;br /&gt;
va13	va22	va31&lt;br /&gt;
va14	va24	va32&lt;br /&gt;
va15	va25	va33&lt;br /&gt;
va16	va26	va33&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Els valors de ''atrib1'' no han canviat i són tots diferents. Per tant, la dependència es manté:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
atrib1 → {atrib2, atrib3}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per contra, ''atrib2'' té ara un valor duplicat ''va22''. Per aquest valor, no puc determinar ún únic valor de ''atrib1'', pot ser ''va12'' o ''va13''. Per tant, ''atrib2'' no em determina ''atrib1''. ''atrib2'' sí que continua determinant ''atrib3'', ja que pel valor repetit ''va22'', el valor de ''atrib3'' és el mateix (''va33'').&lt;br /&gt;
&lt;br /&gt;
Ara tenim:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
atrib2 → {atrib3}&lt;br /&gt;
atrib3 → {}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Exemple de la Hípica==&lt;br /&gt;
Utilitzem un exemple per a veure com calculem les dependències funcionals. Suposem que tenim una supertaula (informació no estructurada) amb els camps: ''Cavall'', ''Hípica'', ''Data'', ''Temps'', ''Club'', ''Llicència'', ''Campió'' i ''Núm'' amb els següents registres:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Cavall		Hípica	Data		Temps		Club	Llicència	Campió		Núm&lt;br /&gt;
---------	------	--------	--------	------	---------	--------	----&lt;br /&gt;
Amor		Camil	11/10/21	01:34:00	8474	2976		Fruit		2978&lt;br /&gt;
Diversió	Camil	11/10/21	01:49:00	8474	2977		Fruit		2978&lt;br /&gt;
Fruit		Camil	11/10/21	01:32:00	8474	2978		Fruit		2978&lt;br /&gt;
Gaudir		Camil	11/10/21	01:54:00	8474	2979		Fruit		2978&lt;br /&gt;
Amor		Camil	13/10/21	01:34:00	8474	2976		Diversió	2977&lt;br /&gt;
Diversió	Camil	13/10/21	01:39:00	8474	2977		Diversió	2977&lt;br /&gt;
Fruit		Camil	13/10/21	01:12:00	8474	2978		Diversió	2977&lt;br /&gt;
Gaudir		Camil	13/10/21	01:25:00	8474	2979		Diversió	2977&lt;br /&gt;
Amor		Rial	15/10/21	01:34:00	7000	2976		Diversió	2977&lt;br /&gt;
Diversió	Rial	15/10/21	01:39:00	7000	2977		Diversió	2977&lt;br /&gt;
Fruit		Rial	15/10/21	01:12:00	7000	2978		Diversió	2977&lt;br /&gt;
Gaudir		Rial	15/10/21	01:25:00	7000	2979		Diversió	2977&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Representa uns cavalls que han anat a fer 3 curses (3 dies diferents) a dues hípiques. I tenim registrat el temps de cada cavall a cada cursa, l'identificador del club (la Hípica), l'identificador del cavall (la llicència). I també tenim registrats qui ha guanyat cada cursa i el seu número de llicència.&lt;br /&gt;
&lt;br /&gt;
Aquestes són unes dades vàlides (però no estan estructurades, són unes dades brutes). Pero entre aquests atributs podem determinar unes dependències funcionals.&lt;br /&gt;
&lt;br /&gt;
Per a calcular les dependències funcionals fem una taula on creuarem tots els camps entre ells. Per a cada un dels camps indicarem si hi ha una dependència funcional o no entre els dos atributs relacionats.&lt;br /&gt;
*Identificarem al cavall (A, D, F, G)&lt;br /&gt;
*Identificarem l'hípica (C, R).&lt;br /&gt;
*Identificarem la data segons el dia.&lt;br /&gt;
*Identificarem el temps pel temps que ha trigat a la cursa.&lt;br /&gt;
*Identificarem la llicència i el núm. per l'últim dígit.&lt;br /&gt;
Si el fons de la cel·la de la taula és de color verd, hi ha una dependència funcional, en cas contrari no hi ha dependència funcional.&lt;br /&gt;
&lt;br /&gt;
Les dependències funcionals que obtenim són les següents (té una certa lògica):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Cavall → {Llicència} (cada cavall té una llicència única)&lt;br /&gt;
Hípica → {Club} (cada hípica representa un club diferent)&lt;br /&gt;
Data → {Hípica, Club, Campió, Num} (cada Data s'ha celebrat una cursa, que representa una hípica i club diferent, i també un campió i núm diferent)&lt;br /&gt;
Temps → {Cavall, Llicència, Campió}&lt;br /&gt;
Club → {Hípica} (cada club té la seu en una hípica)&lt;br /&gt;
Llicència → {Cavall} (cada llicència es correspon a un cavall)&lt;br /&gt;
Campió → {Núm.} (cada campió es correspon a un número de cavall)&lt;br /&gt;
Núm. → {Campió} (cada número de campió es correspon a un nom de cavall diferent.)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Hipica dependencies funcionals.png]]&lt;br /&gt;
Donat que no hem trobat cap atribut que em determini a tots els altres, el procés continua agafant parelles de camps, fins a trobar una parella, trio... que impliqui a&lt;br /&gt;
tots els camps de la taula. En aquest cas, proseguim el procés combinant el camp ''Data'' amb tota la resta. El motiu de l'elecció de ''Data'' és perquè aquest atribut ja determina a 4 atributs de la taula.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Hipica dependencies funcionals 2.png]]&lt;br /&gt;
Amb els camps '''Data''' i '''Cavall''' tota la resta de camps de la taula queden determinats. La clau primària de la nostra taula és ''{data,cavall}''. Per exemple, la combinació ''15/10/21'' i ''Amor'' significa que un cavall anomenat ''Amor'', amb llicència ''2976'', va participar el ''15/10/21'' a una cursa celebrada a la Hípica ''Rial'' (club amb llicència ''7000''), i en la cursa va fer un temps de ''01:34:00''. Cursa que va guanyar el cavall ''2977'', anomenat ''Diversió''.&lt;br /&gt;
&lt;br /&gt;
A partir de les dependències funcionals es pot obtenir el model relacional, tot i que les dependències funcionals és un sistema molt lent per a obtenir el model relacional i s'utilitzen només per a validar que el model relacional compleix amb totes les formes normals.&lt;br /&gt;
&lt;br /&gt;
=T16: Normalització=&lt;br /&gt;
El procés de normalització consisteix en convertir una superttaula on s'emmagatzema tota la informació amb vàries taules menors per tal d'eliminar les anomalies de la no&lt;br /&gt;
normalització.&lt;br /&gt;
&lt;br /&gt;
En aquest cas tenim una super-taula provinent d'unes dades no-estructurades, unes dades brutes posades en forma de taula. No venim d'un model entitat-relació, senzillament tenim unes dades i volem veure com podem extreure informació coherent i estructurada d'aquestes dades.&lt;br /&gt;
==Anomalies de no fer la normalització==&lt;br /&gt;
Suposem que una base de dades consti d'una única taula per a emmagatzemar la informació dels estudiants i de les unitats formatives que estan cursant. A continuació es dóna una versió reduïda de la taula amb diferents registres&lt;br /&gt;
[[Fitxer:Normalitzacio1.png]]&lt;br /&gt;
==Redundància de dades==&lt;br /&gt;
Veiem que hi ha moltes dades repetides. Cada vegada que un estudiant cursa una unitat formativa diferent, en aquesta super-taula es tornen a repetir totes les dades de l'estudiant. La probabilitat d'error s'incrementa ja que hi ha un major volum d'informació.&lt;br /&gt;
&lt;br /&gt;
En el cas d'error (suposem que per a un registre en comptes de ''Granollers'' posem ''Granolers''), les dades passen a ser incoherents. Les dades de l'estudiant només s'haurien d'introduir una vegada (aquest és un dels objectius importants que perseguirem).&lt;br /&gt;
&lt;br /&gt;
==Coherència de dades==&lt;br /&gt;
En aquesta super-taula no es garanteix que les dades siguin coherents, ja que si per un mateix estudiant s'han introduït dues adreces diferents (per error, per exemple), el sistema no pot controlar-ho. El fet que les dades no siguin coherents és una conseqüència directe de la redundància de les dades.&lt;br /&gt;
==Procés de normalització==&lt;br /&gt;
Per a normalitzar el primer que cal fer és localitzar les dependències funcionals. En el nostre exemple, és fàcil observar que hi ha 4 dependències funcionals diferents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DNI → {NOM, TELF, POB, CP, ADREÇA}&lt;br /&gt;
UF → {Nom UF} i Nom UF → {UF} (la dependència funcional es compta com una de sola)&lt;br /&gt;
CP → {POB}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cap de les dependències funcionals conté una '''clau primària'''. Per a obtenir una clau primària, és necessari que entre els camps determinants i els camps amb dependència funcional conformin tots els camps de la taula.&lt;br /&gt;
&lt;br /&gt;
En el nostre cas, per a obtenir una clau primària, és necessari disposar de 2 camps. Combinant ''DNI'' amb ''UF'' o ''DNI'' amb ''nom UF'' s'obté la clau primària&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{DNI,UF } → {NOM, TELF., POB., CP., ADREÇA, Nom UF}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Les dependències funcionals ens indiquen com hem de dividir la nostra taula en taules més petites. En aquest cas tindrem tres taules diferents, una per a cada dependència funcional.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Normalitzacio2.png]]&lt;br /&gt;
&lt;br /&gt;
Creem una taula a partir dels camps que em determina el camp ''DNI''. Anomenem '''ESTUDIANT''' a aquesta taula. De la taula ''ESTUDIANT'' cal eliminar tots els camps que tinguin una dependència funcional amb un altre camp; en el nostre cas, el camp ''població'' depèn de ''codi postal'' i per tant, eliminem el camp ''població'' de la taula. Els camps ''UF'' i ''nom UF'' no estan determinats pel ''DNI''.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Normalitzacio3.png]]&lt;br /&gt;
&lt;br /&gt;
La combinació de ''DNI'' i ''UF'' serà una bona clau primària. Mirem com queda i eliminem les dependències funcionals que conté:&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Normalitzacio4.png]]&lt;br /&gt;
&lt;br /&gt;
Partíem d'una super-taula on hi havia moltes dependències funcionals i redundància. I després del procés, finalment queden les taules '''ESTUDIANTS-UF''', '''UF''' i '''ESTUDIANTS''':&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:Normalitzacio5.png]]&lt;br /&gt;
&lt;br /&gt;
Resumint, mirant les dependències funcionals en una super-taula hem aconseguit aïllar 3 taules (més petites) que estan relacionades entre elles i sense redundància de dades. Dins de cada taula la clau primària determina de forma unívoca el registre.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
POBLACIO (CP (PK), POBLACIO)&lt;br /&gt;
ESTUDIANT (DNI (PK), NOM, TELF, CP, ADREÇA)&lt;br /&gt;
ESTUDIANT-UF (DNI (PK), UF (PK))&lt;br /&gt;
UF (UF (PK), NOMUF)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Autor}}, octubre 2021&lt;/div&gt;</summary>
		<author><name>Joan</name></author>
		
	</entry>
</feed>