[Php-avanzado] Normalizacion Juan Manuel V3

Leonardo Tadei - Pegasus Tech Supply leonardot en pegasusnet.com.ar
Sab Dic 8 16:18:44 ART 2012


Hola Juan Manuel,

El sáb, 08-12-2012 a las 02:18 -0300, Juan Manuel P. escribió:
> Leo, te respondo abajo de cada consulta y pego al final la ultima
> version de la normalizacion que acabo de corregir.

	Veamos:


> > Lo dejo a tu criterio: o normalizás bien esto o ponés una aclaración
> > del motivo por el que no estás normalizando.
> > 
> 
> Preferi normalizar bien, y cree las tablas correspondientes, pero de
> todas formas aclaro abajo que fue lo que hice y porque lo hice.

...	

> > > Mascotas_Perdidas
> > > [
> > > mas_id: integer(autoincremental);
> > > mas_name: Varchar(50);
> > > mas_sex:Varchar(20);
> > > mas_raza: Varchar(150);
> > > mas_edad: integer;
> > > mas_obs: text;
> > > mas_tamano: Varchar(25);
> > > mas_loc: Varchar(150);
> > > mas_prov: Varchar(100);
> > > mas_est_id: integer; (FK)
> > > mas_con_id:integer(FK);
> > > mas_fecalta: timestamp;
> > > ]
> > 
> > Acá y en las otras tablas de Mascotas, faltan como te decía más
> arriba
> > los ID además del nombre de la entidad referenciada.
> > 
> 
> > > Mas_Pics
> > > [
> > > mpic_id: integer(autoincremental);
> > > mpic_mas_id: integer; (FK)
> > > mpic_name: Varchar(50);
> > > mpic_sit_id:integer;(FK)
> > > ]
> > 
> > Las dos tablas de arriba, si quedan así, es con comentario
> aclaratorio.
> > Si no, será una tabla para las imágenes de cada tipo de mascota.
> > 
> 
> Hice una modificacion, en la Normalizacion que adjunto al final esta
> todo, pero paso a detallar lo que hice, decime si es correcto o sigo
> creando problemas. Porque como decis Mas_Pics es un almacenamiento
> lateral, por lo tanto decidi agregar 2 campos, modificar el de
> pic_mas_id actual y eliminar el de situaciones ya que elimine tambien
> la tabla.
> Los campos que agregue y que modifique al final son los que relacionan
> con las tablas de Mascotas, en este caso cada campo corresponde a una
> tabla, como aclaro que aceptan nulos, por codigo buscaria cual no es
> nulo y ahi lo relaciono con la tabla que corresponde. O si necesito
> buscarlo partiendo de la mascota ya iria directamente al campo en
> cuestion, se supone que si o si uno y solo uno de los tres deberia
> tener un valor distinto de nulo que relacione a una mascota.
> 
> Seria esta una solucion aceptable? me imagino que buena no es pero me
> parece mejor que el campo discriminador de antes.

	Es una solución tan mala (o tan buena) como el campo discriminador.
	Todo lo que no esté en 3FN te va a traer unas consecuencias u otras en
el código.
	De todas formas y como te decía, las imágenes son un complemente que no
hace al núcleo del problema, y al menos el impacto quedará acotado al
manejo de las imágenes.
	Recordá poner un comentario en esta tabla en la normalización para
aclarar esta decisión y los motivos.

> > > Mas_Codigos
> > > [
> > > mcod_id: integer(autoincremental);
> > > mcod_link: varchar(100);
> > > mcod_mas_id: integer; (FK)
> > > mcod_sit_id:integer;(FK)
> > > mcod_fecalta: timestamp;
> > > ]
> > 
> > Esta tabla no va.
> > El link de aprobación depende directamente y solo depende de la
> Mascota
> > X a que corresponde, por tanto la normalización no dice que tiene
> que
> > estar en tabla aparte, sino como parte de la entidad de la que
> depende.
> 
> Ok, la borre. Igual el sentido de esta tabla era no almacenar los
> codigos por demasiado tiempo. Se supone que pasado los 3 dias cada
> codigo se borraria, incluso antes si el contacto valida el email.

	El sentido de existir o no de una tabla lo da la normalización, y no la
duración del dato u otros factores...
	Si no querés mantener el dato, luego de validado asignale NULL.


> > Con el id de situación, estás usando acá de nuevo un campo
> > discriminador. En este caso, no es una cuestión lateral del
> > almacenamiento, así que sí vas a tener que normalizarlo y crear un
> > almacenamiento para las Observaciones de cada Mascota X que las use.
> > 
> > Releyendo la SRS para validar la normalización, me acabo de dar
> cuenta
> > de que no le encuentro sentido a tener una Observación de Mascota
> > Encontrada.
> > Está bueno que si uno ve una Mascota Perdida, pueda avisar que la
> vio
> > en determinado lugar. Pero en qué situación alguien reportaría que
> vio
> > una Mascota Encontrada? 
> 
> La reportaria si la conoce, actualmente tengo 2 conocidos que han
> encontrado en la calle a 2 perros. Suponete que hay alguien que ve la
> foto y los reconoce, entonces completaria un Aviso de Observacion de
> Mascota Encontrada, de esta forma el sistema pone en contacto a la
> persona que reporta que lo conoce al perro y la persona que
> actualmente lo encontro.

	Ahhh... ahora caigo con qué es lo que me desentonaba.
	Según tu descripción, esto no es una "Observación de Mascota
Encontrada" sino un "Conocimiento de Mascota Encontrada" porque lo que
se alguien reporta es que conoce al animal que otro encontró.

	Es importante que la frase que define a cada cosa tenga el sentido
correcto, porque si no uno se forma una idea diferente a lo que es la
cosa.

	No sé si el nombre "Conocimiento de Mascota Encontrada" es el mejor de
todos, pero seguro que es más fidedigno a la cuestión que "Observación
de Mascota Encontrada".

	Qué nombre te parece mejor ponerle a esto? Por qué?

> > No cambies nada en la SRS sobre esto: te quería comentar esta
> cuestión.
> > 
> > 
> > 
> > > Mas_Reuniones
> > > [
> > > mreu_id: integer(autoincremental);
> > > mreu_mas_id: integer;
> > > mreu_sit_id:integer;(FK)
> > > mreu_con_id: integer;
> > > ]
> > 
> > No me doy cuenta qué es esta tabla... 
> > Me explicás?
> > 
> Es para los avisos de Reunion. Cuando un contacto encuentra a la
> mascota,(ya sea si esta perdido que lo encontro, o si es encontrado
> que se ubico a la familia)  completa este aviso, para que el sistema
> pase la mascota como Reunida. Sucede que esto es necesario almacenarlo
> porque si alguien no confirma el mail enviado la mascota no pasaria
> nunca a Reunida.

	Entonces tiene demasiado impacto en el software tener acá un campo
discriminador en vez de tener esto bien normalizado.
	Creá un almacenamiento para Aviso de Reunión de Mascota Perdida y otro
para Aviso de Reunión de Mascota Encontrada.

> NORMALIZACION V3
> 
> 
> Provincias
> [
>     pro_id: integer(autoincremental);
>     pro_name: Varchar(100);
> ]
> 
> Localidades
> [
>     loc_id: integer(autoincremental);
>     loc_name: Varchar(150);
>     loc_pro_id: integer; (FK)
> ]
> 
> Especies
> [
>     esp_id: integer(autoincremental);
>     esp_name: Varchar(100);
> ]
> 
> Razas
> [
>     raz_id: integer(autoincremental);
>     raz_name: Varchar(150);
>     raz_esp_id:integer;(FK)
> ]
> 
> Tamanos
> [
>     tam_id: integer(autoincremental);
>     tam_name: Varchar(25);
> ]
> 
> EstadosPublicacion
> [
>     est_id: integer(autoincremental);
>     est_name: Varchar(25); [Activo | Pendiente de Confirmación |
> Pendiente de Publicación | Rechazado]
> ]
> 
> Contactos_Mascotas
> [
>     con_id: integer(autoincremental);
>     con_name: Varchar(50);
>     con_email: Varchar(100);
> ]
> 
> Contactos_Externos
> [
>     cext_id: integer(autoincremental);
>     cext_name: Varchar(50);
>     cext_email: Varchar(100);
> ]
> 
> Sexos
> [
>     sex_id:integer(autoincremental);
>     sex_name:Varchar(20);
> ]
> 
> Mascotas_Perdidas
> [
>     mas_id: integer(autoincremental);
>     mas_name: Varchar(50);
>     mas_sex:Varchar(20);
>     mas_sex_id:integer;(FK)
>     mas_raza: Varchar(150);
>     mas_raz_id:integer;(FK)
>     mas_edad: integer;
>     mas_obs: text; - allow NULL
>     mas_tamano: Varchar(25);
>     mas_tam_id:integer;(FK)
>     mas_loc: Varchar(150);
>     mas_loc_id:integer:(FK)
>     mas_prov: Varchar(100);
>     mas_est_id: integer; (FK)
>     mas_con_id:integer(FK);
>     mas_link: varchar(100);
>     mas_fecalta: timestamp;
> ]
> 
> Mascotas_Encontradas
> [
>     mas_id: integer(autoincremental);
>     mas_name: Varchar(50);
>     mas_sex:Varchar(20);
>     mas_sex_id:integer;(FK)
>     mas_raza: Varchar(150);
>     mas_raz_id:integer;(FK)
>     mas_edad: integer;
>     mas_obs: text; - allow NULL
>     mas_tamano: Varchar(25);
>     mas_tam_id:integer;(FK)
>     mas_loc: Varchar(150);
>     mas_loc_id:integer:(FK)
>     mas_prov: Varchar(100);
>     mas_est_id: integer; (FK)
>     mas_con_id:integer(FK);
>     mas_link: varchar(100);
>     mas_fecalta: timestamp;
> ]
> 
> 
> Mascotas_Reunidas
> [
>     mas_id: integer(autoincremental);
>     mas_name: Varchar(50);
>     mas_sex:Varchar(20);
>     mas_sex_id:integer;(FK)
>     mas_raza: Varchar(150);
>     mas_raz_id:integer;(FK)
>     mas_edad: integer;
>     mas_obs: text; - allow NULL
>     mas_tamano: Varchar(25);
>     mas_tam_id:integer;(FK)
>     mas_loc: Varchar(150);
>     mas_loc_id:integer:(FK)
>     mas_prov: Varchar(100);
>     mas_est_id: integer; (FK)
>     mas_con_id:integer(FK);
>     mas_link: varchar(100);
>     mas_fecalta: timestamp;
> ]
> 
> Mas_Pics
> [
>     mpic_id: integer(autoincremental);
>     mpic_name: Varchar(50);
>     mpic_masp_id: integer; (FK) - allow NULL
>     mpic_mase_id: integer; (FK) - allow NULL
>     mpic_masr_id: integer; (FK) - allow NULL
> ]
> 
> Mas_Observaciones_Perdidas
> [
>     mop_id: integer(autoincremental);
>     mop_masp_id: integer; (FK) - allow NULL
>     mop_cext_id: integer; (FK)
>     mop_calle: Varchar(100);
>     mop_loc_id: integer; (FK)
>     mop_loc:Varchar(150);
>     mop_prov:Varchar(100);
>     mop_link: varchar(100);
> ]
> 
> Mas_Observaciones_Encontradas
> [
>     moe_id: integer(autoincremental);
>     moe_mase_id: integer; (FK) 
>     moe_cext_id: integer; (FK)
>     moe_calle: Varchar(100);
>     moe_loc_id: integer; (FK)
>     moe_loc:Varchar(150);
>     moe_prov:Varchar(100);
>     moe_link: varchar(100);
> ]
> 
> Mas_Reuniones_Perdidas
> [
>     mrp_id: integer(autoincremental);
>     mrp_masp_id: integer; (FK) 
>     mrp_link: varchar(100);
> ]
> 
> Mas_Reuniones_Encontradas
> [
>     mre_id: integer(autoincremental);
>     mre_mase_id: integer; (FK) 
>     mre_link: varchar(100);
> ]

	
	El nombre de estas dos tablas de arriba no debería tener la palabra
"Aviso" ???
	Cuesta bastante entender a qué funcionalidad dan soporte si no lo
dice...

> Sugerencias
> [
>     sug_id: integer(autoincremental);
>     sug_name: varchar(50);
>     sug_email: varchar(100);
>     sug_texto: varchar(500);
> ]
> 
> TAdmins
> [
>     tad_id: integer(autoincremental);
>     tad_name: Varchar(100);
> ]
> 
> Admins
> [
>     adm_id: integer(autoincremental);
>     adm_nombre: Varchar(50);
>     adm_apellido: Varchar(50);
>     adm_user: Varchar(20);
>     adm_pass: Varchar(20);
>     adm_email: Varchar(100);
>     adm_tad_id: integer; (FK)
> ]


	Vamos que falta poco!

-- 
Leonardo Tadei
leonardot en pegasusnet.com.ar
Web: http://leonardo.tadei.com.ar
Firma pública: http://www.pegasusnet.com.ar/LeonardoTadei-public.key



Más información sobre la lista de distribución Php-avanzado