Hallo zusammen
Ich bewege mich in letzter Zeit etwas im Kreis. Ich versuche eine möglichst generische Implementation zu finden, um Tabellen abzufragen. Dabei gibt es eine Reihe von Bedingungen, die gelten können (WHERE sowie HAVING) und Gruppierungen, die unter Umständen durchgeführt werden müssen. Können und "unter Umständen" ist bewusst gewählt, denn es gibt praktisch keine 1:1-Abfrage...
Ein konkretes Beispiel:
Ich habe Bestellungen. Bestellungen bestehen aus Artikeln. Jede Bestellung kann zwischen 0 und n Liefereingänge haben und demnach den Status offen, teilgeliefert oder erledigt besitzen. Ein Liefereingang besteht aus Transaktionen, wobei eine Transaktion jeweils die Bewegung eines Artikels repräsentiert.
Die Aufgabe:
Erzeuge eine Liste von Bestellungen, die
- nach Status gefiltert werden kann
- und/oder nach Kunde gefiltert werden kann
- und/oder nach Artikel gefiltert werden kann
Selbstverständlich kann jede Liste noch durchsucht werden und besitzt Pagination bzw. Sortiermöglichkeit. Die Anzahl an Tabelleneinträgen ist als 100'000 anzunehmen. Eine End-/Teilverarbeitung in PHP ist also unmöglich.
Beispielquery:
Die Problematik hierbei ist, dass diese vielen und/oder-Bedingungen die Komplexität des Query extrem erhöhen. Ich möchte so wenig wie möglich duplizierten Code haben und alle Bedingungen sollten kreuzweise ausgeführt werden können. Dabei soll weiterhin das Model generisch sein, denn die Aufgabe tritt mehrfach auf.
Ich möchte die Diskussion möglichst unabhängig von der Technologie haben. Ich verwende in diesem Projekt kein ORM (evt. kennt ihr meine Meinung dazu). Ich benutze jedoch einen Query-Builder (siehe Signatur) um möglichst viel Arbeit in SQL zu erledigen.
Die Frage:
Wie löst ihr solche Aufgaben? Habt ihr eine Vorlage für ein Modell? Kennt ihr irgendwelche Tricks? Mache ich mir das Leben zu schwer oder die Aufgabe zu komplex?
Meine aktuellen Ideen:
Im Moment schwirren mir einige Ideen im Kopf herum:
- Eine möglichst generische Klasse zu erstellen, die mir das Erstellen des Queries nach vordefinierten Schemen vornimmt
- Die Auslösung des Queries in Stufen, ähnlich einem mehrfachen Select (SELECT TOP 30 FROM [nach Status] FROM [nach Menge])
- mehr Kaffepausen einzulegen und Kopf -> Tisch ^^
Ich bewege mich in letzter Zeit etwas im Kreis. Ich versuche eine möglichst generische Implementation zu finden, um Tabellen abzufragen. Dabei gibt es eine Reihe von Bedingungen, die gelten können (WHERE sowie HAVING) und Gruppierungen, die unter Umständen durchgeführt werden müssen. Können und "unter Umständen" ist bewusst gewählt, denn es gibt praktisch keine 1:1-Abfrage...
Ein konkretes Beispiel:
Ich habe Bestellungen. Bestellungen bestehen aus Artikeln. Jede Bestellung kann zwischen 0 und n Liefereingänge haben und demnach den Status offen, teilgeliefert oder erledigt besitzen. Ein Liefereingang besteht aus Transaktionen, wobei eine Transaktion jeweils die Bewegung eines Artikels repräsentiert.
Die Aufgabe:
Erzeuge eine Liste von Bestellungen, die
- nach Status gefiltert werden kann
- und/oder nach Kunde gefiltert werden kann
- und/oder nach Artikel gefiltert werden kann
Selbstverständlich kann jede Liste noch durchsucht werden und besitzt Pagination bzw. Sortiermöglichkeit. Die Anzahl an Tabelleneinträgen ist als 100'000 anzunehmen. Eine End-/Teilverarbeitung in PHP ist also unmöglich.
Beispielquery:
Code:
SELECT o.* FROM order as o LEFT JOIN supply as s LEFT JOIN transaction as t GROUP BY o.order_id HAVING SUM(t.amount) < o.ordered_amount
Ich möchte die Diskussion möglichst unabhängig von der Technologie haben. Ich verwende in diesem Projekt kein ORM (evt. kennt ihr meine Meinung dazu). Ich benutze jedoch einen Query-Builder (siehe Signatur) um möglichst viel Arbeit in SQL zu erledigen.
Die Frage:
Wie löst ihr solche Aufgaben? Habt ihr eine Vorlage für ein Modell? Kennt ihr irgendwelche Tricks? Mache ich mir das Leben zu schwer oder die Aufgabe zu komplex?
Meine aktuellen Ideen:
Im Moment schwirren mir einige Ideen im Kopf herum:
- Eine möglichst generische Klasse zu erstellen, die mir das Erstellen des Queries nach vordefinierten Schemen vornimmt
- Die Auslösung des Queries in Stufen, ähnlich einem mehrfachen Select (SELECT TOP 30 FROM [nach Status] FROM [nach Menge])
- mehr Kaffepausen einzulegen und Kopf -> Tisch ^^
Kommentar