Escolar Documentos
Profissional Documentos
Cultura Documentos
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
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.
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
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.
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:
FUOC71Z799014MO
Casodeestudio
7.Reglasdeintegridad
Enestepunto,noesnecesariopreocuparseporlasreglasdeintegridaddelmodeloquetratansobrelaclaveprimaria,yaque nosvendrnimpuestasenelmomentodecrearlastablasenelSGBD.
PETICION
7.
Modificacindelatributo {referencia}referenciadodesdeNOTA_PETICIONyMATERIAL_PETICION:
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.
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
7.
Obtencindeunapeticinjuntoconlosdatosdelcliente:
7.
Obtencindeunapeticincontodassusnotas:
7.
Obtencindelosdatosdetodoslosempleadosquehanparticipadoenlapeticin5:
Ossugerimosqueintentismsoperacionessobreelmodeloparafamiliarizarosconl.
FUOC71Z799014MO
11
Casodeestudio
7.EllenguajeSQL
Unavezterminadoelmodelorelacional,decidimoscompletarladocumentacinquevenamosrealizandoconlassentencias SQLcorrespondientes.As,veremosenquseconcretarelmodelorelacional.
7.Sentenciasdedefinicin 7.
Creacindelabasededatos
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
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:
7.
Nuevapeticin:
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
7.
Materialessolicitadosenlapeticin5:
7.
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
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:
7.
Gruposdepeticionesyrelacionesentreellas.
FUOC71Z799014MO
17
Casodeestudio
7. 7. 7. 7.
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.
7.
Gruposdepeticionesyrelacionesentreellas.
Porunaparte,laentidadproyectodebetransformarseenlarelacinPROYECTO,conatributoscomolossiguientes:
estado,
fecharecepcion,
fechainicio,
fechafin,
FUOC71Z799014MO
18
Casodeestudio
Porloquerespectaalasrelacionesentrepeticiones,setratadeunainterrelacinrecursivaN:M,yporlotantosetransformar enunanuevarelacin,PETICION_RELACION:
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
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.
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.
Valoracin 2
Conclusin
2,6
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
2,8
FUOC71Z799014MO
22
Casodeestudio
FUOC71Z799014MO
23
Casodeestudio
7.
FUOC71Z799014MO
24
Casodeestudio
7.Desarrollodeaplicacionesenconexinconbases dedatos
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
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.