AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Variable Anzahl Felder in Datenbank speichern
Thema durchsuchen
Ansicht
Themen-Optionen

Variable Anzahl Felder in Datenbank speichern

Ein Thema von Opa Knack · begonnen am 29. Mär 2008 · letzter Beitrag vom 31. Mär 2008
Antwort Antwort
Opa Knack

Registriert seit: 28. Dez 2004
Ort: Köln
166 Beiträge
 
#1

Variable Anzahl Felder in Datenbank speichern

  Alt 29. Mär 2008, 05:13
Datenbank: Firebird • Zugriff über: ZEOS
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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Variable Anzahl Felder in Datenbank speichern

  Alt 29. Mär 2008, 08:04
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).
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#3

Re: Variable Anzahl Felder in Datenbank speichern

  Alt 29. Mär 2008, 12:10
Denke Du solltest dir mal die Normalisierung ansehen. Diese sollte dein Problem lösen.

<HTH> GG
  Mit Zitat antworten Zitat
Opa Knack

Registriert seit: 28. Dez 2004
Ort: Köln
166 Beiträge
 
#4

Re: Variable Anzahl Felder in Datenbank speichern

  Alt 31. Mär 2008, 00:45
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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Variable Anzahl Felder in Datenbank speichern

  Alt 31. Mär 2008, 06:46
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 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öheand 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...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz