none
Relación a una misma tabla más de una vez RRS feed

  • Pregunta

  • Estimados miembros del foro, perdonen si mi pregunta es un tanto de principiante.

    Deseo si me ayudan a comprender cual sería la mejor forma de relacionar tres campos a una misma tabla. me explico:

    Tengo varias tablas maestras, a las que llamo desde una tabla principal, haciendo relación a la clave primaria de cada una de ellas. entre dichas tablas maestras tengo por mencionar dos de ellas la tabla COLONIA (Id, NombreColonia) y CALLE (Id, NombreCalle).

    Sin embargo, en la tabla principal tengo entre otros campos, Colonia (FK a tabla colonia), Calle principal (FK tabla Calle), EntreCalle (?), y EntreCalle (?).

    De manera muy ´fácil se pueden crear las tres claves foráneas a la misma tabla CALLE. sin embargo, mi pregunta sería si a la hora de hacer el INNER JOIN, me muestre los campos con nombre distinto, aunque éstos hagan referencia a misma tabla. por ejemplo, me gustaría que la consulta arroje: Colonia, Calle, EntreCalle1, EntreCalle2. reitero, éstos últimos campos relacionados a una misma tabla.

    Lo anterior sería más que nada para evitar la creación de tres tablas con nombres distintos y registros iguales.

    Agradezco quien se tome tiempo en responder a mi consulta.

    Saludos

    martes, 5 de septiembre de 2017 15:33

Respuestas

  • Buenas compañero, 

    eso que planteas es posible sin ningun problema

    select col.NombreColonia, cal.NombreCalle, fent.NombreCalle, sent.NombreCalle from TablaPrincipal as t inner join Calle as cal on cal.id = t.calle inner join Calle as fent on fent.id = t.EntreCalle1 inner join Calle as sent on sent.id = t.EntreCalle2 

    En el caso de haber problemas de performance, otra opción seria evaluar el uso de unión para unir varias querys en un solo select.

    no comentas que tal te ha ido

    Atte


    No olvides votar si mi comentario te ha ayudado y marcarlo como respuesta si ha sido la solución!


    • Editado Jorge TurradoMVP martes, 5 de septiembre de 2017 16:24
    • Propuesto como respuesta Willams Morales martes, 5 de septiembre de 2017 18:40
    • Marcado como respuesta JCamaleon88 miércoles, 6 de septiembre de 2017 19:14
    martes, 5 de septiembre de 2017 16:24
  • Pienso que para registrar un evento del tipo que mencionas guardar referencias de las calles (FK) podría no ser exacto respecto a la localización donde ocurrió un hecho, reitero en recomendarte registrar un punto, que podría ser referencial, de la superficie terrestre donde aconteció el suceso -expresado en valores de latitud y longitud- que podrías almacenar en una columna de base de datos bajo el tipo GEOGRAPHY. De hecho, almacenar una localización geográfica te permitirá resolver varias dudas como las ubicaciones donde se producen mas incidentes o incidentes producidos en un radio de "n" metros/kilometros respecto a una localización, etc.

    Consultar datos espaciales para el vecino más próximo

    Google Maps, JQuery y ASP.NET ejemplo práctico de este Mix

    Si por el contrario no precisas de exactitud y por el momento te basta guardar las referencias de las calles mediante dos relaciones entonces continúa como lo vienes haciendo, tener mas de una columna que almacene la referencia a la clave primaria de una misma tabla no es un diseño incorrecto, mucho menos se trata de una práctica obsoleta o inadecuada, muy por el contrario es bastante común ver una tabla "parent" con mas de una referencia a una tabla "child".


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    • Propuesto como respuesta Jorge TurradoMVP miércoles, 6 de septiembre de 2017 17:41
    • Marcado como respuesta JCamaleon88 miércoles, 6 de septiembre de 2017 19:16
    miércoles, 6 de septiembre de 2017 17:39

Todas las respuestas

  • Buenas compañero, 

    eso que planteas es posible sin ningun problema

    select col.NombreColonia, cal.NombreCalle, fent.NombreCalle, sent.NombreCalle from TablaPrincipal as t inner join Calle as cal on cal.id = t.calle inner join Calle as fent on fent.id = t.EntreCalle1 inner join Calle as sent on sent.id = t.EntreCalle2 

    En el caso de haber problemas de performance, otra opción seria evaluar el uso de unión para unir varias querys en un solo select.

    no comentas que tal te ha ido

    Atte


    No olvides votar si mi comentario te ha ayudado y marcarlo como respuesta si ha sido la solución!


    • Editado Jorge TurradoMVP martes, 5 de septiembre de 2017 16:24
    • Propuesto como respuesta Willams Morales martes, 5 de septiembre de 2017 18:40
    • Marcado como respuesta JCamaleon88 miércoles, 6 de septiembre de 2017 19:14
    martes, 5 de septiembre de 2017 16:24
  • Hola:

     ¿Creas una tabla para almacenar las calles?, si es así, esto no lo veo correcto, a lo mucho en la tabla que mencionas como principal deberías de tener una relación del tipo Fk a la tabla "Colonias" y un campo Dirección en donde coloras todos los valores de dirección como Calle y numero, y otro campo para "Referencias" que serian las entre calles o alguna otra referencia. Los nombres de las calles siempre se van a repetir o incluso pueden cambiar por una letra o colonia, no deberías tener una tabla para Calles, lo veo innecesario.


    Saludos desde Monterrey, Nuevo León, México!!!

    • Propuesto como respuesta Pedro Ávila martes, 5 de septiembre de 2017 18:42
    martes, 5 de septiembre de 2017 18:07
  • Si, si es relevante tener asociado las calles localizadas en una colonia -y la misma a una dirección- es correcto tener la relación. Respecto a las dos relaciones de referencia tengo mis dudas, quizá solo baste un campo de referencia o un punto de geolocalización, depende de las especificaciones que tengas a mano del caso.

    De ser necesario tener el identificador de las calles de referencia toma en cuenta lo propuesto por Jorge, es válido referirse a una misma tabla a razón de columnas distintas, de hecho lo puedes hacer con la misma columna, y según la opcionalidad de las columnas de referencia (NULL/NOT NULL) usa INNER JOIN o LEFT JOIN según corresponda. Si el caso presupone que puedan ser una o mas de una calle de referencia considera mover las columnas a una tabla de unión que cubra el caso de una dirección con "n" calles de cruce o referencia, yo insistiría en tener la referencia como coordenadas geográficas (latitud, longitud).


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    martes, 5 de septiembre de 2017 18:40
  • Hola

    Tengo varias tablas maestras, a las que llamo desde una tabla principal, haciendo relación a la clave primaria de cada una de ellas. entre dichas tablas maestras

    Es una técnica muy antigua, obsoleta, hoy en día no se usa, e visto fracasar ese tipo de diseños de base de datos en negocios grandes, lo que necesitas es algo tan simple como esto.

    Ojo: No tomes como ejemplo esa técnica obsoleta para diseñar tu solución de negocio, si estas diseñando una solución de negocio usa técnica actuales, como es relacionar las tablas para así tener integridad referencial.

    Si tienes una entidad Ciudad la cual se relaciona con la entidad Colonia, la entidad Ciudad va a consumir información de la entidad Colonia.

    Revisa este enlace Integridad de los datos

    Saludos


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú






    • Editado Pedro Ávila martes, 5 de septiembre de 2017 19:30
    martes, 5 de septiembre de 2017 19:12
  • Buen día amigos,

    Muy agradecido con todos sus comentarios, cada uno de ellos es muy valioso para mi.

    Analizaré detenidamente cada una de las respuestas y veré qué desición tomar.

    Les comento un poco sobre el proyecto en sí, por si tienen una idea más al respecto qué brindar.

    La base de datos almacenará denuncias o reportes, mismas que estarán ligadas a una persona y una ubicación física, como lo es la calle principal, y como referencia las calles que encierran a dicha ubicación (sin especificar número de domicilio).

    La tabla de calles se relaciona con la de colonias para de éste modo filtrar únicamente las calles que pertenecen a la colonia seleccionada en un desplegable (ASP.net).

    Al dar de alta un nuevo reporte, se verificará si ya existe uno guaardado en misma ubicación, y de ser así, solo se agregará el registro de la nueva persona que realiza al reporte ciudadano. Es decir, a un reporte ya guardado, se agregarán los nombres de las personas que han hecho la misma denuncia en misma ubicación física.

    Por ahí me propuso un compañero de escuela olvidarme de las calles guardadas en una tabla (como ya el compañero me propuso aquí), y en su lugar hacer algo más interactivo de la mano de google maps. pero al ser principiante, temo no lograr el objetivo.

    En sí eso es, nuevamente gracias por su tiempo y si alguien desea dar una crítica o idea más que aportar, es de agradecer.

    Saludos para todos.

    miércoles, 6 de septiembre de 2017 14:12
  • Pienso que para registrar un evento del tipo que mencionas guardar referencias de las calles (FK) podría no ser exacto respecto a la localización donde ocurrió un hecho, reitero en recomendarte registrar un punto, que podría ser referencial, de la superficie terrestre donde aconteció el suceso -expresado en valores de latitud y longitud- que podrías almacenar en una columna de base de datos bajo el tipo GEOGRAPHY. De hecho, almacenar una localización geográfica te permitirá resolver varias dudas como las ubicaciones donde se producen mas incidentes o incidentes producidos en un radio de "n" metros/kilometros respecto a una localización, etc.

    Consultar datos espaciales para el vecino más próximo

    Google Maps, JQuery y ASP.NET ejemplo práctico de este Mix

    Si por el contrario no precisas de exactitud y por el momento te basta guardar las referencias de las calles mediante dos relaciones entonces continúa como lo vienes haciendo, tener mas de una columna que almacene la referencia a la clave primaria de una misma tabla no es un diseño incorrecto, mucho menos se trata de una práctica obsoleta o inadecuada, muy por el contrario es bastante común ver una tabla "parent" con mas de una referencia a una tabla "child".


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    • Propuesto como respuesta Jorge TurradoMVP miércoles, 6 de septiembre de 2017 17:41
    • Marcado como respuesta JCamaleon88 miércoles, 6 de septiembre de 2017 19:16
    miércoles, 6 de septiembre de 2017 17:39