Frage

Dies ist eine SQL-Design Frage. Zuerst wird das Setup. Ich habe drei Tabellen:

  1. A, die basierend auf einer Abfrage für einen Verbindungsserver automatisch aufgefüllt wird. Die Daten in dieser Tabelle können nicht geändert werden;
  2. B, die nur ein Dutzend oder so Zeilen haben, die Namen für Sammlungen von A enthält;
  3. AtoB, die die Zuordnungstabelle ist, durch die A werden in benannte Sammlungen organisiert, mit Fremdschlüssel auf beiden Spalten;

SQL-Mapping-Tabelle

Zum Beispiel A enthält:

  1. Giraffe
  2. Owl
  3. Tiger

Und B enthält:

  1. Seattle Zoo
  2. San Jose Zoo

Und AtoB enthält:

1,1 (Giraffe in Seattle)
 2,1 (Owl in Seattle)
 3,1 (Tiger in Seattle)
 2,2 (Owl in San Jose)

Nun das Problem:

Ich bin gebeten worden, in einigen dieser Sammlungen Elemente enthalten nicht in A. So fand, erstelle ich eine Tabelle, C, mit der gleichen Identität und Namen Spalten als A, und es füllen. Im Einklang mit dem früheren Beispiel, sagen wir, C enthält:

  1. Dragon

Die Frage ist, wie füge ich Elemente aus C in AtoB? Was passiert, wenn ich brauche einen Drachen im Seattle Zoo schließen?

Mein erster Instinkt, naiv, war eine Ansicht V die Vereinigung von A und C enthält, zu erstellen und zu modifizieren AtoB VTÖB zu sein. Das ist, wo meine Naivität ausgezahlt: man kann nicht einen Fremdschlüssel zu einer Ansicht erstellen.

Ich vermute, dass es ein Standard, richtige Mittel in Beziehung eines oder mehrere A oder C mit einem B

War es hilfreich?

Lösung

Um auf Arthur Thomas-Lösung zu erweitern hier ein union ohne die WHERE in dem Subselects so dass Sie eine Universal-Ansicht erstellen:

SELECT A.Name as Animal, B.Name as Zoo FROM A, AtoB, B
    WHERE AtoB.A_ID = A.ID && B.ID = AtoB.B_ID 
UNION
SELECT C.Name as Animal, B.Name as Zoo FROM C, CtoB, B
    WHERE CtoB.C_ID = C.ID && B.ID = CtoB.B_ID

Dann können Sie eine Abfrage wie ausführen:

SELECT Animal FROM zoo_animals WHERE Zoo="Seattle Zoo"

Andere Tipps

Wenn Sie nicht einen Drachen in A setzen können, dann müssen Sie eine andere Tabelle und eine andere Link-Tabelle erstellen. Das Problem ist eine einzigartige Reihe von Daten zu schaffen, die (eine andere Tabelle) gespeichert werden muss, die nicht die gleiche Gruppe wie A sein kann, da es nicht der gleiche Satz ist, dann können Sie nicht mehr die Verknüpfungstabelle verwenden (AtoB), die ausländische hat Tasten, die dafür sorgen, dass der Link eine Referenz aus der Serie a ist so dass Sie eine Tabellen wie diese schaffen könnten:

imaginary_creatures

  • id
  • name

imaginary_creatures_to_b

  • imaginary_creatures_id (Link auf imaginary_creatures Tabelle)
  • b_id (Link zu Zoo Tabelle)

Später, wenn Sie alle Kreaturen in einem Zoo bekommen Sie eine UNION tun können,

SELECT A.Name FROM A where A.ID IN 
   (SELECT AB.A_ID FROM AtoB AB WHERE B_ID = 
      (SELECT B.ID FROM B WHERE B.Name = 'Zoo Name'))
UNION
SELECT i.name FROM imaginary_creatures i i.id IN 
   (SELECT ic.imaginary_creatures_id FROM imaginary_creatures_to_c ic 
    WHERE ic.b_id = (SELECT B.ID FROM B WHERE B.Name = 'Zoo Name'))

Es kann eine bessere Art und Weise, dass zu schreiben, aber es sollte für Ihre Zwecke arbeiten.

Arthur Thomas eine gute Lösung hat, die andere mögliche Lösung ist, um eine Spalte zu der Verknüpfungstabelle hinzuzufügen, die angibt, welche Tabelle (A oder C) es ist verwandt. Dann erzwingen die Beziehungen durch Trigger anstatt Fremdschlüssel. Aber wirklich Arthur-Lösung ist der bevorzugte Weg, um diese Art der Sache zu tun.

Was möchten Sie ist zu tun, setzen Drachen in A, und wenn Sie alle Datensätze von A unabhängig davon auswählen möchten, wenn sie einen passenden Datensatz in AtoB haben, trete ein LEFT OUTER. So etwas wie folgt aus:

SELECT * FROM A
LEFT OUTER JOIN AtoB
ON A.id = AtoB.A_ID

Edit: Dies würde nur funktionieren, wenn Sie Ihren neuen Datensätze A. hinzufügen könnten verpasst mir die Tatsache, dass Sie nicht in der Lage sind. Ich denke, Arthur Thomas-Lösung ist das, was Sie wollen.

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