phpbar.de logo

Mailinglisten-Archive

[php] SQL Objekte und dynamische Properties

[php] SQL Objekte und dynamische Properties

Juri Smarschevski smj_(at)_intratools.de
Thu, 25 Jan 2001 09:46:22 +0100


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