Você está na página 1de 29

FUOC71Z799014MO

Casodeestudio

Casodeestudio
MarcGibertGinesta

FUOC71Z799014MO

Casodeestudio

ndice

Introduccin

Objetivos

7.Presentacindelcasodeestudio

7.Elmodelorelacionalyellgebrarelacional

7.Determinarlasrelaciones

7.Definicindeclaves

7.Reglasdeintegridad

11

7.lgebrarelacional

12

7.EllenguajeSQL

13

7.Sentenciasdedefinicin

13

7.Sentenciasdemanipulacin

15

7.Introduccinaldiseodebasesdedatos

17

7.Diseoconceptual:elmodeloER

17

7.Diseolgico:latransformacindelmodeloER
almodelorelacional 19

7.BasesdedatosenMySQL

22

FUOC71Z799014MO

Casodeestudio

7.BasesdedatosenPostgreSQL

24

7.Desarrollodeaplicacionesenconexinconbases
dedatos 25

Resumen

30

Introduccin

EstemduloformapartedelcursoBasesdedatosdelitinerarioAdministradorwebycomercioelectrnicodentrodel MsterInternacionaldeSoftwareLibredelaUniversitatObertadeCatalunya.

El mdulo est estructurado en apartados que corresponden al resto de los mdulos de la asignatura, de modo que el estudiantepuedeirsiguiendoestecasodeestudioamedidaquevaprogresandoenelcurso.

Aunquealgunosdelosmdulosyadisponendeejerciciosdeautoevaluacin,elcasodeestudiopresentaunavisincompleta deunproyectodebasesdedatosyproporcionaunavisinprcticadecadaunodeellos.

FUOC71Z799014MO

Casodeestudio

Objetivos

Losobjetivosquedeberaisalcanzaralfinalizareltrabajoconlapresenteunidadsonlossiguientes:

7.Comprenderdesdeunpuntodevistaprcticolosconceptosexplicadosenlasunidadesdidcticastericas.

7.Disponerdeunmodelodereferenciaparaemprenderproyectosdebasesdedatos.

7.Adquirirelcriteriosuficienteparaidentificarlasactividadesclaveytomardecisionesenunproyectoqueimpliqueel
usodebasesdedatos.

FUOC71Z799014MO

Casodeestudio

7.Presentacindelcasodeestudio

AcabamosdeentraratrabajarenunapequeaempresaSuOrdenadorAMedida,S.L.dedicadaalaventadeordenadoresa particularesyotrasempresas.Cuandonoshicieronlaentrevistadetrabajo,comentamosnuestrapasinporelsoftwarelibrey enconcretohicimoshincapi ennuestroconocimientodelosmotoresdebasesdedatoslibresylasventajasquepodan aportarrespectodelosgestorespropietarios.Nosabemossiesofueloqueconvencialapersonaderecursoshumanosono, pero,entodocaso,yvistoelresultadodelareuninquehemostenidoennuestroprimerdadetrabajo,vamosatenerque aplicarnuestrosconocimientosafondo.

Noshan contado que,hastaahora,lagestin delaempresasellevabaacabo conprogramaspropietarios degestin y contabilidad, pero que debido a problemas con la empresa que desarrollaba estos programas, se est considerando la migracindelagestinadministrativaydeoperacionesaentornosabiertos.Paraacabardedecidirse,nosproponenque empecemosporrenovarelsistemadegestindepeticioneseincidenciasporpartedelosclientes,demodoqueestbasadaen softwarelibre.

Actualmente,laspeticioneseincidenciasserecibentelefnicamente,porcorreoelectrnicooenpersonaenalgunodelos locales que tiene laempresa. La persona que atiende al telfono oleelos correos electrnicos de plantea una seriede preguntasalclienteyescribeenunaplantilladedocumentolasrespuestas.Acontinuacin,seimprimeeldocumentoyse dejaenunabandejaquerecogenlostcnicoscadamaana.

Amedidaquelostcnicosvanavanzandoenlasolucindelaincidencia(ohanllamadoalclienteparapedirmsdatos),van apuntandolasaccionesyelestadodelproblemaenlahojaquerecogieron,hastaquelaincidenciaquedaresuelta.Enese momento,ladejanenunabandejaquerecogecadamaanaelpersonaldeadministracin,queseponeencontactoconelcliente yfacturaelimportecorrespondientealashorasdetrabajoycomponentessustituidos.

Esobvioqueestesistemapresentanumerosasdeficiencias,yqueelrendimientotantodelostcnicos,comodelpersonal administrativo y de atencin al cliente podra aumentar enormemente si muchos de estos procesos fueran automticos, centralizadosy,apoderser,conectadosconelrestodelsistemadeinformacindelaempresa.

ste es, a grandes rasgos, el problema que se nos plantea, y que utilizaremos como caso de estudio para aplicar los conocimientosadquiridosduranteeldesarrollodelcurso.

FUOC71Z799014MO

Casodeestudio

7.Elmodelorelacionalyellgebrarelacional

Vistoelproyectoplanteado,decidimoshacerlascosasbienhechaspara,depaso,impresionaranuestrojefeconnuestros conocimientosenbasesdedatos.Elprimerpasoser presentarleundocumentoquedescribaelmodelorelacionalque vamosautilizar,enelqueincluiremosalgunasconsultasdemuestraparaquepuedacomprobarqu ser capazdehacer connuestroproyectocuandoestacabado.

7.Determinarlasrelaciones

Enprimerlugardeterminaremoslasrelaciones,susatributosylosdominiosdecadaunodeellos: PETICION(referencia,cliente,resumen,estado,fecharecepcion,fechainicio,fechafin, tiempoempleado) NOTA_PETICION(peticion, nota, fecha, empleado) MATERIAL_PETICION(nombrematerial, peticion, cantidad, precio) CLIENTE(nombre, nif, telefono, email) EMPLEADO(nombre, nif) Enlarelacin PETICION,hemosdecididoqueconvendratenerunareferenciainternadelapeticin,quenosayudar al hablardeellaconelcliente(situviesevariasabiertas)yevitar confusionesaltrabajar.Elrestodeatributossonbastante explcitos.

Como una peticin puede evolucionar con el tiempo, a medida que se piden ms datos al cliente, la incidencia va evolucionando,etc.,hemoscreadolasrelacionesNOTA_PETICIONyMATERIAL_PETICIONparareflejarlo.

Tambinhemostenidoquedefinirlasrelaciones CLIENTE yEMPLEADO parapoderrelacionarlasconlaspeticionesylas notasquesevayangenerandodurantesuresolucin.

Acontinuacinvamosadefinirlosdominiosdelosatributos: PETICION: dominio(referencia)=nmeros dominio(cliente)=NIF dominio(resumen)=texto dominio(estado)=estados dominio(fecharecepcion)=fechayhora dominio(fechainicio)=fechayhora dominio(fechafin)=fechayhora dominio(tiempoempleado)=horasyminutos NOTA_PETICION: dominio(peticion)=nmeros

FUOC71Z799014MO

Casodeestudio

dominio(nota)=texto dominio(fecha)=fechayhora dominio(empleado)=NIF MATERIAL_PETICION: dominio(nombrematerial)=nombreMaterial dominio(peticion)=nmeros dominio(precio)=precio dominio(cantidad)=nmeros CLIENTE: dominio(nombre)=nombreCliente dominio(nif)=NIF dominio(telefono)=telfonos dominio(email)=emails EMPLEADO: dominio(nombre)=nombreEmpleado dominio(nif)=NIF Aldefinirlosdominiosdecadaatributo,yanoshemosavanzadoenlatomadealgunasdecisiones:aldecidir,porejemplo, queeldominiodelatributoempleadoenlarelacinNOTA_PETICIONesNIF,estamosimplcitamentedeterminandoque laclaveprimariadelarelacinEMPLEADOserdeldominioNIFyqueusaremosunatributodeestedominioparareferirnosa l.

Esteprocesodescritoindicandodirectamentesuresultado,normalmenteesfrutodeunarevisindelasentidadesamedida quesevandefiniendoyanalizandolasnecesidadesdestas.

7.Definicindeclaves

Aunquealgunasclavesyaseintuyenapartirdelosatributosdelasrelaciones,vamosadeterminarlasparacompletarelcaso. PETICION: Claves candidatas: {referencia} Clave primaria: {referencia} NOTA_PETICION: Claves candidatas: {peticion,fecha,empleado} Clave primaria: {peticion, fecha,empleado} MATERIAL_PETICION: Claves candidatas: {nombrematerial,peticion} Clave primaria: {nombrematerial,peticion} CLIENTE: Claves candidatas: {nif}

FUOC71Z799014MO

Casodeestudio

Clave primaria: {nif} EMPLEADO: Claves candidatas: {nif} Clave primaria: {nif}
Nota Laregladeintegridaddel modelocorrespondienteala claveprimariaobligaraque noexistandosnotassobrela mismapeticinhechasenla mismafecha yhoraporpartedelmismo empleado,locuales perfectamentelcitoy coherente.

Entodosloscasosslotenemosuna clavecandidatay,porlotanto,no cabendudasalahoradeescogerla claveprimaria.Estonotieneporque seras:enlarelacinEMPLEADO, podramoshaberincluidoms atributos(nmerodelaseguridad social,unnmerodeempleado interno,etc.)queseranclaves candidatassusceptibles deserclaveprimaria.

Ahorapodemosreescribirlasrelaciones: PETICION(referencia, cliente, resumen, estado, fecharecepcion, fechainicio, tiempoempleado) NOTA_PETICION(peticion, nota, fecha, empleado) MATERIAL_PETICION(nombrematerial, peticion, cantidad, precio) CLIENTE(nombre, nif, telefono, email) EMPLEADO(nombre, nif) Lasclavesforneasyaseintuyenapartirdelasrelaciones,aunquevamosacomentarlasparacompletarelcaso: fechafin,

NOTA_PETICION: Tienedeclaveforneaelatributo{peticion},queestablecelarelacin(ypertenecealmismodominio)conelatributo {referencia}delarelacinPETICION. Tambin tiene la clave fornea {empleado}, que establece la relacin con EMPLEADO a partir de su clave primaria {nif}.

MATERIAL_PETICION:

Tienedeclaveforneaelatributo {peticion},queestablecelarelacin(ypertenecealmismodominio)conelatributo {referencia}delarelacinPETICION.

FUOC71Z799014MO

Casodeestudio

7.Reglasdeintegridad

Enestepunto,noesnecesariopreocuparseporlasreglasdeintegridaddelmodeloquetratansobrelaclaveprimaria,yaque nosvendrnimpuestasenelmomentodecrearlastablasenelSGBD.

Esconveniente,noobstante,fijarlasdecisionessobrelaintegridadreferencial;enconcreto,qu vamosahacerencasode restriccin.Aspues,paracadarelacinquetieneunaclaveprimariareferenciadadesdeotra,deberemosdecidirqupoltica cabeaplicarencasodemodificacinoborrado:

PETICION

7.

Modificacindelatributo {referencia}referenciadodesdeNOTA_PETICIONyMATERIAL_PETICION:

aqu podemosoptarporlarestriccinoporlaactualizacinencascada(mscmoda,aunquenotodoslosSGBDla implementan,comoveremosmsadelante).

7.

Borradodelatributo{referencia}.Aqu optaremosporunapolticaderestriccin.Silapeticintienenotas

asociadasomateriales,significaquehahabidoalgunaactividady,porlotanto,nodeberamospoderborrarla.Sisedesea anularla,yaestableceremosunestadodelamismaqueloindique.

CLIENTE

7.

Modificacindelatributo{nif}referenciadodesdePETICION.EsprobablequesiunclientecambiadeNIF

(poruncambiodeltipodesociedad,etc.)deseemosmantenersuspeticiones.Aqulapolticadebeserdeactualizacinen cascada.

7.

Borradodelatributo {nif}.Esposiblequesiqueremosborraruncliente,esporquehemosterminadotoda

relacinconly,porlotanto,escoherenteutilizaraqulapolticadeanulacin.

EMPLEADO

7.

Modificacin delatributo {nif} referenciado desde NOTA_PETICION. Noesprobable queun empleado

cambiesuNIF,salvocasodeerror.Aunas,encasodequeseproduzca,espreferiblelaactualizacinencascada.

FUOC71Z799014MO

10

Casodeestudio

7.

Borrado del atributo {nif}. Aunque eliminemos un empleado si termina su relacin con la empresa, no

deberamoseliminarsusnotas.Lamejoropcineslarestriccin.

7.lgebrarelacional

Paraprobarelmodelo,unabuenaopcinesintentarrealizaralgunasconsultassobre lyversiobtenemoslosresultados deseados.Ennuestrocaso,vamosarealizarlassiguientesconsultas:

7.

Obtencindeunapeticinjuntoconlosdatosdelcliente:

R:= PETICION [cliente=nif] CLIENTE

7.

Obtencindeunapeticincontodassusnotas:

NP(peticionnota,nota,fechanota,empleado):=NOTA_PETICION(peticion,nota,fecha, empleado) R:=PETICION[peticion=peticionnota]NOTA_PETICION

7.

Obtencindelosdatosdetodoslosempleadosquehanparticipadoenlapeticin5:

NP:=NOTA_PETICION[peticion=5] RA:=EMPLEADO[nif=empleado]NP R:=RA[nombre,nif]


Ejercicio

Ossugerimosqueintentismsoperacionessobreelmodeloparafamiliarizarosconl.

FUOC71Z799014MO

11

Casodeestudio

7.EllenguajeSQL

Unavezterminadoelmodelorelacional,decidimoscompletarladocumentacinquevenamosrealizandoconlassentencias SQLcorrespondientes.As,veremosenquseconcretarelmodelorelacional.

Comoannosabemosenqu sistemagestordebasededatosvamosaimplantarlasolucin,decidimossimplementeanotar lassentenciassegnelestndarSQL92,y,posteriormente,yaexaminaremoslasparticularidadesdelsistemagestorescogido paraadaptarlas.

7.Sentenciasdedefinicin 7.
Creacindelabasededatos

CREATE SCHEMA GESTION_PETICIONES;


Atencin Enalgunoscasoses convenienteladefinicinde dominiosparafacilitarel trabajoposteriorde mantenimientodela coherenciadelabasede datos.Noesaconsejable definirdominiosparacada dominiorelacional,perosen loscasosenqueuna columnapuedetomaruna seriedevalores determinados.

7.

Definicindedominios

CREATE DOMAIN dom_estados AS CHAR (20) CONSTRAINT estados_validos CHECK (VALUE IN (Nueva,Se necesitan ms datos,Aceptada,Confirmada, Resuelta, Cerrada)) DEFAULT Nueva;

7.

Creacindelastablas

CREATE TABLE PETICION ( referencia INTEGER NOT NULL, cliente INTEGER NOT NULL, resumen CHARACTER VARYING (2048), estado dom_estados NOT NULL, fecharecepcion TIMESTAMP NOT NULL, fechainicio TIMESTAMP, fechafin TIMESTAMP, tiempoempleado TIME, PRIMARY KEY (referencia),

FUOC71Z799014MO

12

Casodeestudio

FOREIGN KEY cliente REFERENCES CLIENTE(nif) ON DELETE CASCADE ON UPDATE CASCADE, CHECK (fecharecepcion < fechainicio), CHECK (fechainicio < fechafin) ); CREATE TABLE NOTA_PETICION ( peticion INTEGER NOT NULL, nota CHARACTER VARYING (64000), fecha TIMESTAMP NOT NULL, empleado CHARACTER (9), FOREIGN KEY (peticion) REFERENCES PETICION(referencia) ON DELETE NO ACTION ON UPDATE CASCADE, FOREIGN KEY (empleado) REFERENCES EMPLEADO(nif) ON DELETE NO ACTION ON UPDATE CASCADE ); CREATE TABLE MATERIAL_PETICION ( nombrematerial CHARACTER VARYING (100) NOT NULL, peticion INTEGER NOT NULL, precio DECIMAL(8,2), cantidad INTEGER, FOREIGN KEY (peticion) REFERENCES PETICION(referencia) ON DELETE NO ACTION ON UPDATE CASCADE ); CREATE TABLE CLIENTE ( nombre CHARACTER VARYING (100) NOT NULL, nif CHARACTER (9) NOT NULL, telefono CHARACTER (15), email CHARACTER (50), PRIMARY KEY (nif) ); CREATE TABLE EMPLEADO (nombre CHARACTER VARYING (100) NOT NULL, nif CHARACTER (9) NOT NULL, PRIMARY KEY (nif) );
Atencin Aqudeberemosteneren cuentalasreglasde integridad,yaquehabr queexplicitar lapolticaescogidacomo restriccin.

7.

Creacindevistas

7.Funcindevistas

FUOC71Z799014MO

13

Casodeestudio

Lasvistasagilizarnlas consultasqueprevemos quevanasermas frecuentes.

7.

7.

Peticionespendientes:

CREATE VIEW peticiones_pendientes (referencia, nombre_cliente, resumen, estado, duracion, fecharecepcion) AS ( SELECT P.referencia, C.nombre, P.resumen, P.estado, (P.fechainicio P.fecharecepcion), P.fecharecepcion FROM PETICION P JOIN CLIENTE C ON P.cliente = C.nif WHERE estado NOT IN (Resuelta,Cerrada) ORDER BY fecharecepcion )

7.

Tiempoypreciodelosmaterialesempleadosparalaspeticionesterminadasenelmesencurso:

CREATE VIEW peticiones_terminadas (referencia, nombre_cliente, resumen, tiempo_empleado, importe_materiales) AS ( SELECT P.referencia, C.nombre, P.resumen, P.tiempoempleado, SUM(M.precio) FROM PETICION P, CLIENTE C, MATERIAL_PETICION M WHERE P.cliente=C.nif AND M.peticion=P.referencia AND estado=Resuelta GROUP BY P.referencia)

7.Sentenciasdemanipulacin

Acontinuacin,decidimosindicaralgunassentenciasdemanipulacincorrientesparacompletarladocumentacin.Deesta manera,cuandoempecemoseldesarrollo,tendremosmuchomsclarasestasoperacionessobrelabasededatos:

7.

Nuevocliente:

INSERT INTO CLIENTE VALUES (Juan Prez,42389338A,912223354,juanperez@gmail.com);

7.

Nuevapeticin:

INSERT INTO PETICION VALUES (5,42389338A, No le arranca el ordenador, Nueva,CURRENT_TIMESTAMP,NULL,NULL,NULL);

FUOC71Z799014MO

14

Casodeestudio

7.

Cambiodeestadodelapeticin,aadimosunanotayunmaterial:

UPDATE PETICION SET estado=Aceptada WHERE referencia=5; INSERT INTO NOTA_PETICION VALUES (5,Parece un problema examinarlo ms a fondo.,CURRENT_TIMESTAMP,35485411G);

del

disco

duro.

Vamos

INSERT INTO MATERIAL_PETICION VALUES (Disco duro 20Gb,5,250.00,1);

7.

Materialessolicitadosenlapeticin5:

SELECT nombrematerial, cantidad, precio FROM MATERIAL_PETICION WHERE peticion=5

7.

Nmerodepeticionesabiertasdelcliente42389338A: FROM PETICION WHERE cliente=42389338A AND estado NOT IN

SELECT COUNT(*) (Resuelta, Cerrada);

La creacin de vistas del apartado anterior nos ha mostrado tambin algunas consultas complejas que repetimos a continuacin:

7.

Peticionesabiertas:

SELECT P.referencia, C.nombre, P.resumen, P.estado, (P.fechainicio P.fecharecepcion), P.fecharecepcion FROM PETICION P JOIN CLIENTE C ON P.cliente = C.nif WHERE estado NOT IN (Resuelta,Cerrada) ORDER BY fecharecepcion;

7.

Tiempoypreciodelosmaterialesempleadosparalaspeticionesterminadasenelmesencurso:

SELECT P.referencia, C.nombre, P.resumen, P.tiempoempleado, SUM(M.precio) FROM PETICION P, CLIENTE C, MATERIAL_PETICION M WHERE P.cliente=C.nif AND M.peticion=P.referencia AND estado=Resuelta GROUP BY P.referencia; Finalmente,vamosapracticarconlasconsultasquerealizamosenlgebrarelacionalenelapartadoanterior:

7.

Obtencindeunapeticinjuntoconlosdatosdelcliente:

R:= PETICION [cliente=nif] CLIENTE SELECT * FROM PETICION JOIN CLIENTE ON PETICION.cliente=CLIENTE.nif;

7.

Obtencindeunapeticincontodassusnotas:

NP(peticionnota,nota,fechanota,empleado):=NOTA_PETICION (peticion,nota,fecha,empleado) R:=PETICION[referencia=peticionnota]NP SELECT PETICION.*, peticion AS peticionnota, nota, fecha as fechanota, empleado FROM

FUOC71Z799014MO

15

Casodeestudio

PETICION JOIN NOTA_PETICION ON referencia=peticionnota;

7.

Obtencindelosdatosdetodoslosempleadosquehanparticipadoenlapeticin5:

NP:=NOTA_PETICION[peticion=5] RA:=EMPLEADO[nif=empleado]NP R:=RA[nombre,nif] SELECT E.nombre, E.nif FROM EMPLEADO E, E.nif=NOTA_PETICION.empleado AND NOTA_PETICION.peticion=5;

NOTA_PETICION

WHERE

FUOC71Z799014MO

16

Casodeestudio

7.Introduccinaldiseodebasesdedatos

AunquelassentenciasSQLdecreacindetablassonbastanteclarasparaunusuariotcnico,decaraalareuninprevia alatomadedecisinsobreelSGBDconcretoenelquevamosaimplantarlasolucin,necesitaremosalgoms.

Teniendo encuentaqueentrelos asistentesalareunin nohaymstcnicosespecializados enbasesdedatosque nosotros, hemos pensado que disponer un modelo entidadrelacin del sistema nos ayudar a comunicar mejor la estructuraqueestamosplanteandoy,depaso,ademostrar(o,siesnecesario,corregir)queelmodelorelacionalque planteamosalinicioeselcorrecto.

7.Diseoconceptual:elmodeloER

Vamosaplantearenprimerlugarelmodeloobtenidoy,despus,comentaremoslosaspectosmsinteresantes:

Elmodelo,expresadodeestemodo,esmuchomscomprensibleporpartedepersonalnotcnicoonoespecializadoen tecnologasdebasesdedatos.

Apartirdelaexpresingrficadelmodelo,identificamoslimitacionesopuntosdemejora,queanotamosacontinuacin:

7. 7.

Probablemente,debemosincluirinformacindefacturacinaclientesporlaspeticionesrealizadas.

Probablemente,habr peticionesquepuedanagruparseenunaentidadsuperior(unproyectootrabajo),obien

peticionesrelacionadasentreellas(peticionesquedebanresolverseantesqueotras).

Unavezidentificadasestaslimitaciones,vamosaampliarelmodeloparacorregirlaseimpresionaranuestrossuperioresde caraalareunin.

7.

Informacindefacturacinaclientes:

Lo nicoquehemosintroducidohasidolaentidadFACTURA,queserelacionaconNpeticionesyconun nicocliente.Un CLIENTEpuedetenervariasfacturasasociadas,perounapeticinslopuedeperteneceraunanicafactura.

7.

Gruposdepeticionesyrelacionesentreellas.

Lapertenencia aunproyecto ser opcional, yas loindicamoseneldiagrama.Porloquerespectaalasrelaciones de

FUOC71Z799014MO

17

Casodeestudio

peticionesentreellas,setratadeunainterrelacinrecursiva.Siqueremoscontemplarcasoscomolossiguientes,debemos expresarlarelacincomoM:Nrecursivayopcional.Enlainterrelacin RELACIONA,debemoscontemplaralgnatributo queindiquedequtipoderelacinsetrataencadacaso:

7. 7. 7. 7.

Unapeticindependedeunaomspeticiones. Unapeticinbloqueaaunaomspeticiones. Unapeticinesladuplicadadeunaomspeticiones. Unapeticinestrelacionadaconunaomspeticiones.

7.Diseolgico:latransformacindelmodeloERalmodelorelacional
EnelapartadoanteriorsugerimosunasampliacionessobreelmodeloERqueproporcionabanmsprestacionesalproyecto.A continuacin,vamosarealizarlatransformacinalmodelorelacionaldeestasampliaciones:

7.

Informacindefacturacinaclientes.

Segn las transformaciones vistas en el mdulo El lenguaje SQL, la entidad FACTURA se transforma en la relacin FACTURA,conlossiguientesatributos: FACTURA(numfactura, fecha, cliente) Donde cliente esunaclaveforneaquecorrespondealainterrelacin TIENE entre CLIENTE yFACTURA.Uncliente puedetenerNfacturas,perounafacturapertenecesloaunnicocliente.

LainterrelacinentreFACTURAyPETICIONdeltipo1:Nsetransformatambinenunanuevaclavefornea,queaparece siempreenellado N delainterrelacin;osea,enlarelacin PETICION.Siexistenpeticionesquenodebanfacturarse (porquesehancerradosinresolverse,oeranduplicadasdeotras,etc.),suclaveforneatomaraelvalorNULO.

7.

Gruposdepeticionesyrelacionesentreellas.

Porunaparte,laentidadproyectodebetransformarseenlarelacinPROYECTO,conatributoscomolossiguientes:

PROYECTO(codigo, nombre, fechainicio, fechafin)

Larelacin1:Nentre PROYECTO y PETICIN setransformar enlainsercindeunanuevaclaveforneaenlarelacin PETICION,quepodr tenervalorNULOsilapeticinnoperteneceaningnproyecto;esdecir,sisetratadeunapeticin aislada.LarelacinPETICIONquedaraas:

PETICION(referencia, cliente, resumen, tiempoempleado, factura, proyecto)

estado,

fecharecepcion,

fechainicio,

fechafin,

FUOC71Z799014MO

18

Casodeestudio

Porloquerespectaalasrelacionesentrepeticiones,setratadeunainterrelacinrecursivaN:M,yporlotantosetransformar enunanuevarelacin,PETICION_RELACION:

PETICION_RELACION(referencia_peticion1, referencia_peticion2, tiporelacion)

Enestecaso,ysegnelvalorquepuedatomarelatributo{tiporelacion},tendr importanciaonoqu referenciade peticinapareceencadaatributodelarelacin.

Ejemplo Silarelacindebeindicar simplementequedos peticionesestn relacionadas,entoncesno importaqureferenciasea, la1ola2.

En cambio, si el atributo {tiporelacion} indica un bloqueo o una dependencia entre relaciones (porque una debe resolverseantesqueotra,porejemplo),entoncesstienesentidoqureferenciadepeticinsealmacenaenelatributo1ycul enel2.Entodocaso,estatareacorresponderalasolucinqueseadapteytrabajeconlabasededatosenltimotrmino,no alpropiomodelo.

FUOC71Z799014MO

19

Casodeestudio

7.BasesdedatosenMySQL

Unavezhemosterminadoelprocesodediseo denuestrasolucin, encuanto asusistemadeinformacin,eshorade implantarlosobreunsistemagestordebasesdedatos.

Yaquedisponemosdedosalternativas(MySQLyPostgreSQL),ynonoscorrespondetomarladecisinfinal(slohacerla recomendacin),vamosaelaborarunalistaconlosaspectosclaveenlatomadedecisionesyapuntuar,ocomentar,cada SGBDsegnlostemssiguientes:

7.

Modelodelicencia,precio.

7.Nota
Mostraremosestalistaen formadetabla,yalfinal elaboraremosunas conclusiones.Aunqueno realicemosunaponderacin decadaaspectodelalista anterior,lasimple comparacinnosservir parallegaraunaconclusin rpida.

7. 7. 7. 7. 7. 7. 7. 7. 7. 7.

Soporteporpartedelfabricante. ConexindesdePHP. Prestacionesencreacindelasestructuras(tablas,ndices,etc.). Prestacionesentiposdedatos. Prestacionesenconsultassimples. Prestacionesenconsultascomplejas. Prestacionesenmanipulacindedatos. Facilidadenlaadministracindeusuarios. Facilidadenlagestindecopiasdeseguridad.

7.Concepto
Modelodelicencia, precio

7.Valoracin
2

7.Comentarios
Aunquenonosplanteamosvendernuestrasolucin, nicomercializarlaconunalicenciapropietaria,la licenciadualdeMySQLsiempreserunaspectoque tendremosquetenerencuentasialguienseinteresa pornuestraaplicacin. Tenemostantolaopcindecontratarsoporteen variasmodalidades,comoladeoptarporconsultara laamplsimagamadeusuariosdelproducto.Entodo caso,enambassituacionesobtendremosun excelentesoporte.

Soporteporparte delfabricante

FUOC71Z799014MO

20

Casodeestudio

Conexindesde PHP

PHPsiemprehaincluidosoporteparaesteSGBD bienconfuncionesespecialesdedicadasque aprovechanalmximosuscaractersticas,obien conlibrerasPEARcomoDBquenosabstraendel SGBDyquesoportanMySQLalaperfeccin. Aunquerecientementehahabidoalgnproblemacon lalicenciayparecaquePHPnoincluirasoporte paraMySQLensusltimasversiones,MySQLha hechounaexcepcinconPHP(quesindudaha contribuidomuchoalapopularizacindeMySQL) porelbiendelacomunidadydesususuarios. MySQLesfrancamentefcildemanejareneste aspecto,yaunquenoofrecetodaslasprestaciones contempladasenelestndar,essatisfactorio paralaaplicacinqueestamosplaneando. LostiposdedatossoportadosporMySQLas comolosoperadoresincluidosenelSGBDson msquesuficientesparanuestraaplicacin. saesprecisamentelacaractersticaquehaceque MySQLseaunodelosSGBDmejorposicionados. Comentarios Hastahacepoco,MySQLnosoportabasubconsultas yestoimplicabaunmayoresfuerzoporpartedelos programadores.Ahorayalassoportayaunnivel igualaldesuscompetidores. MySQLincluyemultituddeopcionesnoestndares paracargardatosexternos,insertaroactualizar sobrelabasedeconsultascomplejasylautilizacin deoperadorescomocondicionesparala manipulacin. Soportamuybienelestndarencuantoalacreacin deusuariosylagestindesusprivilegioscon GRANTyREVOKE.Adems,todosestosdatos estnaccesiblesentablasdesistema,loquehace muysencillalaverificacindepermisos. Disponemostantodeherramientasdevolcado,como laposibilidaddecopiabinariadelabasededatos. Adems,dadasupopularidadvariosfabricantesde solucionesdecopiasdeseguridadproporcionan conectorespararealizarbackupsdelabasede datosencaliente. EstamosanteunmsquesatisfactorioSGBD paralasolucinquenosplanteamos.Nohay ningunacarenciainsalvable.

Prestacionesen creacindelas estructuras(tablas, ndices,etc.) Prestacionesen tiposdedatos

Prestacionesen consultassimples Concepto Prestacionesen consultascomplejas

Valoracin 2

Prestacionesen manipulacinde datos

Facilidadenla administracinde usuarios

Facilidadenla gestindecopiasde seguridad

Conclusin

2,6

7. 7.Clavedevaloracin 7. 1:nosatisfactorio 7. 2:satisfactorio 7. 3:muysatisfactorio 7.

FUOC71Z799014MO

21

Casodeestudio

7.BasesdedatosenPostgreSQL 7.Concepto
Modelodelicencia, precio

7.Valoracin
3

7.Comentarios
LalicenciaBSDnonoslimitaenningnaspecto. Simplementetendremosqueincluirlanotasobrela mismaennuestrosoftware,tantosiloqueremos comercializarcomosino. PostgreSQLnoofrecesoportedirectamente, aunquesqueproporcionalosmecanismosparaque lacomunidadloofrezca(listasdecorreo,IRC, enlaces,etc.).Tambintieneunalista(corta)de empresasqueofrecensoporteprofesionalde PostgreSQL.EnEspaaslohayuna,ynoesuna empresadedesarrollodesoftware. PHPsiemprehaincluidosoporteparaesteSGBD, bienconfuncionesespecialesdedicadasque aprovechanalmximosuscaractersticasobiencon librerasPEARcomoDB,quenosabstraendel SGBDyquesoportanPostgreSQLalaperfeccin. PostgreSQLesmuypotenteenesteaspecto,ofrece prcticamentetodaslasprestacionescontempladas enelestndar,ytieneunfantsticosistemade extensin. LostiposdedatossoportadosporPostgreSQL,as comolosoperadoresincluidosenelSGBDsonms quesuficientesparanuestraaplicacin.Adems, susistemadeextensionesydefinicindetiposy dominiosincluyecasitodoloquepodamosnecesitar. Porsupuesto,PostgreSQLnodecepcionaeneste punto. PostgreSQLhasoportadosubconsultas,vistasy todoloquepodamosnecesitarennuestraaplicacin desdehacevariosaos.Suimplementacindestas esyamuyestable. PostgreSQLincluyemultituddeopcionesno estndaresparacargardatosexternos,insertaro actualizarsobrelabasedeconsultascomplejas ylautilizacindeoperadorescomocondiciones paralamanipulacin. Soportabastantebienelestndarencuanto alacreacindeusuariosylagestindesus privilegiosconGRANTyREVOKE.Susistema mltipledeautenticacinlohacedemasiado complejo enesteaspecto. Disponemostantodeherramientasdevolcado,como delaposibilidaddecopiabinariadelabasede datos. EstamosanteelSGBDcasiideal.Slolefalta facilitarlagestindeusuariosymejorarsusoporte.

Soporteporparte delfabricante

Conexindesde PHP

Prestacionesen creacindelas estructuras(tablas, ndices,etc.) Prestacionesen tiposdedatos

Prestacionesen consultassimples Prestacionesen consultascomplejas

Prestacionesen manipulacinde datos

Facilidadenla administracinde usuarios

Facilidadenla gestindecopiasde seguridad Conclusin

2,8

FUOC71Z799014MO

22

Casodeestudio

7. 7.Clavedevaloracin 7. 1:nosatisfactorio 7. 2:satisfactorio 7. 3:muysatisfactorio

FUOC71Z799014MO

23

Casodeestudio

7.

FUOC71Z799014MO

24

Casodeestudio

7.Desarrollodeaplicacionesenconexinconbases dedatos

EnlareuninmantenidaconladireccinseexaminaronmuycuidadosamentelosanlisisdelosSGBDseleccionados.Alser ladiferenciadevaloracintanleve,nofuefciltomarunadecisin,peroalfinalsedecidilaimplementacindelasolucin sobreelSGBDPostgreSQL.

Sedecidi,tambin,hacerlaimplementacinenPHP,abstrayndonosdelSGBDconelquetrabajramos.As,encasode quelamayordificultadenlaadministracindePostgreSQLnoshicierarectificarladecisinenelfuturo,eltiempodepuesta enmarchadelcambioseramnimo.

Antesdeiniciarlaimplantacin,vamosarealizarunaspruebasconceptualesdelapropiaimplementacinque,despus, pasaremosaunequipodedesarrollointernoparaquehagaelresto.Enconcreto,tomaremosalgunasdelasconsultasvistasen elcaptulo3yprogramaremoslosscriptsPHPdelaspginascorrespondientes,documentndolasalmximoparafacilitarel trabajoalequipodedesarrollo.

Enprimerlugar,crearemosunfichero.phpconlaconexinalabasededatos,paraincluirloentodoslosPHPquelovayana necesitar,yevitar,as,tenerquerepetircdigocadavez.Estaaccintambinayudaramantenercentralizadoslosdatosdela conexin y, en caso de que debiramos cambiar el usuario o la contrasea o cualquier otro dato de la conexin, slo tendramosqueactualizardichofichero.

datosconexion.php <?php // Incluimos la librera una vez instalada mediante PEAR require_once DB.php;

// Creamos la conexin a la base de datos, en este caso PostgreSQL $db =& DB::connect(pgsql://usuario:password@servidor/basededatos);

// Comprobamos error en la conexin if (DB::isError($db)) { die($db->getMessage()); } ?> a. Nuevocliente.Pginaderesultadodelainsercindeunnuevocliente <?php // Incluimos el fichero con los datos de la conexin.

FUOC71Z799014MO

25

Casodeestudio

include_one datosconexion.php; // Utilizamos el mtodo quoteSmart() para evitar que determinados caracteres // (intencionados o no) puedan romper la sintaxis de la sentencia SQL. // El mtodo insertar automticamente comillas alrededor de las cadenas // de texto, o tratar los valores NULL correctamente segn el SGBD, etc. $db->query(INSERT INTO CLIENTE VALUES ( . $db->quoteSmart($_REQUEST[nombre]) . , . $db->quoteSmart($_REQUEST[dni]). , . $db->quoteSmart($_REQUEST[telefono]) . , . $db->quoteSmart($_REQUEST[email]) . )); if (DB::isError($db)) { echo <h2>Error al insertar el cliente</h2>; die($db->getMessage()); } $db->disconnect(); c. Cambiodeestadodelapeticin: <?php include_once datosconexion.php; // Vamos a trabajar con todas las operaciones de esta pgina en forma de // transaccin, ya que, si se produce un error al insertar una nota o un // material, la peticin puede quedar en un estado errneo. $db->autoCommit(false); // Le decimos a PHP que almacene en un buffer la salida, para poder as // rectificar en caso de producirse un error. ob_start(); // Suponemos que los estados nos llegan directamente con los valores // soportados por el dominio, por ejemplo, a partir de los valores // fijos de un desplegable. // Suponemos que la fecha de inicio y fecha de fin nos llegan en formato // espaol dd/mm/yyyy y los convertimos a YYYY-mm-dd segn ISO 8601. // Suponemos que el tiempo empleado nos llega en dos campos, horas y minutos, de // forma que concatenndolos e insertando un : en medio, obtenemos una // hora en formato ISO 8601. if (isset($_REQUEST[fechainicio]) && !empty($_REQUEST[fechainicio])) { $fechainicio_array=split(/,$_REQUEST[fechainicio]); $fechainciioDB=date(Y-M-d, mktime(0, 0, 0, $fechainicio[1], $fechainicio[0], $fechainicio[2])); } else { $fechainicioDB=NULL; } if (isset($_REQUEST[fechafin]) && !empty($_REQUEST[fechafin])) {

FUOC71Z799014MO

26

Casodeestudio

$fechafin_array=split(/,$_REQUEST[fechafin]); $fechafinDB=date(Y-M-d, mktime(0, 0, 0, $fechafin[1], $fechafin[0], $fechafin[2])); } else { $fechafinDB=NULL; } $db->query(UPDATE PETICION SET . cliente= . $db->quoteSmart($_REQUEST[cliente]) . , . resumen= . $db->quoteSmart($_REQUEST[resumen]) . , . estado= . $db->quoteSmart($_REQUEST[estado]) . , . fechainicio= . $db->quoteSmart($fechainicioDB) . , . fechafin . $db->quoteSmart($fechafinDB) . , . tiempoempleado=. $db->quoteSmart($_REQUEST[hora] . : . $_REQUEST[minutos])); if (DB::isError($db)) { echo <h2>Error al insertar el cliente</h2>; ob_flush(); die($db->getMessage()); } else { echo <h2>Peticin actualizada correctamente</h2>; } // Comprobamos si han aadido alguna nota if (isset($_REQUEST[texto_nota]) && !empty($_REQUEST[texto_nota])) { // Tenemos el identificador de peticin en $_REQUEST[referencia] $db->query(INSERT INTO NOTA_PETICION VALUES ( . $db->quoteSmart($_REQUEST[referencia]) . , . $db->quoteSmart($_REQUEST[texto_nota]) . , . $db->quoteSmart(date(Y-M-d,mktime())) . , . $db->quoteSmart($_REQUEST[nifEmpleado]) . )); if (DB::isError($db)) { ob_clean(); echo <h2>Error al insertar la nota. Datos de la peticin no actualizados</h2>; ob_flush(); $db->rollback(); die($db->getMessage()); } else { echo <h3>Nota actualizada correctamente</h2>; } } // Comprobamos si han aadido algn material+ if (isset($_REQUEST[nombrematerial]) && !empty($_REQUEST[nombrematerial])) { // Tenemos el identificador de la peticin en $_REQUEST[referencia] $db->query(INSERT INTO MATERIAL_PETICION VALUES . $db->quoteSmart($_REQUEST[nombrematerial]) . , . $db->quoteSmart($_REQUEST[referencia]) . , . $db->quoteSmart($_REQUEST[precio]) . , . $db->quoteSmart($_REQUEST[cantidad]) . )); if (DB::isError($db)) { ob_clean(); echo <h2>Error al insertar el material. Datos de la peticin no actualizados</h2>; ob_flush(); $db->rollback();

FUOC71Z799014MO

27

Casodeestudio

die($db->getMessage()); } else { echo <h3>Material actualizado correctamente</h2>; } } $db->commit(); $ob_flush(); $db->disconnect(); ?> f.yg.Peticionesabiertasdeunclienteyresumendelosmaterialesusadosencadauna <?php include_once datosconexion.php; // Buscamos las peticiones abiertas de un cliente $res=$db->query(SELECT P.referencia, P.resumen, P.estado, P.fecharecepcion FROM PETICION P JOIN CLIENTE C ON P.cliente=C.nif WHERE ESTADO NOT IN (Resuelta, Cerrada) ORDER BY fecharecepcion); if (DB::isError($db)) { die($db->getMessage()); } // Antes de empezar la iteracin por las peticiones, vamos a preparar la consulta // correspondiente a los materiales empleados en cada una. $queryMaterial=$db->prepare(SELECT SUM(M.precio) as precioMateriales, COUNT(M.nombrematerial) numMateriales FROM MATERIAL_PETICION M WHERE M.peticion=? ); if (DB::isError($db)) { die($db->getMessage()); } echo <table>; echo <tr><th>Referencia</th><th>Resumen</th><th>Estado</th><th>Duracin</th><th> Fecharecepcin</th><th>Precio materiales</th><th>Nm. materiales</th></tr>; while($res->fetchInto($row,DB_FETCHMODE_ASSOC)) { echo <tr>; echo <td> . $row[referencia] . </td>; echo <td> . $row[resumen] . </td>; echo <td> . $row[estado] . </td>; echo <td> . $row[fecharecepcion] . </td>; $resMaterial=$db->execute($queryMaterial,$row[referencia]); if (DB::isError($db)) { die($db->getMessage()); } else { $res->fetchInto($rowMaterial,DB_FETCHMODE_ASSOC); echo <td> . $rowMaterial[precioMateriales] . </td>; echo <td> . $rowMaterial[numMateriales] . </td>; } echo </tr>; }

FUOC71Z799014MO

28

Casodeestudio

echo </table>; ?> Medianteestostresejemplos,disponemosyadeunabasetantodecdigo,comodeestiloymecanismosdecomprobacinde error,paradesarrollarelrestodelaaplicacin,sintenerencuentasudiseo.

Hemosintentadoescogerconsultasyoperacionesrepresentativasdelfuncionamientodelaaplicaciny,alavez,quese correspondieran con las vistas en apartados anteriores. Adems, hemos introducido algunas funciones PHP que suelen utilizarseencombinacinconeltrabajoenbasesdedatosparatiposconcretos,yparaeltratamientodeerrores,paraevitar queelusuariorecibainformacinconfusaenlapginaderesultados.

FUOC71Z799014MO

29

Casodeestudio

Resumen

Enestaunidadhemosvistolasactividadesmsdestacadasdelasfasesinicialesdeunproyectodedesarrolloconconexina basesdedatos.

Msqueresolverelpropiocaso,setratabadeidentificarlosaspectosclavedeloscasosrealesyenlazarlosconelcontenido delrestodeunidadesdelcurso.

Habrispodidoidentificarquactividadessonmsrelevantesparaelresultadofinaldelproyecto,enculesconvieneinvertir mstiempoyculesnosontancrticasparalosobjetivosdesteuotrocasosimilar.

Si habis seguido la planificacin sugerida y repasado cada unidad a la que que se haca referencia, habris podido comprenderlaaplicacinprcticadelmaterialysehabrnalcanzadolosobjetivosquenosproponamosalredactaresta unidaddidctica.

Tambinesposibleleerestecasodeestudiocomouncaptulofinaldelcurso,dondesedesarrollaunejemplocompleto.Se haintentadoredactarloconestedoblecometido.

Você também pode gostar