Ich arbeite also an einem Projekt für einen Immobilienmakler. Ich habe die folgenden Objekte/MySQL-Tabellen in meinem Entwurf:
Complexes
Units
Amenities
Pictures
Links
Documents
Events
Agents
Dies sind die Beziehungen zwischen den oben genannten Objekten.
Complexes have a single Agent.
Complexes have multiple Units, Amenities, Pictures, Links, Documents, and Events.
Units have multiple Pictures, Links, and Documents.
Annehmlichkeiten, Bilder, Links, Dokumente und Ereignisse haben alle die notwendigen Fremdschlüssel in der Datenbank, um anzugeben, zu welcher Einheit/welchem Komplex sie gehören.
Ich muss die erforderlichen Objekte aus der Datenbank in PHP laden, damit ich sie in meinem Projekt verwenden kann.
Wenn ich versuche, alle Daten aus der Tabelle in einer Abfrage mit LEFT JOINS auszuwählen, erhalte ich MINDESTENS (Anzahl der Links) * (Anzahl der Bilder) * (Anzahl der Dokumente) Zeilen für jede einzelne Einheit. Fügen Sie Annehmlichkeiten und Ereignisse hinzu und ich erhalte alle * # Annehmlichkeiten * # Ereignisse für jeden Komplex... Ich bin nicht sicher, ob ich versuchen möchte, das in ein Objekt in PHP zu laden.
Die andere Möglichkeit ist, für jeden Komplex/jede Einheit jeweils 1 separate SQL-Anweisung für Links, Bilder, Dokumente, Ereignisse und Einrichtungen auszuführen
Meine Fragen lauten wie folgt:
Wenn ich alle meine Tabellen richtig indiziere, ist es dann wirklich eine schlechte Idee, 3-5 zusätzliche Abfragen für jeden Komplex/jede Einheit auszuführen?
Wenn nicht, wie kann ich sonst die Daten erhalten, die ich in ein PHP-Objekt laden muss. Im Idealfall würde ich ein Objekt wie folgt für Einheiten haben:
Unit Object
(
[id]
[mls_number]
[type]
[retail_price]
[investor_price]
[quantity]
[beds]
[baths]
[square_feet]
[description]
[featured]
[year_built]
[has_garage]
[stories]
[other_features]
[investor_notes]
[tour_link]
[complex] => Complex Object
(
[id]
[name]
[description]
etc.
)
[agent] => Agent Object
(
[id]
[first_name]
[last_name]
[email]
[phone]
[phone2]
etc.
)
[pictures] => Array
(
[1] => Picture Object
(
)
)
[links] => Array
(
[1] => Link Object
(
)
)
[documents] => Array
(
[1] => Document Object
(
)
)
)
Ich brauche nicht IMMER ALLE diese Informationen, manchmal brauche ich nur den Primärschlüssel des Komplexes, manchmal nur den Primärschlüssel des Agenten usw. Aber ich dachte, der richtige Weg, dies zu tun, wäre, das gesamte Objekt jedes Mal zu laden, wenn ich es instanziiere.
Ich habe viel über OO-PHP recherchiert, aber die meisten (ich habe alle) Online-Beispiele verwenden nur eine Tabelle. Das ist natürlich nicht hilfreich, da das Projekt, an dem ich arbeite, viele komplexe Beziehungen hat. Hat jemand eine Idee? Liege ich hier völlig daneben?
感謝
[UPDATE]
Auf der anderen Seite benötige ich für das Front-End, das jeder sehen wird, ALLE Informationen. Wenn zum Beispiel jemand Informationen über einen bestimmten Komplex wünscht, muss ich alle Einheiten, die zu diesem Komplex gehören, alle Bilder, Dokumente, Links und Ereignisse für den Komplex sowie alle Bilder, Dokumente und Links für die Einheit anzeigen.
Ich wollte vermeiden, dass ich während des Ladens einer Seite eine Abfrage ausführen muss, um den benötigten Komplex zu erhalten. Dann eine weitere Abfrage, um die 20 mit dem Komplex verbundenen Einheiten zu erhalten. Dann wird für jede der 20 Einheiten eine Abfrage für Bilder, eine weitere für Dokumente, eine weitere für Links usw. ausgeführt. Ich wollte sie alle auf einmal abrufen, mit einer einzigen Abfrage in der Datenbank.
[EDIT 2] Beachten Sie auch, dass die Abfragen zur Auswahl der Bilder, Dokumente, Links, Ereignisse und Agenten aus der Datenbank ziemlich einfach sind. Einfaches SELECT [Liste von Spalten] FROM [Tabelle] WHERE [primary_key] = [Wert] mit gelegentlichem INNER JOIN. Ich führe keine komplexen Berechnungen oder Unterabfragen durch, nur grundlegende Dinge.
[BENCHMARK] Nachdem ich also alle Antworten auf meine Frage gelesen hatte, beschloss ich, einen Benchmark mit dem zu machen, was ich beschlossen hatte. Ich lade alle Einheiten, die ich brauche. Wenn ich dann Bilder, Dokumente oder ähnliches anzeigen muss, lade ich sie zu diesem Zeitpunkt. Ich habe 30.000 Testeinheiten erstellt, jede mit 100 Bildern, 100 Dokumenten und 100 Links. Dann lud ich eine bestimmte Anzahl von Einheiten (ich begann mit 1000, dann 100, dann die realistischeren 10), ging sie in einer Schleife durch und lud dann alle Bilder, Dokumente und Links, die mit der Einheit verbunden waren. Bei 1000 Einheiten dauerte dies etwa 30 Sekunden. Bei 100 Einheiten dauerte es etwa 3 Sekunden. Bei 10 Einheiten dauerte es etwa 0,5 Sekunden. Die Ergebnisse waren sehr unterschiedlich. Manchmal dauerte es bei 10 Einheiten 0,12 Sekunden. Dann dauerte es 0,8 Sekunden. Dann vielleicht 0,5. Dann 0,78. Es war wirklich sehr unterschiedlich. Im Durchschnitt schien es jedoch etwa eine halbe Sekunde zu dauern. In Wirklichkeit brauche ich aber vielleicht nur 6 Einheiten auf einmal, und jede davon hat vielleicht nur 10 Bilder, 5 Links und 5 Dokumente... daher denke ich, dass der Ansatz "die Daten abrufen, wenn man sie braucht" in einer Situation wie dieser der beste ist. Wenn Sie jedoch alle Daten auf einmal abrufen müssten, wäre es sinnvoll, eine einzige SQL-Anweisung zu entwickeln, um alle benötigten Daten zu laden, so dass Sie die Daten nur einmal in einer Schleife durchlaufen müssen (6700 Einheiten auf einmal dauerten 217 Sekunden, während PHP bei den vollen 30.000 Einheiten der Speicher ausging).