entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

0voto

Normalizando base de datos con 12,300 registros (continuación)

Bien ahora les adjunto la estructura de mi base de datos para explicar mejor lo que pretendo hacer y cual es mi duda en cuestión

Esta es la estructura de la tabla catálogos originalmente, pero con un idautoincrement que le agregue pues no lo tenia,muestro varios campos que son los primeros pero como ya había comentado a la derecha hay otros 20 y tantos mas,pero se que con esto que me ayuden después yo solo podre tomar todos los demás campos que necesite

Tabla catálogos

https://www.dropbox.com/s/kde2t5d2s0xjhzn/1.png

Si se dan cuenta los autores, tipos y subtipos se repiten por lo que decidí crearme una tabla de autores, tipos, y subtipos, esto con la ayuda de mi colega @gderas2 :)

Tabla autores

https://www.dropbox.com/s/rf6k64hscurq6p6/2.png

Tabla tipos

https://www.dropbox.com/s/fhw7sphin8ge8bg/3.png

Ahora si con esta información que les proporciono, como hago poner en mi tabla catálogos el id del autor que le corresponde, así como el id de tipo???, espero esto ayude @Leonardo-Tadei :)

Saludos!!!

1 Respuesta

3votos

Leonardo-Tadei Puntos227320

Hola iPHP,

Tenés una tabla Catalogos con la estructura del sistema anterior, que es la que querés migrar al sistema nuevo que está normalizado (te falta una tabla para los subtipos de bien todavía para que esté bien normalizado..

Lo que tenés que hacer primero es crear una tabla para el Catalogo en tu nuevo sistema. La estructura sería

Tabla Catalogo_nuevo
id
num_inv
num_cat (no entiendo qué es este dato así que puede variar)
otro_num
id_tipo_bien
id_subtipo_bien
titulo
id_autor

Luego tendrás que hacer un script de migración. El algoritmo para migrar sería:

Mientras (r = registro_catalogo) {
  tipo_bien = r[tipobien]
  buscar tipo_bien en tabla tipos_bien
  si existe, obtener id_tipobien
  sino, insertarlo y obtener id_tipobien.

  // lo mismo para autores
  ...
   // lo mismo para subtipos
  ...
  // insertar el registro del nuevo catalogo
  insertar en Catalogo_nuevo (r[num_inv], r[num_cat], r[otro_num], id_tipobien, id_subtipobien, r[titulo], id_autor)
}

Fijate que en la inserción del registro del Catálogo con su estructura normalizada, le ponés los datos que le son propios de registro de la tabla original, y le ponés los ID que hace referencia a las entidades de las nuevas tablas.

Por la estructura que mostrás, el id_subtipo_bien puede ser nulo, pero todos los demás ID tienen que ser no nulos.

Esta es una tarea muy habitual al hacer sistemas nuevos y que tomen datos de sistemas anteriores que no cumplan con la normalización: hay que construir uno o varios scripts que migren los datos de la estructura vieja a la nueva. Luego, en el nuevo sistema, solo quedarán funcionando las nuevas estructuras de datos.

Saludos cordiales!

0voto

iphp comentado

Que tal!! Leonardo, así es, ya aplique los mismo para la tabla subtipos solo que nadamas te mostré tipos y autores porque como comente, si puedo hacerlo con esas dos, incluso con una, pues ya podre hacerlo con todas las que necesite, el campo num_cat significa num_catalogo que por cierto también creare otra tabla pues muchos números de catalogo se repiten. Bien ahora que ya me entiendes un poco mejor, para aclarar aun mas este asunto de hecho cambiare el nombre de la tabla "catálogos" a -> "bienes_materiales" pues cada bien pertenece a un catalogo de ahí el campo "num_cat", así entonces ahora si tendré la tabla catálogos con el id como las demás tablas.

Por lo que quedaría de la siguiente manera:

Tabla bienes_materiales

![https://www.dropbox.com/s/tp2k2muvr26le3o/bienes.png][1]

Tabla subtipos

![https://www.dropbox.com/s/nhdg8tvswphhs4e/subtipos.png][1]

Tabla catalogos

![https://www.dropbox.com/s/uad833pjbvq727n/catalogos.png][1]

Por lo que la tabla nueva se llamara bienes_mat o bienes, y es la que llevara la estructura que me mencionaste, quedando así:

![https://www.dropbox.com/s/vatmefqojk6ev1x/bienes_cat.png][1]

Vamos bien cierto??

Ahora, el algoritmo que me mandas seria en mysql??, podrías darme un ejemplo de como seria el codigo, pues entiendo el pseudocodigo y lo que hace el algoritmo pero no he hecho inserciones de ese tipo y de esta magnitud

Gracias por la atención!!

Saludos!!

0voto

Leonardo-Tadei comentado

Hola iPHP,

No entiendo qué es el campo id_cat en la tabla bienes_materiales. Qué significa ese dato? Tal vez signifique que falta definir otra entidad, o tal vez no...

Por otra paret, el pseudocódigo que te envié es con la idea de hacerlo en PHP, en dónde las búsquedas de las datos será SELECT de SQL a la tabla correspondiente, y los INSERT serán querys SQL para insertar los datos.

El algoritmo funciona igual de bien para 12 datos que para 12 mil: no hay que tener ninguna consideración de tamaño.

Saludos!

PD: recordá cerrar la pregunta anterior, así los demás visitantes llegan a esta y no se confunden con el inexistente tema de las claves foráneas.

0voto

iphp comentado

Saludos Leonardo!, el campo id_cat es el id de la tabla catálogos, como te comente, para entender mas el contexto de esto, le cambie el nombre a la tabla catálogos por bienes_materiales pues desde el principio el que la hallan nombrado "catálogos" estuvo mal ya que me di cuenta que como atributo tenia No_Catalogo donde se repetían muchas veces el mismo numero, es decir, pasaba lo mismo que con los tipos, subtipos, autores, ademas de que lo que se va a manejar es la alta de bienes materiales los cuales pueden pertenecer a cierto catalogo, por eso como lo dices cree otra entidad ahora si llamada "catálogos" te mande la imagen en la respuesta anterior, pero te la adjunto de nueva cuenta :D

https://www.dropbox.com/s/uad833pjbvq727n/catalogos.png

En este momento cierro la otra pregunta :)

En PHP!, bien, tratare de llevar el algoritmo a código y te cuento como me fue....

Que estés muy bien!!

0voto

Leonardo-Tadei comentado

Estoy tratando de comprender la estructura de la información (algo indispensable para poder normalizar)

Puede en un Catálogo haber Bienes_Materiales de distintos Autores?

No me refiero a las tablas actuales, sino al problema que estás modelando en sí. Estoy denotando con mayúsculas cada entidad hallada hasta ahora.

PD: había visto tu tabla Catalogos, lo que no le encuentro es sentido...

0voto

iphp comentado

Hola Leonardo!, bien paso a explicarte, haciendo el análisis de como lo estaban administrando en access y como se desea que trabaje el sistema, por ejemplo:

Muchos Bienes_Materiales le pertenecen a un Catalogo, ahora, un Catalogo puede conocerse mejor como una dependencia, es decir, muchos Bienes_Materiales le pertenecen al Instituto de Cultura, por lo que podría decirse, el catalogo de bienes materiales del instituto de Cultura,y así para cada dependencia. Es por eso que en la Entidad Bienes_Materiales tiene un id de catalogo, y si por ejemplo el Instituto de Cultura tiene varios bienes de distintos autores. Con dicha información cres que no tenga sentido nombrar la entidad Catálogos??

Saludos!

0voto

Leonardo-Tadei comentado

Gracias por la explicación, pero no respondés a mi pregunta:

Puede en un Catálogo haber Bienes_Materiales de distintos Autores?

Respuestas posibles: o no ;-)

Para ir avanzando te hago otra pregunta con las mismas respuestas posibles: una Dependencia puede tener más de un Catálogo?

0voto

iphp comentado

Jajaja bueno, la explicación fue para ver si ayudaba un poco, las respuestas son:

Si!,un catalogo puede tener varios Bienes_Materiales de distintos autores

Y

No!, una Dependencia solo tiene 1 Catalogo

Son 44 Dependencias lo que equivale a 44 Catálogos, cada uno con varios Bienes_Materiales, con distintos Autores,Tipos_Bien y Subtipos_Bien

Saludos y sigamos en el camino....

0voto

Leonardo-Tadei comentado

Entonces, la normalización que te planteo al principio de esta respuesta es la correcta.

El algoritmo en pseudocódigo también es el mismo.

Tené en cuanta que la tabla Catalogos original la usarás solo como la fuente de los datos nuevos, y tu sccript de migración deberá insertar datos en las tablas Autores, Tipos_Bien, SubTipos bien y la correctamente normalizada Catálogos (que tendrá un nombre distinto para no pisarse con la original con los datos.

Saludos cordiales!

0voto

iphp comentado

Que onda Leonardo!!, entonces quiere decir que mi diseño estaba bien y normalice correctamente??? debido a que la estructura de las tablas que me mencionaste fue como ya la tenia :D

He hecho la migración, te adjunto la imagen de como quedo mi tabla:

Tabla Bienes (normalizada!)

https://www.dropbox.com/s/tzepdf7rwgpdjdv/bienes_norm.png

Hasta aquí quiero pensar que es como debería de estar cierto?, te agradecería me hicieras las aclaraciones que seas necesarias, pues pasare a darte algunos otros datos para pasar a otras cuestiones que comienzan a embargarme xD

Gracias Hermano!!

Saludos!!

0voto

Leonardo-Tadei comentado

Pareciera que tu normalización es correcta pra este problema. Felicitaciones!

No puedo validarla del todo porque nunca enviaste la estruvtura de las tablas, en dónde figuran los campos, los tipos de datos y los índices, pero con los ejemplos de datos que enviaste se ve bien.

Me llamó la atención que en la tabla original sin normalizar había subtipos vacíos, pero en tu última captura de pantalla con datos todos tenían una referencia a un subtipo... tal vez fue solo coincidencia.

Saludos y hasta la próxima!

0voto

iphp comentado

Hola Leonardo!, tenias razón con eso de los subtipos algunos eran nulos y de todos modos tenían un id, pero ya lo corregí, gracias!!

Ok, hasta ahí vamos bien entonces,pero... hablando de la tabla original sin normalizar, de eso es de lo que te que quería hablar ahora, no se si recuerdes que comente que la tabla Bienes_Materiales posee aproximadamente 38 atributos de los cuales solo te mostré los primeros 7 pues sabia que si podía hacer lo de atributo autor (por la cuestion de que se repetian), podría hacerlo para todos los demás que necesitara. Entonces esto indica que tenemos una sola tabla "Catalogos" (la original y sin normalizar") con todos esos registros, con 38 campos en una sola tabla para un solo Bien_Material

Esta vez no te diré "se me ocurre", esto es lo que hice:

Dividí la tabla "Catalogos" en 5 tablas que forman a su vez los atributos de Bien_Material

Tabla Generales:

https://www.dropbox.com/s/4gqidd2uyhmdqdu/generales.png?m

Tabla Forma:

https://www.dropbox.com/s/bcrwksdg00reval/forma.png?m

Tabla Histórico:

https://www.dropbox.com/s/xqi5kj96fvbtdea/historico.png

Tabla Mantencion:

https://www.dropbox.com/s/81vsdzatai5bn55/mantencion.png

Tabla Otros_Datos

https://www.dropbox.com/s/fgrtcw3f0uo60wt/otros_datos.png?m

La pregunta y lo que me hace ruido es que como voy a insertar los siguientes Bienes_Materiales que necesito si ya lo dividí en tablas???, al igual como voy a mostrar todos los atributos que le pertenecen a un Bien_Material, esta bien lo que hice??

Espero haberme dado a entender y puedas seguir orientándome

Buena Vibra!! y nuevamente gracias!!

0voto

Leonardo-Tadei comentado

Hola iPHP,

si hubieras puesto acá la estructura de la tabla original, nos hubiéramos ahorrado un largo camino :-(

La tabla generales tiene un nombre poco feliz, porque no logro darme cuenta a qué entidad representa.
La tabla forma no parece tener sentido, ya que las medidas serán únicas de cada bien material. Sin embargo SubTipo bien parece una entidad aparte, materia prima también y id_estado también, con lo que debería haber tres tablas más.
Pasa lo mismo en Histórico con ubicación y adquisición... y tal vez con origen y destino, que al estar en blanco no le puedo dar sentido semántico.
En tabla mantención pasa con casi todos los campos.
La tabla otros datos no tiene sentido tenerla por separado del los datos del bien material.

Para poder normalizar, hacen falta ver todos los datos a almacenar y el contexto de uso de los datos para que tengan sentido: sin eso, lo que parece estar bien para por ejemplo 20 campos, puede estar mal para 21, porque ese uno implica una nueva entidad... ahora que muestras más de tu problema, aparecen varias entidades nuevas!!!

Respecto a cómo insertar los datos, o no entiendo la pregunta o es muy obvia: imagina una pantalla para dar de alta un nuevo bien material: aparecerán los datos del bien para ingresarlos en un input de tipo text, pero para los datos relacionados, mostrarás un select para que se elija cada uno, poniendo como value de cada option el ID de registro en su tabla.

El recibir el formulario, vas a tener en $_POST o $_GET lo que escribió el operador y los ID de cada dato relacionado seleccionado en los select. Luego generarás una sentencia INSERT con estos datos, que tendrá la misma forma que tenía la que creaste para el importador de datos, pero esta vez, en vez de haber buscado cada dato relacionado, lo habrás obtenido de lo que ingresó el usuario.

Si tiene dudas sobre cómo generar la pantalla o el INSERT para ingresar un registro en una tabla relacionada, me parece mejor abrir otra pregunta sobre pantallas e INSERTs, ya que esto no tiene que ver con normalización de tablas de bases de datos.

0voto

iphp comentado

D: :( una disculpa Leonardo nos pudimos haber ahorrado un largo camino como dices pero de todas maneras puedo decirte que me sirvió mucho verlo poco a poco, ademas de que sentía que te podía confundir si te aventaba toda la jerga de un solo jalón. Bien ahora que me entiendes mejor, a lo que voy es lo siguiente:

Mi duda es que entonces Bienes_Materiales puede quedarse en una sola tabla con aproximadamente mas de 30 campos??, eso si ya normalizada sin que se repitan datos como en el caso del campo autor, tipo, subtipo y los que me mencionaste, pero sigue teniendo todos esos campos en una sola tabla a la hora de insertar un bien material, por lo que me quedaria algo como insert into bienes_materiales campo1...hasta el 30 y mas.... eso esta bien???

Lo de la inserción me refería a que si aplicara lo de la división de las tablas, como insertaría en cada tabla los datos de un mismo bien, pero no te preocupes si me quedara una sola tabla en inserciones y esas cosas ando bien :), de hecho ya lo hago justo como me lo planteaste :D

Esa es mi gran duda, al parecer no es necesaria la división que hice cierto?, y dejo en paz mi tabla Bienes_Materiales con los campos que sean necesarios siempre y cuando no se repitan??

PD: La tabla id_estado, materia_prima y subtipos ya las había creado tambien :)

Saludos!

0voto

Leonardo-Tadei comentado

Hola iPHP,

si después de haber aplicado al menos las primeras 3 fornas normales la tabla de Bienes Materiales te queda con 30 campos, entonces estará bien. Como te decía, hace falta poder ver todos los campos y comprender qué significa cada uno para vlidarlo.

La cuestión sobre si se repiten o no, no es relevante: en una agenda podés tener varias personas apellidadas "Perez", pero esto no significa que debas pasar los apellidos a otra tabla: la normalización trata más bien de separar entidades que sean independientes unas de otras.

La normalización no es una tarea creativa: si 10 personas aplican las formas normales a los mismos datos, todos obtendrán las mismas tablas. Son reglas que se aplican.

La tabla otros_datos no parece tener justificación, ya que todos esos campos dependen únicamente de la clave primaria de la tabla Bienes Materiales, con lo que las fornas normales dicen que de deben estar en esa tabla.

Me alegro que te haya servido este intercambio.
Saludos cordiales

0voto

jenchi comentado

y como te fue con el script, en donde lo hiciste ya que yo tmb quiero hacer uno pero no se por donde empezar. podrias pasarme un ejemplo y yo adaptarlo

0voto

Leonardo-Tadei comentado

Hola @jenchi,

podrías basarte en el pseudocódigo que pongo al principio de la respuesta y adaptarlo a tus necesidades. La lógica del problema es la misma!

0voto

iphp comentado

Que tal @jenchi como ya lo ha dicho @Leonardo-Tadei, puedes usar el pseudocodigo que me sugirió, o si con eso aun tienes dudas, dime y con gusto te ayudare!

0voto

jenchi comentado

El pseudocodigo si lo entiendo lo que todavia no se como implementarlo, en php o se puede hacer con un script en mysql. por decia y tu tenias un ejemplo ya en codigo.

0voto

iphp comentado

De acuerdo, mira, la sugerencia que me sugirio leonardo me fue útil para utilizar la siguiente sentencia:

SELECT bienes_materiales.id_bien, bienes_materiales.num_inv,bienes_materiales.id_cat bienes_materiales.otro_num, bienes_materiales.tipo_bien, 

bienes_materiales.subtipo_bien, bienes_materiales.titulo, autores.id_autor

Lo que yo necesitaba era migrar los datos que ya tenia en una base de datos al nuevo diseño que hice, la sentencia anterior me une los datos y sustituye los valores del nombre del autor por el id que le corresponde, después creas una tabla con esa misma sentencia y ya tienes todos lo valores en una nueva tabla con los datos correspondientes.

Espero y si sea la misma situación y eso te funcione.

Saludos!

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta