Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Diseño optimo de la base de datos

Estas en el tema de Diseño optimo de la base de datos en el foro de Bases de Datos General en Foros del Web. Sigo dandole vueltas al diseño de la base de datos con la que estoy liado y no estoy seguro de si quedarme con el diseño ...
  #1 (permalink)  
Antiguo 16/01/2013, 05:14
 
Fecha de Ingreso: mayo-2007
Mensajes: 256
Antigüedad: 17 años, 6 meses
Puntos: 3
Diseño optimo de la base de datos

Sigo dandole vueltas al diseño de la base de datos con la que estoy liado y no estoy seguro de si quedarme con el diseño actual que tengo (que esta funcionando bien) :

miembros
id_miembro
nombre
apellidos

relaciones
id_relacion
miembro (referencia a un id_miembro en la tabla miembros)
padre (referencia a un id_miembro en la tabla miembros)
madre (referencia a un id_miembro en la tabla miembros)

o bien crear tres tablas tal que asi:

miembros
id_miembro
nombre
apellidos

parejas
id_pareja
padre (referencia a un id_miembro en la tabla miembros)
madre (referencia a un id_miembro en la tabla miembros)

relaciones
id_relacion
miembro (referencia a un id_miembro en la tabla miembros)
pareja (referencia a una id_pareja)

Por favor ayuda.
  #2 (permalink)  
Antiguo 18/01/2013, 12:44
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Diseño optimo de la base de datos

lo mas facil y entendible es hacerlo con las 3 tablas como mencionas....pero no es lo mas optimo, lo mejor es hacerlo como la primera opcion una tabla de catalogo y otra para armar las relaciones, ya con algo de programacion puedes sacar todo el arbol de padres :)

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 19/01/2013, 04:52
 
Fecha de Ingreso: mayo-2007
Mensajes: 256
Antigüedad: 17 años, 6 meses
Puntos: 3
Respuesta: Diseño optimo de la base de datos

No lo tengo claro. Para mi lo mas facil y entendible era la primera opción con solo dos tablas que de hecho es la primera que hice porque era evidente pero me comentaron que no era un diseño optimo por temas de claves foraneas y demás. Despues de darle muchisimas vueltas se me ocurrio otro diseño que solo consitía en dos tablas:

miembros
id_miembro
nombre
apellidos

relaciones
id_relacion
miembro (referencia a un id_miembro en la tabla miembros)
padremadre (referencia a un id_miembro en la tabla miembros)

Aunque parecia cumplir con el tema de las claves foraneas y demas, resultaba mas complicado para sacar las relaciones.

Finalmente acabé sacando el diseño de tres tablas. Por un lado parace mas optimo a la hora de manejar claves foraneas pero sobre todo me decidi por este diseño porque me permitía trabajar la relacion padres/hijo por un lado y por otro las relaciones de pareja. Así puedo, por ejemplo, añadir mas tarde otros datos sobre la relación de pareja (tipo de pareja, fecha de comienzo de relación y otros detalles) y por otro lado sobre la relacion padres-hijos. El problema básicamente radica en que no es exactamente un arbol genealógico lo que estoy haciendo y por ello, aunque doy prioridad a las lineas de sangre, tambien me interesaría poder añadir parejas sin hijos o quizás incluso adopciones. Es por todo ello que estoy intentando construir el modelo mas versatil posible pero si algo he descubierto sobre el diseño de una base de datos de arbol genealógico es que no es tan sencillo como parece en vista de los intentos de otras personas que he encontrado buscando en google.

Así pues, ahora mismo estoy trabajando con el modelo de tres tablas, pero no me esta complicando mucho las consultas que tenía con el de dos. A pesar de lo cual sigo sin tener claro que sea el mejor metodo posible.

En cualquier consejo o ayuda me viene bien. Gracias.
  #4 (permalink)  
Antiguo 19/01/2013, 09:47
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Diseño optimo de la base de datos

Yo creo que lo mejor que puedes hacer antes de ponerte a armar las tablas, es entender las reglas de negocio del sistema. Es decir: Analizar el sistema.
Si lo meditas lo que tienes es:
- Existen N personas que son miembros de la organización (sea lo que sea esta)
- Cada miembro puede tener cero o muchas relaciones con otros miembros.
- Cada relación es de una cierta categoría: Familiar, Amistad, Social, Comercial.
- Cada relación posee una denominación que la define (hermano/a, cónyuge, socio/a, amigo/a).
- Una la categoría de una relación puede ser considerada como un atributo del tipo.
- Cada relación {A, B}, aunque sea simétricamente idéntica a {B, A}, representa dos relaciones distintas, siendo la primera declarada por A y la segunda por B. Es decir, una relación se expresa desde el punto de vista de uno sólo de los miembros.

Entonces, para hacer un sistema que sea flexible, necesitas cuatro tablas:
Cita:
Miembro(miembro_id, nombre, apellido, direccion, localidad, ...)
TipoRelación(tipo_relacion_id, descripcion_tipo, categoria_rel_id)
CategoriaRelacion(categoria_rel_id, cat_descripcion)
Relacion_Miembros(miembro_id, miembro_id_rel, tipo_relacion_id, ...otros datos adicionales)
Te hago notar algunas cosas:
- No necesitas crear un ID para la relación, porque el ID es una clave compuesta por ambos ID de los miembros.
- Sólo se requiere discriminante (no necesariamente un DI numérico), si hay más de una instancia posible del mismo par de miembros.
- Si un miembro puede declarar más de un tipo de relación con otro, entonces la clave debe ser compuesta por tres campos (miembro_id, miembro_id_rel, tipo_relacion_id).

¿Se entiende?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 21/01/2013, 05:06
 
Fecha de Ingreso: mayo-2007
Mensajes: 256
Antigüedad: 17 años, 6 meses
Puntos: 3
Respuesta: Diseño optimo de la base de datos

La base de datos con la que estoy es algo asi como un arbol genealógico y creo que de categoría y tipo solo necestaria una de ellas. El modelo que me presentas es parecido a uno mas reducido que tuve en cuenta que era así como:

id_miembro
nombre
apellido

id_relacion
miembro (relacionado con id_miembro)
pariente (relacionado con id_miembro)
tipo

De tal manera que para una familia compuesta asi:

01 Miguel Martínez Martin (padre)
02 Lucas Martínez Pérez (hijo)
03 Marta Martínez Pérez (hijo)
04 Juan Martínez Pérez (hijo)
05 María Pérez Ponce (madre)

los datos en la tabla de relaciones quedaba mas o menos asi:

01 1 2 padre
02 1 3 padre
03 1 4 padre
04 1 5 conyuge
05 2 1 hijo
06 2 3 hermano
07 2 4 hermano
08 2 5 hijo

La cosa que yo le veia a este modelo es que me obligaba a decir no solo que, por ejemplo, Lucas es hijo de Miguel y María sino tambien hermano de Marta y de Juan. A su vez esas entradas se repetirian con cada miembro: la relacion de hermanos se volveria a indicar cuando los registros correspondan a Marta y a Juan. Por si fuera poco de Juan y Marta vamos a indicar a su vez que son hijos de los mismos padres (Miguel y Maria) y de Miguel y María vamos a decir que son padres de cada uno de los tres. Una gran redundancia de datos tal como yo lo veo.

Con el modelo que estoy usando (sea el de dos o el de tres) el hecho de que Lucas sea hijo de Miguel y María hace que auntomáticamente cualquier otro hijo de ambos quede definido como hermano (en una consulta para saber los hermanos de Lucas solo tengo que buscar aquellos miembros que tienen los mismos padres). Es más, con las consultas adecuadas puedo establecer relaciones de hermanastros en funcion de si solo tienen uno de los padres en común.

En cuanto a lo de que no necesito una ID cuando las relaciones son únicas efectivamente tienes razón pero me he acostumbrado a trabajar dandole un número id a cada tabla, me resulta mas fácil de ver. Supongo que es una manía mia.
  #6 (permalink)  
Antiguo 21/01/2013, 06:08
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Diseño optimo de la base de datos

Bueno, mi idea es un esquema que apunta hacia redes sociales, no a arboles genealógicos (no debo haber leído correctamente tu problema); en ese sentido tu idea está más cercana a lo que necesitas.
De todos modos, la declaración del tipo de relación y/o su categoría, pueden no ser mandatorios, ya que se los puede perfectamente hacer nulables en cierto caso, o bien hacer lo que se hace normalmente: crear un registro de tipo de relación "No Declarada" o "No definido", que se resuelve en la implementación.
Eso evita problemas de obligatoriedad.

Pero sí veo una posibilidad que te ahorraría necesidades de sistema y en realidad es bastante simple: Una sola tabla.
Siendo que un miembro sólo puede tener un padre y una madre,´y que a partir de este hecho puede definirse todo el resto de los parentescos, lo único que se necesita para cumplir con eso es que la propia tabla Miembros posea dos FK nulables apuntando a si misma.
Nada más.
La lógica es la misma que se aplica para el caso de los empleados de un departamento: Todo empleado tiene un jefe, y el jefe no tiene jefes (es NULL).
Siguiendo ese esquema, todo miembro tiene padres, aunque puede darse que alguno de ellos, o los dos, no se hada indicado, caso en que es NULL. Así, determinar quienes son hermanos es simple: tods aquellos que comparten padre y madre, o al menos uno de ambos. Los primos son aquellos que comparten generacionalmente los están en el nivel anterior a los padres, etc.
Creo que esa sería la solución más simple de todas, y es una solución muy habitual en las bases de datos.

Cita:
En cuanto a lo de que no necesito una ID cuando las relaciones son únicas efectivamente tienes razón pero me he acostumbrado a trabajar dandole un número id a cada tabla, me resulta mas fácil de ver. Supongo que es una manía mia.
Personalmente, te recomiendo que dejes de lado ese método, porque tarde o temprano puede generar problemas. Al crear una ID propia abres la puerta a la posibilidad de que se puedan duplicar los datos en un alta erróneo, porque la PK siempre sería única aunque se produzca la duplicación.
Y si declaras un indice UNIQUE sobre los otros campos... Eso es una CC, entonces ¿qué sentido tendría crear ese ID incremental? Ninguno, sería redundante. Sólo ocuparía espacio.
En general, el uso de ID incrementales es una costumbre de programadores, y no es aconsejable en BBDD que pueden evolucionar, o negocios, ya que tarde o temprano se tienen problemas al consolidar bases de datos o en la administración de backups históricos, por ejemplo.
Es mejor siempre usar lo que propone el modelo E-R: Uno o más atributos propios de la entidad, y sólo recurrir a IDs numéricos (u otros) si llegados a la 3FN aún no se vislumbra una CC.
Pero.. como siempre, es una decisión del desarrollador.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 21/01/2013, 07:29
 
Fecha de Ingreso: mayo-2007
Mensajes: 256
Antigüedad: 17 años, 6 meses
Puntos: 3
Respuesta: Diseño optimo de la base de datos

Verás mi intención original era crear un arbol genealógico pero mas tarde evolucionó a la idea de una web donde se accederia a las fichas de los miembros en las cuales estaría esa información: nombre y apellidos, nombre de los padres, de los hermanos, de los hijos, donde y cuando nació, etc. (Todo esto sin perder de vista la idea de en un futuro tener una opción para generar ese arbol genealógico). Es por ello que enseguida encontré interesante hacerlo con mas de una tabla: por un lado el hecho de encontrarme con matrimonios que no habian tenido hijos y por otro detallar las relaciones de pareja (por ejemplo si estaban casados o no, o la fecha debido a multiples matrimonios) que, aunque esto ultimo a efectos de arbol genealógico por lineas de sangre no tenia ninguna trascendencia, si me permitiera mostrar esos datos en las "fichas".

En cuanto a lo de la ID. Ante todo decir que no entiendo el significado de algunas siglas que usas: CC, ER y 3FN. ¿Para prescindir del ID solo tendría que definir los otros dos campos como únicos? Es decir ¿al establecer como único mas de un campo te permite volver a poner el mismo valor en uno de ellos siempre y cuando la combinación de ambos campos no se este repitiendo?

Gracias por la ayuda.

Etiquetas: diseño, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:40.