MySQL Abfragen über PHP
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anzahl
arbeiten
ausgabe
auslagerung
beispiel
bestellung
datenbank
datum
erstellen
fehler
funktionieren
kunde
kundennummer
not
null
problem
session
tabelle
url
vermerken
-
Ich arbeite seit einiger Zeit an einem Projekt bei dem ich auf mehrere Tabellen in einer Datenbank zurückgreifen und diese über php ausgeben muss. Dabei besteht das eigentliche Problem darin, dass meherere Tabellen miteinander verknüpft ausgegeben werden müssen. Hierbei resultieren meistens sehr merkwürdige Ausgaben und fehlerhafte Berechnungen der in den einzelnen Tabellen vorliegenden Daten.
Ein weiteres Problem ergibt sich aufgrund der Größe der Tabellen mit mehreren tausend Einträgen. Dadurch verlängert sich die Verarbeitungszeit. Hinzu kommen noch die Berechnungen, die nachträglich in PHP vorgenommen werden. Insgesamt verzögert sich die Ausgabe sehr merkbar.
Meine Frage an euch ist zunächst einmal, ob eine Auslagerung der für die jeweilige Sitzung relevanten Daten in eine temporäre Tabelle für das o.g. Projekt sinnvol ist und wie das umgesetzt werden sollte. Es sollte aber weiterhin die Möglichkeit bestehen, die Daten zu bearbeiten (über PHP) und in den entsprechenden Tabellen abzuspeichern und auch in "Realtime" angezeigt zu bekommen.
Würde mich über eure Anregungen und Denkanstöße sehr freuen. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Mittels einer 1:n Tabelle kannst du ja einzelne Tabellen mit einander verknüpfen. Mit php solltest du dann die Einträge auslesen und dann via. Textfelder oder so sortieren.. Ist wohl oder übel viel Arbeit aber ich denke das wirst du schon schaffen (;
Mein Denkansatz wäre jetzt eben ein Formular zu erstellen, indem du die Daten dann anzeigen lässt, die kannst du dann nach belieben Editieren und so abspeichern.. Das gleiche Prinzip also, wie bei jeder Profil- Bearbeitung oder ähnlichem. -
@kill-a-teddy:
Wahrscheinlich habe ich mich ein wenig missverständlich ausgedrückt. Das von dir beschriebene habe ich schon umgestezt. Nur besteht das Problem bei den nicht nachvollziehbaren Berechnungen und der verzögerten Ausgabe der benötigten Daten. Deswegen habe ich um einen Rat gebeten, ob es Sinnvoll ist eine temporäre Tabelle anzulegen und wie das ggf. umgesetzt werden kann. -
mavi schrieb:
@kill-a-teddy:
Wahrscheinlich habe ich mich ein wenig missverständlich ausgedrückt. Das von dir beschriebene habe ich schon umgestezt. Nur besteht das Problem bei den nicht nachvollziehbaren Berechnungen und der verzögerten Ausgabe der benötigten Daten. Deswegen habe ich um einen Rat gebeten, ob es Sinnvoll ist eine temporäre Tabelle anzulegen und wie das ggf. umgesetzt werden kann.
Okay, sorry!
Also es ist grundsätzlich möglich eine temporäre Tabelle zu erstellen
$sql ="CREATE TEMPORARY TABLE temp( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY , Mid VARCHAR( 20 ) NOT NULL , jahr VARCHAR( 20 ) NOT NULL , quartal VARCHAR( 20 ) NOT NULL , anzahl VARCHAR( 20 ) NOT NULL ) ";
So als Beispiel. Das würde die Ausgabe aber nur in dem Sinne verzögern, wenn du die Tabelle erstellst bevor die Seite geladen wird, also am besten in einer seperaten php datei, die mit dem index verlinkt ist. -
Vielen Dank für das Beispiel.
Aber wie kann ich aus mehreren bereits existierenden Tabellen eine temporäre Tabelle erzeugen?
Derzeit werden die Tabellen über entsprechende ID's miteinander verknüpft ausgegeben. Nur resultieren unerwartete falsche Berechnungen bzw. Werte aus dieser Verknüpfung. Ich vermute, dass dies daran liegen kann, weil ich mehrere Tabellen (also mehr als 2 Tabellen) miteinander verknüpfe.
Dieses Problem erhoffe ich mir durch den Einsatz von temporären Tabellen zu lösen. Wenn ich in diesem Gedanken falsch liegen sollte bitte ich um eine Lösungsmöglichkeit. So könnte ich schrittweise die Tabellen miteinander verknüpfen und in temporären Tabellen die relevanten Daten ausgeben lassen. Könnte das so funktionieren? -
Ich vermute eher, dass dein Query nicht stimmt, Abfragen über mehrere Tabellen sind kompliziert und da schleichen sich schnell mal Fehler ein. Um das zu überprüfen, könntest du ja eine Testdatenbank aufsetzen, bei der die verschiedenen Tabellen migriert sind. Dies müssen ja nicht alle Datensätze sein bzw. müssen keine realen Werte sein, sondern nur zum Überprüfen ob es wirklich daran liegt.
Auf Dauer würde ich nicht Tabellen miteinander synchronisieren, da sich auch hier Fehler einschleichen können bzw. dann auch nicht sichergestellt ist, dass alle Tabellen wirklich ständig abgeglichen sind.
Im Normalfall ist es keine Problem, mehrere tausend oder sogar hunderttausend Datensätze abzufragen. Kommt natürlich drauf an, wie deine Verknüpfungen und Abhängigkeiten aussehen. -
Ich habe schon die meisten Fehler behoben, glaube aber nicht, dass alle entfernt wurden. Nichtdestotrotz würde ich es doch mal ausprobieren wollen, ob es funktionieren würde, wenn ich eine Auslagerung in temporäre Tabellen vornehme. Denn bei Verknüpfungen mit 2 oder max. 3 Tabellen ist die Ausgabe immer korrekt. Steigt die Anzahl der verknüpften Tabellen tauchen auch fehlerhafte Werte auf.
Durch die Auslagerung sollte doch dieses Problem nicht mehr bestehen. Oder liege ich da völlig falsch? -
Mach dir doch eine View in der Datenbank über "CREATE VIEW"...
-
Inwiefern kann mir das dann weiterhelfen?
-
mavi schrieb:
Ich habe schon die meisten Fehler behoben, glaube aber nicht, dass alle entfernt wurden. Nichtdestotrotz würde ich es doch mal ausprobieren wollen, ob es funktionieren würde, wenn ich eine Auslagerung in temporäre Tabellen vornehme. Denn bei Verknüpfungen mit 2 oder max. 3 Tabellen ist die Ausgabe immer korrekt. Steigt die Anzahl der verknüpften Tabellen tauchen auch fehlerhafte Werte auf.
Durch die Auslagerung sollte doch dieses Problem nicht mehr bestehen. Oder liege ich da völlig falsch?
Jetzt verstehe ich was dein Problem ist.. Du setzt deine Beziehungen falsch.. Wenn deine Daten nicht richtig ausgegeben werden, dann sind deine ID falschs mit einander verknüpft.. Das Problem liegt also nicht an der Ausgabe, sondern der Tabelle (;
Es wäre nett, wenn du vielleicht einmal wenigstens einen Screenshot deiner Tabelle erstellen könntest, damit wir einmal durchgucken können, ob alles richtig ist... -
Die Datenbank ist sehr umfangreich als das ich diese hier posten bzw. einen Screenshot davon machen könnte.
Wenn ich einen Denkanstoß bekommen könnte, wie ich mit den Daten aus den vorhandenen Tabellen eine temporäre Tabelle erzeugen kann, würde ich dies mal ausprobieren wollen.
Also z.B. habe ich eine Tabelle mit den Bestandsdaten, sagen wir mal Kundennummer, Name, Adresse, etc. und eine zweite Tabelle mit allen Bestellungen die getätigt wurden und eine dritte Tabelle mit den Informationen zu Zahlungen der Kunden. (Das sind jetzt alles auf die schnelle erfundene Angaben und erheben hier einmal keinen Anspruch auf Plausibilität)
Nun soll eine temporäre Tabelle erzeugt werden mit den Daten des Kunden XY, den Bestellungen, die der Kunde XY getätigt hat (also es können keine bis beliebig viele Bestellungen in der Tabelle vorliegen) und den Informationen über die getätigten Zahlungen des Kunden XY (auch hier können kein bis beliebig viele Einträge vorliegen). Bei der Zahlung muss diese auch der jeweiligen Bestellung zugeordnet werden können.
Die Tabellenspalten:
Tabelle 1:
ID
KDNR
NAME
ADRESSE
etc.
Tabelle 2:
ID
CID (Customer ID bzw. ID des Kunden aus Tabelle 1)
DATUM
MENGE
KOSTEN
etc.
Tabelle 3:
ID
CID (Customer ID bzw. ID des Kunden aus Tabelle 1)
OID (Order ID bzw. ID der Bestellung aus Tabelle 2)
DATUM
ZAHLUNGSART
BETRAG
etc.
-
also wenn du ein bestellsystem programmieren willst, ist es unpraktisch, über die session eine Temporäre Tabelle anzulegen...
1. wird das bei einerbestimmten Anzahl user extrem speicherlastig ( also ab 10 gleichzeitiger User denk ich mal wird man eine entsprechend starke RAM-belastung vermerken können... außer du hast dem webspace natürlich 128GB RAM zugewiesen, dann kannst du auch mit 1000 Leuten darauf arbeiten
2. wie siehts denn mit der aktualität aus? die session muss entweder platt und neu gemacht werden um veränderungen zu vermerken
wenn der user die möglichkeit hat, was zu ändern, müsstest du bei jedem änderungsversuch die tabelle komplett neu aufbauen.
wegen ein paar tausend datenbankeinträgen brauchst du dir keine gedanken machen, dass dir das ding zusammenbricht, wenn da mal eine suchabfrage gestartet wird... Datenbanken sind generell darauf ausgelegt, schnell zu arbeiten auch oder gerade inmitten großer Datenansammlungen. Halt lieber deinen Quellcode effizient und lass die datenbank mehr machen, sonst bremst der Webserver im endeffekt das system aus, wenn du jede session noch mit nem datenbankauszug vollmüllst...
So, weiter, dann zu der struktur deiner Tabellen..
Tabelle 1 Userdaten
Tabelle 2 Rechnung
Tabelle 3 Zahlungseingang?
in Tabelle 1 hast du eine kundennummer. warum verwendest du nciht die Kundennummer als primärschlüssel? so bauscht du das nur unnötig auf...
Tabelle 2: ist in ordnung, aber lieber Kundennummer importieren anstatt eine neue ID
Tabelle 3: Kundennummer hat da nix zu suchen, da tritt wieder redundanz auf!!! die Kundennummer bekommst du aus tabelle 2 raus!!!+
vielleicht löst es dein problem, wenn du den Join in tabelle 3 mit Tabelle 1 entfernst... sonst beißt sich der Hund in den schwanz... sowas mögen datenbanken nicht... immerhin machst du ja nen doppelten Join, wenn du tabelle 3 abfragst... oder nen 3 fachen?
so kann man auch viel einfacher rausfiltern, welche rechnungen beglichen wurden und welche nciht... man muss nur die abfrage leicht erweitern...
und ich habe shcon mit datenbanken gearbeitet mit mehrernen mio einträgen in der Maintabelle und mehreren huntertausenden in mehreren Nebentabellen... unterschätze die datenbankperformance nicht... -
sebulon schrieb:
also wenn du ein bestellsystem programmieren willst, ist es unpraktisch, über die session eine Temporäre Tabelle anzulegen...
Ich hätte ein anderes Beispiel nehmen sollen ;). Ich werde kein Bestellsystem programmieren. Die oben erfundene Tabelle dient nur als Beispiel, um mein Problem etwas anschaulicher zu machen.
sebulon schrieb:
1. wird das bei einerbestimmten Anzahl user extrem speicherlastig ( also ab 10 gleichzeitiger User denk ich mal wird man eine entsprechend starke RAM-belastung vermerken können... außer du hast dem webspace natürlich 128GB RAM zugewiesen, dann kannst du auch mit 1000 Leuten darauf arbeiten
2. wie siehts denn mit der aktualität aus? die session muss entweder platt und neu gemacht werden um veränderungen zu vermerken
Dieser Punkt sollte kein Problem darstellen, weil die Nutzung durch eine Person lokal im Intranet erfolgen wird. Externer Zugriff ist nicht vorgesehen.
sebulon schrieb:
So, weiter, dann zu der struktur deiner Tabellen..
Tabelle 1 Userdaten
Tabelle 2 Rechnung
Tabelle 3 Zahlungseingang?
in Tabelle 1 hast du eine kundennummer. warum verwendest du nciht die Kundennummer als primärschlüssel? so bauscht du das nur unnötig auf...
Die ID ist doch auch eine eindeutige Zuordnung. Diese sollte ich doch auch ohne Probleme verwenden können. Die KDNR ist, wie gesagt, nur ein Beispiel. So eine Spalte existiert im eigentlichen Projekt nicht. Daher nehme ich die ID.
sebulon schrieb:
Tabelle 3: Kundennummer hat da nix zu suchen, da tritt wieder redundanz auf!!! die Kundennummer bekommst du aus tabelle 2 raus!!!+
Da hast du recht! Danke für den Hinweis. Die OID ist vollkpmmen ausreichend. Die CID kann ich mir also sparen bzw. sollte ich auf jedenfall weglassen.
sebulon schrieb:
vielleicht löst es dein problem, wenn du den Join in tabelle 3 mit Tabelle 1 entfernst... sonst beißt sich der Hund in den schwanz... sowas mögen datenbanken nicht... immerhin machst du ja nen doppelten Join, wenn du tabelle 3 abfragst... oder nen 3 fachen?
Vielleicht ist so ein Fehler der Grund für die unerklärlichen Ausgabewerte in meinem eigentlichen Projekt. Nochmals danke für den Hinweis.
sebulon schrieb:
und ich habe shcon mit datenbanken gearbeitet mit mehrernen mio einträgen in der Maintabelle und mehreren huntertausenden in mehreren Nebentabellen... unterschätze die datenbankperformance nicht...
Das tue ich nicht.
Beitrag zuletzt geändert: 12.9.2011 15:34:15 von mavi -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage