Ver Mensaje Individual
  #4 (permalink)  
Antiguo 05/03/2010, 15:13
Avatar de maturano
maturano
 
Fecha de Ingreso: enero-2010
Ubicación: /home/
Mensajes: 537
Antigüedad: 14 años, 3 meses
Puntos: 36
Respuesta: Ayuda con query con tres tablas relacionadas

Cita:
Iniciado por gnzsoloyo Ver Mensaje
- La tabla que guarda las fechas no queda claro si se relaciona con la segunda o no. Lo que es seguro es que no está vinculada directamente con las entidades.
Sí está relacionada. La segunda tabla, que llamé tabla_especifica, es como un puente que relaciona a tabla_general con --en este caso-- dos entidades.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
* Si la primera tabla y la segunda comparten PK, y una de ellas es FK de la otra, hacer una tabla para guardar un sólo atributo del que poseen una relación 1:1 no tiene sentido.
Lo sé , pero este es un caso muy simplificado. En realidad hay más situaciones específicas con información particular para cada una. Se tiene una tabla para cada caso.

Solo para que lo puedas ver mejor, digamos que a la par de tabla_especifica, también tengo otra tabla como sigue:
Código:
tabla_especifica:
  columna   |   Descripción
------------+---------------------------------------------------
id_registro | Clave foránea. El dato es el mismo que estaría en tabla_generica
id_entidad1 | Clave foránea a los datos de una primer entidad
id_entidad2 | Clave foránea a los datos de una segunda entidad
algun_dato  | Particular para este determinado caso.

tabla_especifica2:
   columna      |   Descripción
----------------+---------------------------------------------------
id_registro     | Clave foránea. El dato es el mismo que estaría en tabla_generica
id_entidad      | Quizá este caso solo tiene una entidad
algun_otro_dato | Muy particular para este caso
....
... y otro campo en tabla_generica para saber qué tipo de caso específico es.Entonces, con datos, podemos tener algo como:

Código:
tabla_generica
id_registro |  fecha     | tipo_caso
------------+------------+------------
     1      | 2010/03/04 | caso_especifico
     2      | 2010/03/04 | caso_especifico
     3      | 2010/03/04 | caso_especifico_2
     4      | 2010/03/04 | caso_especifico
     5      | 2010/03/05 | caso_especifico_2
     6      | 2010/03/05 | caso_especifico_2
     7      | 2010/03/05 | caso_especifico
     8      | 2010/03/05 | caso_especifico_2
     9      | 2010/03/05 | caso_especifico
    10      | 2010/03/05 | caso_especifico

tabla_especifica
id_registro | id_entidad1 | id_entidad2 | algun_dato
------------+-------------+-------------+-----------
     1      |     1       |      2      | xxxxxxxxxx
     2      |     3       |      4      | xxxxxxxxxx
     4      |     6       |      7      | xxxxxxxxxx
     7      |    10       |     11      | xxxxxxxxxx
     9      |    13       |     14      | xxxxxxxxxx
    10      |    15       |     16      | xxxxxxxxxx

tabla_especifica2
id_registro | id_entidad | algun_otro_dato
------------+------------+-----------------
     3      |       5    | yyyyyyyyyy
     5      |       8    | yyyyyyyyyy
     6      |       9    | yyyyyyyyyy
     8      |      12    | yyyyyyyyyy

tabla_entidad
id_entidad  | tipo 
------------+-------
     1      |   A
     2      |   B
     3      |   C
     4      |   C
     5      |   C
     6      |   B
     7      |   B
     8      |   A
     9      |   B
    10      |   C
    11      |   A
    12      |   C
    13      |   B
    14      |   C
    15      |   B
    16      |   B 
La base no la diseñé yo, pero creo está bien diseñada. Espero con esta información tenga más lógica en cuanto a su razón de ser.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
* Si no es FK, no hay forma de vincular la fecha con las entidades.
tabla_generica y tabla_entidad tienen sus propias pks, tabla_especifica comparte pk con tabla_generica y tiene fks hacia tabla_entidad. A menos que me equivoque, pero así lo entiendo. La descripción de la tabla me dice que:
Código:
tabla_generica
    Índices:
        «pk_registro» PRIMARY KEY, btree (id_registro)

tabla_especifica
    Índices:
        «especifico_pkey» PRIMARY KEY, btree (id_registro)
        «fki_reg_ida» btree (id_registro)
    Restricciones de llave foránea:
        «fk_reg_ida» FOREIGN KEY (id_registro) REFERENCES tabla_generica(id_registro) ON UPDATE CASCADE ON DELETE RESTRICT
        «fk_reg_identidad1» FOREIGN KEY (id_entidad1) REFERENCES tabla_entidad(id_entidad) ON UPDATE CASCADE ON DELETE RESTRICT
        «fk_reg_identidad2» FOREIGN KEY (id_entidad2) REFERENCES tabla_entidad(id_entidad) ON UPDATE CASCADE ON DELETE RESTRICT

tabla_entidad
    Índices:
        «pk_entidad» PRIMARY KEY, btree (id_entidad)

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Tip: Si estás poniendo una representación genérica, no sirve para tu caso, porque lo que requieres es una consulta específica.

Postea estructuras más cercanas al modelo real, y con nombres verdaderamente representativos de lo que son, porque el ejemplo no es funcional para tu pregunta.
Hay muchas más tablas en la base de datos y las columnas de las tablas tienen algunos nombres desafortunados (en eso sí creo hubo un mal diseño, con abreviaciones y a la vez nombres largos; ejemplo: fk_fecha_reg_sndx_nombre. Lo que intento hacer es plantear una representación simplificada para una consulta específica, creo colocar más información solo causaría ruido innecesario, la pregunta que quiero responder es simple: ¿Cuántos casos específicos hubo para X fecha donde las entidades son del mismo tipo?.

Según los datos de ejemplo que coloco, la respuesta sería:
- 2 para el 04/03/2010
- 1 para el 05/03/2010


Cita:
Iniciado por huesos52 Ver Mensaje
Maturano No logro interpretar bien el ejemplo que pones al tener dos fechas iguales.
La fecha fue igual intencionalmente para que se vea que el enfoque es hacia el tipo de entidad.

Entidades y registros (las tablas donde se aplican las condiciones) están relacionadas por medio de otra tabla.

Tristemente me he dado cuenta que no sé como hacer esta consulta. Espero igual les parezca un ejercicio interesante
__________________
I ♥ The Music!

Última edición por maturano; 05/03/2010 a las 15:22