![]() |
Datenbank: Firebird • Zugriff über: ZEOS
Variable Anzahl Felder in Datenbank speichern
Hallo,
wahrscheinlich ist diese Frage schon zig Mal gestellt worden und ich war nur wieder zu müde, um die richtigen Suchbegriffe einzugeben. Also: Werte von zur Laufzeit erzeugten Komponenten (Edits, Comboboxen, Memos, ...) sollen in einer Datenbank abgelegt werden und dort später dann auch bei einer Suche wieder gefunden werden. Mein (wahrscheinlich extrem primitiver Ansatz) ist nun, die Werte in ein Stringgrid zu schreiben und dieses dann in einem Datensatz als BLOB abzulegen. Das liesse sich dann zwar durchsuchen, ich wette aber, dass die Performance dann eigentlich nicht mehr performen würde (da ich ja theoretisch jedes Grid erst einmal laden muss, um es dann durchsuchen zu können). Das Auslesen eines einzelnen Datensatzes funktioniert so natürlich, aber das ist ja nicht Thema meiner Frage. Die Anzahl der erzeugten Komponenten ist variabel und kann sich zwischen 5 und 200 bewegen. Insofern dürfte es meines Ermessens nach wenig Sinn machen, pro Datensatz 200 Felder anzulegen, die dann mit den Werten gefüllt werden können. Die Suche soll (soweit zumindest meine Planung) die Möglichkeit bieten, Suchbegriffe zu den einzelnen Komponenten vorzugeben und danach Treffer auszuwerten. Als Beispiel: Es wäre möglich, zum Beispiel eine Editkompo für den Nachnamen und eine für den Vornamen zu erzeugen. Diese sollen dann auch "auffindbar" sein. Ich hoffe, die bisherige Beschreibung war halbwegs nachvollziehbar (ist schon ein wenig spät, und in meinem Alter....) Nun zur eigentlichen Frage: Habt ihr einen Tipp, wie ich dieses Vorhaben möglichst elegant umsetzen kann und dabei die Geschwindigkeit nicht komplett in den Keller fahre? Ich danke schonmal und wünsche eine gute Nacht :-) Gruß Opa |
Re: Variable Anzahl Felder in Datenbank speichern
Eine Tabelle mit den Komponenten, eine Tabelle für die Eigenschaften und eine Tabelle für die Eigenschaft-Wert-Paare je Komponente. Wenn Dir der Datentyp einer Eigenschaft egal ist, dann so:
Code:
Wie Du nun den Wert in FB richtig abspeicherst (hier als Variant), weiss ich nicht. Zur Not als String, aber dann bekommst Du bei der Internationalisierung u.U. Probleme beim Einlesen (unterschiedliche Formate in den Ländern).
Tabelle 'Komponenten'
[kpID] AutoInc (Eindeutige ID der Komponente) [kpName] VarChar (Name der Komponente) Tabelle 'Eigenschaften' [egID] AutoInc (Eindeutige ID der Eigenschaft) [egName] VarChar (Name der Eigenschaft) Tabelle 'KomponentenEigenschaften' [kpID] int (ID der Komponente) [egID] int (ID der Eigenschaft) [keValue] Variant (Wert der Eigenschaft) |
Re: Variable Anzahl Felder in Datenbank speichern
|
Re: Variable Anzahl Felder in Datenbank speichern
Hallo,
Danke schonmal für die Tipps. Die Komponenten selbst in eine Tabelle abzulegen und dann eine zweite für die Daten anzulegen ist ja im Endeffekt das, was ich zu vermeiden versuche (weil meines Erachtens die ineffektivste Methode). Dann müsste ich ja bei der Suche trotzdem jede Wertetabelle erst einmal laden und durchsuchen, was bei einigen wenigen Datensätzen noch funktionieren mag, aber bei größeren Mengen nicht unbedingt schnell vonstatten gehen dürfte. In die Normalisierung werde ich mich mal einlesen. Das liest sich zumindest im Grundsatz schon mal nicht schlecht. Falls noch weitere Ideen aufkommen sollten, bin ich für jeden Tipp dankbar. Viele Grüße Opa |
Re: Variable Anzahl Felder in Datenbank speichern
Zitat:
Zitat:
1.Beispiel (Suche alle Eigenschaften der Komponente 'EditFeld')
SQL-Code:
2.Beispiel (Suche alle Komponenten, die eine Eigenschaft 'Breite' besitzen)
select k.kpID, e.*
from KomponentenEigenschaften ke join Komponenten k on ke.kpID = k.kpID join Eigenschaften e on je.egID = ke.egID where k.kpName = 'EditFeld'
SQL-Code:
3.Beispiel (Suche alle Komponenten, die höher als 60 sind)
select k.*
from KomponentenEigenschaften ke join Komponenten k on ke.kpID = k.kpID join Eigenschaften e on je.egID = ke.egID where e.egName = 'Breite'
SQL-Code:
Du kannst natürlich auch eine kombinierte Suche (Alle Komponenten, die mit 'Foo' anfangen, nicht höher als 60 sind und bei denen die Eigenschaft 'Enabled' auf 'False' gesetzt ist) gestalten...
select k.*
from KomponentenEigenschaften ke join Komponenten k on ke.kpID = k.kpID join Eigenschaften e on je.egID = ke.egID where e.egName = 'Höhe' and ke.keValue > 60 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz