Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Variable Anzahl Felder in Datenbank speichern (https://www.delphipraxis.net/111084-variable-anzahl-felder-datenbank-speichern.html)

Opa Knack 29. Mär 2008 04:13

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

alzaimar 29. Mär 2008 07:04

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:
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)
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).

grenzgaenger 29. Mär 2008 11:10

Re: Variable Anzahl Felder in Datenbank speichern
 
Denke Du solltest dir mal die Normalisierung ansehen. Diese sollte dein Problem lösen.

<HTH> GG

Opa Knack 30. Mär 2008 23:45

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

alzaimar 31. Mär 2008 05:46

Re: Variable Anzahl Felder in Datenbank speichern
 
Zitat:

Zitat von Opa Knack
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).

Na ja, das ist die gängige Methode.
Zitat:

Zitat von Opa Knack
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.

Nö. verwende SQL und Indexe. Dann geht das schneller (und vor allen Dingen auch einfacher), als eine in-Memory-Suche.

1.Beispiel (Suche alle Eigenschaften der Komponente 'EditFeld')
SQL-Code:
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'
2.Beispiel (Suche alle Komponenten, die eine Eigenschaft 'Breite' besitzen)
SQL-Code:
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'
3.Beispiel (Suche alle Komponenten, die höher als 60 sind)
SQL-Code:
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
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...


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