<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 12pt;
font-family:Calibri
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>Perdon me olvide de adjuntar la nueva normalizacion al final.<br><br>From: tucu_21@hotmail.com<br><div>To: php-avanzado@pato2.fi.mdp.edu.ar<br>Date: Fri, 7 Dec 2012 10:45:12 -0300<br>Subject: Re: [Php-avanzado] Normalizacion Juan Manuel V1<br><br>

<style><!--
.ExternalClass .ecxhmmessage P
{padding:0px;}
.ExternalClass body.ecxhmmessage
{font-size:12pt;font-family:Calibri;}

--></style>
<div dir="ltr">> Hola Juan Manuel,<br><div>> <br>>   si bien a la SRS le faltan un par de detalles, para ganar tiempo te<br>> envío algunas correcciones que veo de las funcionalidades que ya están<br>> listas:<br>> <br>> El jue, 06-12-2012 a las 16:30 -0300, Juan Manuel P. escribió:<br>> > Leo, si bien no me mandaste la correccion de la SRS por lo que<br>> > hablamos ayer, me diste a entender que ya estaria casi terminada.<br>> > Me puse a hacer la normalizacion de la BD la adjunto abajo.<br>> > <br>> > Provincias<br>> > [<br>> >     pro_id:integer(autoincremental);<br>> >     pro_name:Varchar(100);<br>> > ]<br>> > <br>> > Localidades<br>> > [<br>> >     loc_id:integer(autoincremental);<br>> >     loc_name:Varchar(150);<br>> >     loc_pro_id:integer; (FK)<br>> > ]<br>> > <br>> > Especies<br>> > [<br>> >     esp_id:integer(autoincremental);<br>> >     esp_name:Varchar(100);<br>> > ]<br>> > <br>> > Razas<br>> > [<br>> >     raz_id:integer(autoincremental);<br>> >     raz_name:Varchar(150);<br>> > ]<br>> <br>>         A Razas le falta la referencia a la Especie.<br>> <br>> > Tamanos<br>> > [<br>> >     tam_id:integer(autoincremental);<br>> >     tam_name:Varchar(25);<br>> > ]<br>> > <br>> > EstadosPublicacion<br>> > [<br>> >     est_id:integer(autoincremental);<br>> >     est_name:Varchar(25); [Activo | Pendiente de Confirmación |<br>> > Pendiente de Publicación | Rechazado]<br>> > ]<br>> > <br>> > Contactos<br>> > [<br>> >     con_id:integer(autoincremental);<br>> >     con_name:Varchar(50);<br>> >     con_email:Varchar(100);<br>> > ]<br>> <br>>       Según tu SRS te haría falta una tabla para Contacto de Mascota y otra<br>> para Contacto Externo.<br>>        Si por cómo funciona el sistema se pueden almacenar las dos cosas en<br>> una misma tabla, entonces en la SRS podrías hablar solo de "Contacto" y<br>> que toda la funcionalidad siga expresada correctamente y sin<br>> ambigüedades.<br><br>Hice la diferencia porque en algunos pasos se utiliza a los dos Contactos, de tal manera que quedara mostrado que son dos personas diferentes las que reportan y las que reciben  los reportes. Pero en si son lo mismo, por eso diferencie para que la SRS sea clara y entendible, me parece que seria redundante almacenar en dos tablas diferentes, pero si vos consideras que es lo mas correcto, lo hago para la tesina, a mi personalmente me pareceria hacer doble trabajo, pero todo bien.<br>Dado que un Contacto de Mascota puede llegar a reportar una mascota que vio o sabe de quien es, entonce seria al mismo tiempo un Contacto Externo.<br><br>> > Mascotas<br>> > [<br>> >     mas_id:integer(autoincremental);<br>> >     mas_name:Varchar(50);<br>> >     mas_sexo: Byte (0-Macho |  1-Hembra);<br>> >     mas_raz_id:integer;<br>> >     mas_edad:integer;<br>> >     mas_obs:text;<br>> >     mas_tam_id:integer; (FK)<br>> >     mas_loc_id:integer; (FK)<br>> >     mas_est_id:integer; (FK)<br>> >     mas_fecalta:timestamp;<br>> > ]<br>> <br>>        Varias cosas:<br>> - primero y principal, tenés acá el mismo problema de concepto que con<br>> los Contactos.<br>> - hacé una tabla con los dos sexos y poné acá una referencia. No<br>> hacerlo, además de dejarte la normalización incompleta, te llena el<br>> código de IF preguntando si es 0 o 1 para ponerle el nombre, que<br>> normalizando bien, aparece directamente en la proyección.<br><br>Listo agregada la tabla de Sexos, siempre habia utilizado esta clase de normalizacion, dado que tener una tabla para dos registros que se sabe que no van a cambiar ni agregarse a futuro. Incluso en lugares donde he trabajado se han manejado asi, y hasta con 4 valores no solo 0 y 1. Pero no hay problema, ya agregue la tabla Sexos.<br><br>> - no podés hacer solo una referencia a la Raza, porque en tu SRS se<br>> pueden borrar y modificar, y de hacerlo cambiás las Mascotas publicadas<br>> anteriormente.<br>> - Idem para Tamaño, y para Especie.<br> <br><br>Pregunto, si como restriccion quiero poner que para modificar, o eliminar algun Tamaño, Especie, Raza, Localidad, Provincia o demas dato que estoy gestionando sea condicion que no exista ninguna mascota o Contacto que este asociada a dicho dato (Ej que ninguna mascota sea de Especie: Gato), en donde lo deberia redactar en la SRS? aca en la normalizacion?<br><br>Si va en la SRS, seria un Req No Funcional? y como deberia de redactarlo para que quedara correctamente expresado?<br> <br>> > Mas_Pics<br>> > [<br>> >     mpic_id:integer(autoincremental);<br>> >     mpic_mas_id:integer; (FK)<br>> >     mpic_name:Varchar(50);<br>> > ]<br>> <br>>        Es poco 50 para el nombre de una imagen. Poné por lo menos 128.<br><br>Preferiria dejarlo en 50, mas que nada porque el nombre no lo asigna el usuario sino el sistema, en base al ID de la mascota y al numero de fotos que se cargaron de la mascota (en la SRS en el diccionario se especifican que pueden ser hasta 3)<br>EJ: IMG1_1.png, IMG1_2.png, etc, etc...<br><br>Como eso es algo interno del sistema, que no agrega funcionalidad no lo especifique en la srs porque considere que no agregaba ni restaba saber como se iban a manejar los registros.<br><br>> > Mas_Codigos<br>> > [<br>> >     mcod_id:integer(autoincremental);<br>> >     mcod_link:varchar(100);<br>> >     mcod_mas_id:integer; (FK)<br>> >     mcod_fecalta:timestamp;<br>> > ]<br>> <br>>        No encuentro justificación para que esto sea una tabla aparte... de<br>> hecho, me parece que tenerlo aparte provoca circunstancias en que el<br>> sistema fallaría.<br><br>Esta tabla sirve para verificar los links de los registros, ya se del alta de mascotas (perdidas, encontradas o reunidas) o de los avisos de observacion o reunion, es una tabla donde se guarda el codigo de validacion, una vez que dicho codigo es visitado, el registro se elimina.<br><br><br>> > Mas_Situaciones<br>> > [<br>> >     msit_id:integer(autoincremental);<br>> >     msit_name:Varchar(25);<br>> > ]<br>> <br>>  Qué es esta tabla ???<br><br>Esta tabla es la que tiene las situaciones de las mascotas [Encontrada, Perdida, Reunida]. Dado que las mascotas poseen exactamente los mismos datos, es por esto que preferi normalizar a tener 3 tablas diferentes con los mismos campos e informacion si con agregar una tabla y un FK a la de mascotas se logra exactamente lo mismo.<br>Aclaracion: me habia olvidado en la normalizacion agregar el campo en la mascota, referente a su situacion.<br><br>> > RelMasCont<br>> > [<br>> >     rmc_mas_id:integer; (FK)<br>> >     rmc_con_id:integer; (FK)<br>> > ]<br>> <br>>  Esta entiendo que desaparecería con la corrección que te menciono<br>> arriba.<br>> <br><br>Esta tabla esta para relacionar una mascota con un contacto y que no quede en la tabla de mascotas el contacto.<br><br>> > Mas_Observaciones<br>> > [<br>> >     mobs_id:integer(autoincremental);<br>> >     mobs_mas_id:integer; (FK)<br>> >     mobs_con_id:integer; (FK)<br>> >     mobs_calle:Varchar(100);<br>> >     mobs_loc_id:integer; (FK)<br>> > ]<br>> <br>>     Posiblemente deba cambiar...<br><br>Es la tabla para los reportes de observacion, dado que las mascotas poseen una situacion pueden ser de Encontradas o Perdidas (por codigo no se permitiria que sean de Reunidas).<br>Que es o porque crees que deba cambiar? <br><br>> > Mas_Reuniones<br>> > [<br>> >     mreu_id:integer(autoincremental);<br>> >     mreu_mas_id:integer;<br>> >     mreu_con_id:integer;<br>> > ]<br>> <br>>  Lo mismo que para Mascota: si podrías poner las reuniones de Mascotas<br>> Perdidas y de Mascotas Encontradas en la misma tabla, podrías en la SRS<br>> especificarlo sin ambigüedades como una sola cosa.<br><br>   Lo mismo que para Mascota: si podrías poner las reuniones de Mascotas<br>Perdidas y de Mascotas Encontradas en la misma tabla, podrías en la SRS<br>especificarlo sin ambigüedades como una sola cosa.<br><br>> > Sugerencias<br>> > [<br>> >     sug_id:integer(autoincremental);<br>> >     sug_name:varchar(50);<br>> >     sug_email:varchar(100);<br>> >     sug_texto:varchar(500);<br>> > ]<br>> <br>>      Según tu SRS las sugerencias no se guardan, solo se envían. O esta<br>> tabla sobra o el RF está incompleto.<br>> <br>Corregi el RF agregando que se guarden a demas de que se envien las sugerencias.<br><br>> > TAdmins<br>> > [<br>> >     tad_id:integer(autoincremental);<br>> >     tad_name:Varchar(100);<br>> > ]<br>> > <br>> > Admins<br>> > [<br>> >     adm_id:integer(autoincremental);<br>> >     adm_nombre:Varchar(50);<br>> >     adm_apellido:Varchar(50);<br>> >     adm_user:Varchar(20);<br>> >     adm_pass:Varchar(20);<br>> >     adm_email:Varchar(100);<br>> >     adm_tad_id:integer; (FK)<br>> > ]<br>> > <br>> > Tablas_Autorizadas<br>> > [<br>> >     tab_id:integer(autoincremental);<br>> >     tab_name:Varchar(30);<br>> > ]<br>> <br>>      Qué es esto???<br>> <br>>     Si es lo que supongo, lo que se autoriza es el acceso a<br>> funcionalidades, que expresado para las tablas (lo que no siempre es<br>> posible) te da por cada tabla permiso para ver, agregar, modificar y<br>> borrar.<br><br>Sucede que el webhosting donde esta alojado el sitio no me permite asociar permisos especificos para cada tabla sino para la bd en general( lo acabo de descubrir hoy cuando hacia la normalizacion). Entonces  para poder implementar los permisos que va a tener cada tabla para cada tipo de administrador, necesito hacer que las tablas que se gestionan sean registradas en esta otra tabla para poder despues asignar los permisos correspondientes y las acciones que se pueden realizar.<br><br>> > Autorizaciones<br>> > [<br>> >     aut_id:integer(autoincremental);<br>> >     aut_name:Varchar(15);<br>> > ]<br>> > <br>> > Permisos<br>> > [<br>> >     per_tad_id:integer; (FK)<br>> >     per_tab_id:integer; (FK)<br>> >     per_aut_id:integer; (FK)<br>> > ]<br>> <br>>         Y si esto es el acceso ver, agregar, modificar y borrar de cada tabla,<br>> no se justifica, porque no existen más que estas 4 cosas para hacer<br>> sobre los datos.<br>> <br>Exactamente, solamente existen esos 4 pero aca se va a registrar lo que esta permitido hacer para cada tipo de administrador.<br>EJ: Permisos[ per_tad_id:1, per_tab_id:1, per_aut_id:1]. <br>Permisos[ per_tad_id:1, per_tab_id:1, per_aut_id:2]. <br>Permisos[ per_tad_id:1, per_tab_id:1, per_aut_id:4]. <br>Donde per_tad_id:1 es el tipo de administrador, per_tab_id es la tabla a la que ese tipo de administrador va a poder realizar acciones, per_aut_id es la accion que puede realizar el tipo de administrador.<br>En el ejemplo, suponete, el aut_id:1 es lectura, el aut_id:2 es agregar y el aut_id:4 es borrar, o sea este tipo de administrador no puede modificar un registro existente en la tabla 1.<br><br><br>>       Bueno Juan Manual, como te decía, esto es para avanzar un poco.<br>> <br>>    Por favor, concentrate en terminar la SRS para darle un contexto fijo a<br>> esto, porque si no vamos a ir y venir demasiadas veces, porque cada<br>> cambio en la SRS tiene un impacto en la normalización.<br>> <br>>     Por otra parte, es habitual que normalizando se descubra algo del<br>> sistema que no se había pensado, y que esto requiera actualizar la SRS,<br>> como le pasó a un Cesar la iteración anterior, pero con la SRS validada,<br>> estos ajustes son mínimos.<br>> <br>>    Seguimos!<br>> <br>> -- <br>> Leonardo Tadei<br>> leonardot@pegasusnet.com.ar<br>> Web: http://leonardo.tadei.com.ar<br>> Firma pública: http://www.pegasusnet.com.ar/LeonardoTadei-public.key<br><br>Provincias<br>[<br>    pro_id: integer(autoincremental);<br>    pro_name: Varchar(100);<br>]<br><br>Localidades<br>[<br>    loc_id: integer(autoincremental);<br>    loc_name: Varchar(150);<br>    loc_pro_id: integer; (FK)<br>]<br><br>Especies<br>[<br>    esp_id: integer(autoincremental);<br>    esp_name: Varchar(100);<br>]<br><br>Razas<br>[<br>    raz_id: integer(autoincremental);<br>    raz_name: Varchar(150);<br>    raz_esp_id:integer;(FK)<br>]<br><br>Tamanos<br>[<br>    tam_id: integer(autoincremental);<br>    tam_name: Varchar(25);<br>]<br><br>EstadosPublicacion<br>[<br>    est_id: integer(autoincremental);<br>    est_name: Varchar(25); [Activo | Pendiente de Confirmación | Pendiente de Publicación | Rechazad]<br>]<br><br>Contactos<br>[<br>    con_id: integer(autoincremental);<br>    con_name: Varchar(50);<br>    con_email: Varchar(100);<br>]<br><br>Sexos<br>[<br>    sex_id:integer(autoincremental);<br>    sex_name:Varchar(20);<br>]<br><br>Mas_Situaciones<br>[<br>    msit_id: integer(autoincremental);<br>    msit_name: Varchar(25);<br>]<br><br>Mascotas<br>[<br>    mas_id: integer(autoincremental);<br>    mas_name: Varchar(50);<br>    mas_sex_id:  integer; (FK)<br>    mas_raza: <br>    mas_edad: integer;<br>    mas_obs: text;<br>    mas_tamano: <br>    mas_loc: <br>    mas_prov:<br>    mas_est_id: integer; (FK)<br>    mas_msit_id:integer; (FK)<br>    mas_fecalta: timestamp;<br>]<br><br>Mas_Pics<br>[<br>    mpic_id: integer(autoincremental);<br>    mpic_mas_id: integer; (FK)<br>    mpic_name: Varchar(50);<br>]<br><br>Mas_Codigos<br>[<br>    mcod_id: integer(autoincremental);<br>    mcod_link: varchar(100);<br>    mcod_mas_id: integer; (FK)<br>    mcod_fecalta: timestamp;<br>]<br><br>RelMasCont<br>[<br>    rmc_mas_id: integer; (FK)<br>    rmc_con_id: integer; (FK)<br>]<br><br>Mas_Observaciones<br>[<br>    mobs_id: integer(autoincremental);<br>    mobs_mas_id: integer; (FK)<br>    mobs_con_id: integer; (FK)<br>    mobs_calle: Varchar(100);<br>    mobs_loc_id: integer; (FK)<br>]<br><br>Mas_Reuniones<br>[<br>    mreu_id: integer(autoincremental);<br>    mreu_mas_id: integer;<br>    mreu_con_id: integer;<br>]<br><br>Sugerencias<br>[<br>    sug_id: integer(autoincremental);<br>    sug_name: varchar(50);<br>    sug_email: varchar(100);<br>    sug_texto: varchar(500);<br>]<br><br>TAdmins<br>[<br>    tad_id: integer(autoincremental);<br>    tad_name: Varchar(100);<br>]<br><br>Admins<br>[<br>    adm_id: integer(autoincremental);<br>    adm_nombre: Varchar(50);<br>    adm_apellido: Varchar(50);<br>    adm_user: Varchar(20);<br>    adm_pass: Varchar(20);<br>    adm_email: Varchar(100);<br>    adm_tad_id: integer; (FK)<br>]<br><br>Tablas_Autorizadas<br>[<br>    tab_id: integer(autoincremental);<br>    tab_name: Varchar(30);<br>]<br><br>Autorizaciones<br>[<br>    aut_id: integer(autoincremental);<br>    aut_name: Varchar(15);<br>]<br><br>Permisos<br>[<br>    per_tad_id: integer; (FK)<br>    per_tab_id: integer; (FK)<br>    per_aut_id: integer; (FK)<br>]<br></div></div></div>                                          </div></body>
</html>