Frage

Ich habe eine Datenbank mit zwei Tabellen - nennen wir sie Foo und Bar. Jede foo kann auf eine beliebige Anzahl von Stangen in Beziehung gesetzt werden, und jeder Balken kann auf eine beliebige Anzahl von foos bezogen werden. Ich möchte in der Lage sein zu holen, mit einer Abfrage, die Foos, die mit einer bestimmten Bar verbunden sind, und die Balken, die mit einem bestimmt foo verbunden sind.

Meine Frage ist, was ist der beste Weg, um diese Beziehungen von der Aufnahme? Sollte ich eine separate Tabelle mit Datensätzen jeder Beziehung (zum Beispiel zwei Spalten, foo und bar)? Sollte die foo Tabelle für eine Liste von Bars, die eine Spalte hat, und umgekehrt? Gibt es eine andere Möglichkeit, dass ich mit Blick auf?

War es hilfreich?

Lösung

genannt, das ist eine many-to-many-Beziehung. Die „Standard“ -Lösung ist eine dritte Tabelle mit dem Primärschlüssel aus jeder Tabelle in jeder Reihe aufzustellen, wo es eine Beziehung.

Die dritte Tabelle ist eine Verknüpfungstabelle bezeichnet. "Junction-Tabelle" aus Wikipedia: http://en.wikipedia.org/wiki/Junction_table

Als Beispiel:

Foo
UID
Col1
Col2

Bar
UID
Col1
Col2

Foo_Bar
UID
Foo_UID
Bar_UID

Also, in den oben genannten, könnte es viele foos und viele Bars sein. Jede foo, die an einer Bar und jeder Stab bezieht, die auf eine foo bezieht würde existieren in der Tabelle foo_bar. Um alle foos zu erhalten, die zu einem bestimmten Takt beziehen, können Sie die folgende SQL verwenden:

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

(Habe keine genauen Duplikate dieser Frage finden, aber die folgenden Fragen erweitern zum Thema.)

Viele zu viele Tabellen-Design Frage
viele zu viele Beziehungen Entwurf - Überschneidung Table Design

Andere Tipps

Es ist in der Tat ein vieles zu viel Beziehung Schiff. Neben Michaels Antwort, wollte ich die folgenden als zusätzliche Ressource zur Verfügung zu stellen. Ich habe zu viele schlechte Implementierung Datenbank gesehen nicht diese bis zu bringen (nicht nur für Sie, sondern auch andere, die dies in der Zukunft sehen könnte)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top