2016-05-25 2 views
0

Ich versuche, Vererbung mit separaten Tabellen wie folgt umzusetzen:Vererbung mit separaten Tabellen und LEFT JOIN: Wie wissen, welche Unterklasse der Datensatz gehört zu

Animal (id, name, age) 
Cat (id_animal, other fields related to cats) 
Dog (id_animal, other fields related to dogs) 

wo id_animal Referenzen animal.id.

Ich frage mich, was ist der beste Weg, um alle Daten über einen Datensatz angesichts seiner id bekommen. Für jetzt habe ich diese Anfrage:

SELECT * FROM animal 
LEFT JOIN cat ON cat.id_animal = animal.id 
LEFT JOIN dog ON dog.id_animal = animal.id 
WHERE animal.id = 5 

ich alle Daten bekommen ich brauche ... aber ich weiß nicht, ob das Tier 5 eine Katze oder ein Hund ist. Tatsächlich habe ich mehrere geerbte Tabellen mit den gleichen Attributen für den Moment und so kann ich den Typ des Tieres nicht erhalten, indem ich die Nullspalten in der Antwort prüfte.

Ich befürchte auch, dass all diese JOINs meine Anwendung verlangsamen werden.

Was ist die beste Lösung?

  1. hinzufügen type Spalt in Animal (und vielleicht auch die Art mit einem ersten SELECT erhalten und die Unterklasse-bezogenen Felder mit einer anderen SELECT auf der entsprechenden Untertabelle bekommen?)
  2. anderen

Danke !

+0

Ich bin nicht sicher, warum Sie das tun möchten, aber als eine intellektuelle Übung ... Ihre "fügen Sie eine Spalte Typ" klingt die Art, wie ich damit umgehen würde; obwohl ich eine "type" -Tabelle mit einem Feld hinzufügen könnte, das angibt, welche Tabelle die zusätzlichen Details für diesen Typ enthält. – Uueerdo

Antwort

0

Meiner Meinung nach ist Ihre Abfrage in Ordnung, und es wird nicht super langsam sein (wenn man bedenkt, dass Sie den Index hinzugefügt haben und Sie nicht wirklich eine super große Tabelle haben). "Type" kann auf folgende Weise generiert werden. Sie müssen keine Spalte dafür haben.

SELECT *, 
    IF(cat.id_animal IS NOT NULL, 'CAT', IF(dog.id_animal IS NOT NULL, 'DOG', 'NEITHER')) 
FROM animal 
LEFT JOIN cat ON cat.id_animal = animal.id 
LEFT JOIN dog ON dog.id_animal = animal.id 
WHERE animal.id = 5 

Im Moment wird die Ergebnistabelle ziemlich viele NULL-Einträge haben. Eine andere Möglichkeit, die Sie wie folgt tun könnten:

SELECT animal.*, 'CAT' type, concat(cat.col1, cat.col2, ...) detail 
FROM animal 
JOIN cat ON cat.id_animal = animal.id 
WHERE animal.id = 5 
UNION 
SELECT animal.*, 'DOG' type, concat(dog.col1, dog.col2, ...) detail 
FROM animal 
JOIN dog ON dog.id_animal = animal.id 
WHERE animal.id = 5 
+1

Danke, Tin! –