Mailinglisten-Archive |
Hi Liste, das Problem koennte man als OffTopic betrachten, nur, dies tritt permanent auf (bei mir ist's mittlerweile ein klassisches Problem ) und weil a.) auf der Liste 99% was mit SQL zu tun haben b.) ich langsam am Verzweifeln bin ;( wage ich mich diese Frage zu stellen ... Also, nehmen wir an, es gibt eine Reihe von "gleichen" Objekten. Diese Objekte haben statische Eigenschaften, die immer vorhanden sind (ob die dann belegt sind oder nicht, interessiert uns im Moment nicht) und dynamische Eigenschaften, dir gar nicht vorhanden sein muessen, koennen aber jeder Zeit hinzugefuegt bzw. entfernt werden. Konkretes Beispiel - HotelRooms. Nummer, Stock, .... - stat. Properties. Zeitraum, wann ein Zimmer belegt ist (01.01 - 01.05) (01.08 - 01.15) ..... - dynamische Properties. Folgendes Konstrukt koennte man verwenden: Tabelle Object ID Name Stat_1 .... Stat_N Tabelle Dyn_Prop ID ObjID -> ID vom Object Typ -> Typ der dyn.Eigenschaft DynPr -> Wert der dyn.Eigenschaft So, mit diesem Konstrukt lassen sich die dyn. Eigenschaften hinzufuegen oder entfernen. Falls nur ein Objekt sowohl mit stat. Eingenschaften als auch mit dyn. Eigenschaften angezeigt werden soll, hat man noch kein Problem. SELECT ID, Stat_1, ... FROM Object WHERE ID=... Zweite Query (unter PHP entstprechenden OR String mit IDs erstellen) SELECT * FROM Dyn_Prop WHERE ObjID=... OR ObjID=... OR ObjID=... usw. ORDER BY ObjID Moechten wir mehrere Objekte(incl. dyn.Properties) abhaengig von gewissen Bedingungen (angenommen sogar nur im dyn. Bereich) darstellen, faengt die Sache an. Moegliche Einsaetze: - Man fuehrt pro Objekt zwei Query aus (s.o). Performance unter aller Sau. Note 6. - Man fuehrt insgesamt zwei Queries aus. Erste mit LEFT JOINS SELECT A.ID, A.Stat_1, ... FROM Object AS A, Dyn_Prop AS B, Dyn_Prop AS B1 ... WHERE A.ID=B.ObjID AND B.ObjID=B1.ObjID ... AND zusaetzliche Bedingungen für dyn.Bereich AND zusaetzliche Bedingungen für stat.Bereich Als Ergebnis kriegt man alle statische Sachen und mit ObjID(A.ID) lassen sich die dyn.Properties auslesen. (unter PHP entstprechenden OR String erstellen) SELECT * FROM Dyn_Prop WHERE ObjID=... OR ObjID=... OR ObjID=... usw. ORDER BY ObjID Performance - besser als im ersten Fall, aber MySQL erlaubt z.B nicht mehr als 32 JOINs(somit hat man die Begrenzung auf Anzahl von dyn.Properties), abgesehen davon dass die Kiste schon ab 15 JOINs fast zusammenbricht. Note 5. Hmm, andere Varianten sehe ich irgendwie nicht und diese "Loesungen" sind ueberhaupt nicht akzeptabel. Haette jemand eine Idee, wie man das Problem umgehen kann, egal ob mit diesem Konstrukt oder ohne. Wichtig ist nur, dass die Performance einigermassen stimmt und dass keine spezifiesche Queries (ich meine die, die z.B. unter MySQL gehen und woanders nicht) verwendet werden. Fuer jeden Tipp bin ich dankbar, und selbstverstaendlich danke an alle, die das Mail bis zum Ende gelesen haben ;-) Vielen Dank und Gruss, Juri
php::bar PHP Wiki - Listenarchive