srob: diffiziles SELECT

Beitrag lesen

Tja, um es mal kurz zu machen: ich habe eine Datenstruktur mit zwei Tabellen, eine Tabelle
'documents' und eine Tabelle 'attributes'. Die Dokumenten-Tabelle hat zwei Felder: 'id' und
'type'. Die 'attributes'-Tabelle hatt die Felder 'id' (vererbt von documents(id)), 'name' und
'data'. Zwischen 'documents' und 'attributes' ist eine 1:n-Beziehung: jedem Dokument koennen n
Attribute zugeordnet werden. Ich weiss, dass das nicht die beste Datenstruktur ist, aber fuer
die Daten, die ich bekomme (naemlich wirklich sehr generische Daten) die einzige Moeglichkeit.

Bis hierher hört sich das nach einer normalen 1:n-Beziehung an - warum nicht die beste Datenstruktur? Was sind "sehr generische" Daten?

Nun habe ich das Problem, dass ich alle 'attributes'-Eintraege zu einem 'documents'-Eintrag
haben moechte, bei dem ein 'attributes'-Eintrag einen bestimmten Wert hat. Konkreter: es sind
unter anderem User-Daten in dieser Struktur gespeichert. Ich moechte jetzt einen bestimmten
User heraussuchen, mit allen Attributen.

Ist das so richtig verstanden:

documents            attributes
---------            ----------
 id         ---->>    id
 type                 name
                      data

Du willst zu einer doc.id _alle_ n zugehörigen att-Sätze, und zwar jene doc.id, die auf der n-Seite ein Feld mit einem bestimmten Inhalt aufweist? Hört sich nach Subselect an; da das in Deiner MySQL-Version ausscheidet, sehe ich als einzige Alternative zu Deinem Ansatz einen zweistufigen SELECT. Da MySQL auch für SELECTs in Tabellen zu impotent ist, könntest Du mit einem SELECT INTO OUTFILE aus attributes die Sätze heraussuchen, welche Deinem Kriterium entsprechen, dann mit LOAD DATA das Ergebnis in eine Tabelle laden und in einem zweiten SELECT das Endergebnis aufbauen.

Sehr holprig - aber wenn auf der n-Seite nur wenige Sätze Deinem Kriterium entsprechen, könnte es bei sehr großen Tabellen performanter und ressourcenschonender sein als Dein (beinahe) doppeltes Kreuzprodukt.

HTH Robert