Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datenbank mit Dynamischen Spalten (https://www.delphipraxis.net/117084-datenbank-mit-dynamischen-spalten.html)

Billa 11. Jul 2008 11:35

Re: Datenbank mit Dynamischen Spalten
 
Ich denke mir das so:

Tabelle1 (die "Zeilen" Deiner Matrix)

T1_ID
T1_Feld1
T1_Feld2 (eben alle Felder, die immer vorkommen)


Tabelle2 (die "Spalten"..)
T2_ID
T2_FK_T1 (Verweis auf die Zeile, z.B. mit Foreign Key Constraint auf T1_ID)
T2_Wert

jetzt kannst Du in "zwei Dimensionen" beliebige Zeilen und Spalten anlegen.
Wenn Du eine neue Spalte brauchst, legst Du also einfach statt neuer Spalten
in T1 neue Sätze in Tabelle2 an. Pro Zeile aus Tabelle 1 ein neuer Satz in
Tabelle2 mit der entsprechenden Zeilen-ID (T1_ID) der Zeile in T2_FK_T1.

Es existieren also in Tabelle2 AnzahlZeilen*AnzahlSpalten Sätze...

Damit hast Du Änderungen an der Struktur durch einfache Satzoperationen ersetzt.
Absolut flexibel. Wenn Du noch eine dritte Dimension benötigst, gibt es halt nach
gleichem Schema eine dritte Tabelle.... (Stichwort Normalisierung)

Billa 11. Jul 2008 11:37

Re: Datenbank mit Dynamischen Spalten
 
äh... man sollte in Tabelle2 noch eine Feld T2_Spaltennummer mitführen, dann sind auch Operationen unabhängig von der Zeile möglich....

sebi87 11. Jul 2008 11:43

Re: Datenbank mit Dynamischen Spalten
 
Ich kann mir das irgedwie nicht so vorstellen wie ich das dann erstellen muss...

kannst du mir da irgendwie ein Beispiel mit zwei Tabellen zeigen?

Billa 11. Jul 2008 12:02

Re: Datenbank mit Dynamischen Spalten
 
Du hast das Stichwort Matrix doch selbst gegeben.
Angenommen Du hast eine Tabelle mit 4 Zeilen und 4 Spalten

1 2 3 4

5 6 7 8

9 10 11 12

13 14 15 16

Wie adressierst Du einen bestimmten Wert? Indem Du Zeilennummer und Spaltennummer angibst.
Für die 11 z.B. "3" und "3" (oder 2/2 wenn Deine Zählung bei 0 beginnt)
Schau Dir Tabelle2 (mit der Spaltennummer) nochmal an. Da hast Du die Felder
T2_FK_T1 ("Zeilennummer") und T2_Spaltennummer. Die geben Dir Position in der Matrix.
Du speicherst also in einem Satz nicht nur den Wert, sondern auch seine Adresse.

Im Extremfall kannst Du also sogar auf Tabelle1 verzichten, nämlich wenn es keine Informationen außer dem Wert selbst gibt. Mit Tabelle1 ist es aber schicker, weil Du Zusatzinformationen zu einer Zeile ohne Redundanzen speichern kannst.

Wie das konkret aussieht, hängt von Deiner Datenbank bzw. Deiner Anwendung ab. Das hier ist nur
ein "Kochrezept"....

alzaimar 11. Jul 2008 12:16

Re: Datenbank mit Dynamischen Spalten
 
Wir haben ein solches System für eine polymorphe Produktdatenbank. Dort gibt es Produktklassen (z.B. Fernseher, Schrauben, Delphi-Updates etc.). Jede Produktklasse hat ein eigenes 'Tabellenlayout'. Um nun alle unterschiedlichen Produkte unter einen Hut (sprich Datenbank) zu bringen, haben wir ein Konzept implementiert, das dem von billa ähnelt. Natürlich haben wir noch unterschiedliche Datentypen, sowie Formatanweisungen, Einheiten ('m','mm','V' etc.), in einer separaten Tabelle, und jeder 'Spaltenwert' enthält zusätzlich noch die ID der Spaltendefinition.

Für jede Produktklasse haben wir zudem eine View 'View_<Produktklasse>', sodaß man schnell auf die 'Tabelle' zugreifen kann. Jede Änderung am "Tabellenlayout" einer Produktklasse erzeugt per Trigger eine neue View.

Über die INSERT/UPDATE/DELETE-Trigger der View realisieren wir Datenmanipulationen, sodaß unsere Metadaten nach außen hin völlig transparent sind. In der Tat haben alle Produktfamilien einige Eigenschaften gemein, z.B. Produktnummer, Version, Name, Beschreibung, Gültigkeitszeiraum etc., sodaß wir über ein
SQL-Code:
select * from View_AlleProdukte
alle Produkte anzeigen können.

Wir haben über die Jahre die Erfahrung gemacht, das das eine sehr einfache und komfortable Art und Weise ist, mit sich dynamisch ändernden und polymorphen Daten zu arbeiten.

sebi87 11. Jul 2008 12:45

Re: Datenbank mit Dynamischen Spalten
 
Hmm...
Ich werde mir das nochmal anschauen.
Danke mal für die Lösungsvorschläge.


Grüßle
Sebastian

Phoenix 11. Jul 2008 13:16

Re: Datenbank mit Dynamischen Spalten
 
Ganz andere Idee:

tblMatrix:
PK ID, FK ReferenzId, Column, Row, Value

ReferenzId zeigt auf den Datensatz, zu dem diese Matrix gehört.

Die Werte der Matrix sind mit ihrem Wert in Column und Row adressiert.
Zeile löschen: Delete from tblmatrix WHERE ReferenzId = Datensatznummer AND Row = Zeilennummer
Spalte löschen: Delete from tblmatrix WHERE ReferenzId = Datensatznummer AND Column = Zeilennummer

Edit Nachtrag: So beim durchlesen fällt mir ein, das Billa das schon Vorgeschlagen hatte... Man bin ich langsam heut :-o

sebi87 13. Jul 2008 22:12

Re: Datenbank mit Dynamischen Spalten
 
Vielen Dank für die zahlreichen Ideen.

Hab es jetzt so gelöst wie Billa vorgeschlagen hat und es funktioniert wirklich gut.


Grüßle

Sebastian


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:12 Uhr.
Seite 2 von 2     12   

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 by Thomas Breitkreuz