Pregunta

Tengo una base de datos con dos tablas - llamémosles Foo y Bar. Cada foo puede estar relacionada con cualquier número de barras, y cada barra puede estar relacionada con cualquier número de Foos. Quiero ser capaz de recuperar, con una consulta, los Foos que están asociados con un cierto bar, y las barras que están asociados con un cierto foo.

Mi pregunta es, ¿cuál es la mejor manera de registrar estas relaciones? Debería tener una tabla separada con registros de cada relación (por ejemplo, dos columnas, foo y bar)? En caso de que la tabla foo tener una columna de una lista de bares, y viceversa? ¿Hay otra opción que estoy pasando por alto?

¿Fue útil?

Solución

Eso se llama una relación de muchos a muchos. La solución "estándar" es la creación de una tercera tabla, con la clave primaria de cada tabla en cada fila en la que existe una relación.

La tercera tabla se denomina tabla de unión. "Tabla de unión" de Wikipedia: http://en.wikipedia.org/wiki/Junction_table

A modo de ejemplo:

Foo
UID
Col1
Col2

Bar
UID
Col1
Col2

Foo_Bar
UID
Foo_UID
Bar_UID

Por lo tanto, en lo anterior, podría haber muchas Foos y muchos bares. Cada foo que se refiere a un bar y cada barra que se refiere a un foo existirían en la tabla foo_bar. Para obtener todos los Foos que se relacionan con una barra dada, podría utilizar el siguiente código SQL:

select *
from foo
where uid in (
    select foo_uid
    from foo_bar
    where bar_uid=<some bar uid>)

(No se encontró ninguna duplicados exactos de esta pregunta, pero las siguientes preguntas se expanden sobre el tema.)

Muchos a muchos pregunta de diseño mesa
muchos a muchos Diseño Relación - Intersección tabla de diseño

Otros consejos

De hecho, es una de muchos a muchos relación de buques. Además de la respuesta de Michael, que quería dar el siguiente recurso adicional. He visto demasiados deficiente aplicación de base de datos para no hablar de esto (no sólo para usted, pero sí que puede ver esto en el futuro)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top