Laden...

[gelöst] Beliebig geordnete Elemente

Erstellt von FeelFlow vor 13 Jahren Letzter Beitrag vor 13 Jahren 4.376 Views
F
FeelFlow Themenstarter:in
67 Beiträge seit 2010
vor 13 Jahren
[gelöst] Beliebig geordnete Elemente

Hi Leute!

In meinen Programm hat der User eine beliebige Anzahl von Elementen, die er beliebig paralell oder in Reihe anordnen kann.
Also zum 4 Elemente (E1, E2, E3, E4)
möglche anordnung: (E1 + E2) || (E3 + E4)
oder: (E1 + E2 + E3) || E4)

Dass ganze wird in einer MSAccessDB gespeichert.

Mein Problem ist, dass ich ziemlich ideenlos bin wie ich diese Anordnung speichern soll. Die einzelnen Elemente an sich sind kein Problem.

Hat da jemand einen Tipp ode eine Idee?

Danke

Gruß
Flo

L
63 Beiträge seit 2008
vor 13 Jahren

Eine Lösung, vielleicht keine Optimale, wäre diese:

Tabelle Anordnung:
AnordnungID | Syntax

Tabelle Zusammenhang (eine Zwischentabelle):
ZusammenhangID | ElementID | AnordnungID

Tabelle Element:
ElementID | Element

Wenn du nun "(E1 + E2 + E3) || E4)" speichern willst, sieht die DB so aus:

Tabelle Anordnung:
1 | "(? + ? + ?) || ?)"

* Alle Elemente durch ein Sonderzeichen ersetzt, welches von deiner Software dann durch die einzelnen Elemente ersetzt werden kann.

Tabelle Zusammenhang:
1 | 1 | 1
2 | 2 | 1
3 | 3 | 1
4 | 4 | 1

Tabelle Element:
1 | E1
2 | E2
3 | E3
4 | E4

Schlecht ist, dass man hier nur mit mehreren Selects die Anordnung wiederbekommt.

F
FeelFlow Themenstarter:in
67 Beiträge seit 2010
vor 13 Jahren

Danke für den vorschlag. Leider würde das, eingebaut in mein Projekt, den Rahmen gewaltig sprengen. Außerdem habe ich eine beliebige Anzahl von Elementen. Also die Lösung die ich brauche müsste für 1 aber auch für 1.000.000 elemente gehen.

Also wäre deine Möglichkeit hier ausgeschlossen!

Trotzdem Danke nochmal.

V
162 Beiträge seit 2010
vor 13 Jahren

HI,
das funktioniert für 1: 1000000
Und andere Lösungen funktionieren denk ich nicht.

Das Leben ist schön!

F
FeelFlow Themenstarter:in
67 Beiträge seit 2010
vor 13 Jahren

KLar funkktioniert das auch für 1.000.000! Aber diese Lösung ist ziemlich unbequem 😦 Außerdem will ich ja nicht den String "(E1 + E2 + E3) || E4)" speichern, sondern die physische anordnung der Elemetne! Mit dem String an sich kann ich nichts anfangen! Der war nur zur darstellung meines Problems.

V
162 Beiträge seit 2010
vor 13 Jahren

Ok,

es gibt mehrere Lösungen.

  • Hirachical Database. (halt ich nicht für Optimal)
  • Die Lösung oben mit einem String (siehe im Thread Oben)
  • Eine SQL DB Lösung. (folgt nun)
    (mehr fallen mir Spontan nicht ein)

Tabelle Element
ID int

 Tabelle Element
- PK_ID int
- Name String

Tabelle Regel
- PK_ID int
- Name string

Tabelle Zusammenhang
- PK_ID int
- Element_ID int
- Parent_Element_ID int Null
- Regel_ID int Null

Deine Regel bestimmt die Felder.
z.B:
Regel 1 sagt:
(x1 +x2 ) || (x3 + x4)

Regel 2 :
(x1 +x2 +x3 ) || X4
Die Regeln must du dann in deinem Programm hinterlegen.

Bedingung für Zusammenhang:

  • IF( Parent_Element_ID is Null ) Then Regel_ID is NOT Null
  • IF( Parent_Element_ID is NOT Null ) Then Regel_ID is Null
    Du schaust im ersten Node, eben nach der Regel und alles Childs würden der Reihe nach eingesetzt.

Ein Problem ist hier eher deine DB.
Normalerweise mache ich solche SQL-Abfragen mit Cursor, nur
deine DB unterstützt diese nicht (meine ich zumindest).
Also must du es im Cliet selber machen.

Generell ist dein Problem etwas schwieriger umzusetzen.
Es bedeutet viel Fleißarbeit für dich.
Viel erfolg.

Das Leben ist schön!

F
FeelFlow Themenstarter:in
67 Beiträge seit 2010
vor 13 Jahren

Hmmm...

Aber da muss ich ja jede regel vorher definieren. dass wären dann bei 1.000.000 Elementen so grob geschätzt 1,23342E9976 mögliche regeln, die ich vorher definieren muss.

L
63 Beiträge seit 2008
vor 13 Jahren

Du musst die Regeln nicht vorher definieren, du musst sie nur in der DB speichern wenn sie gebraucht werden, von daher werden das weniger 😁

Bzw., der Weg von Viper78 mit der rekursiven Beziehung scheint für mich sehr performant zu sein!

F
FeelFlow Themenstarter:in
67 Beiträge seit 2010
vor 13 Jahren

Okay... hast recht, ich brauch sie erst definieren, wenn sie gebraucht werden.

Aber das ist doch grade mein Problem... WIE speichert man die Beziehung (x1 +x2 +x3 ) || X4???
Der string an sich bringt mir ja nix.

V
162 Beiträge seit 2010
vor 13 Jahren

HI,

also **FeelFlow **mir scheint du willst nicht viel machen müssen.

Wenn du deine Elemente speicherst, weist du ja in welcher Form es sich befindet
und du kannst die Regel speichern.
Dazu reicht mein DB-Model nicht aus und du must es deshalb erweitern.
Eben um jenen Teil, der die Regel speichert.

Wir geben hier denk anstöße, keine Perfekte Lösung.
Das geht eh nicht da wir dein Projekt nicht 100% kennen.
Auch ist diese Projekt wie immer Schlecht beschrieben,
was du genau an Daten hast und wie diese Ausgegeben werden sollen.

Noch einmal, dein Projekt ist eine Fleißarbeit.
Ich mag diese selber auch nicht, aber Sie muss ja gemacht werden.

Einen Tip noch: Wechsel deine DB-Software auf was vernünftigeres.

MfG
Björn

Das Leben ist schön!

1.373 Beiträge seit 2004
vor 13 Jahren

Hallo,

Du solltest dir ein Codierschema überlegen und das dann in der DB ablegen. Wenn du dir die "Regeln" als Bäume vorstellst, kannst du sie pre-order durchlaufen und jeden Knotentype entsprechend codieren.

Beispiel: (E1||E2) ist als Baum:


  Disjunction
   /    \
  E1    E2

Das könnte man als "|vv" codieren: | ist die Disjunktion, v steht für variable.

(x1 +x2 +x3 ) || X4 könntest du als "|++vvvv" codieren.

Das ganze lässt sich sehr leicht parsen.

Grüße,
Andre

F
FeelFlow Themenstarter:in
67 Beiträge seit 2010
vor 13 Jahren

@Viper: Klar will ich nicht viel machen... Aber das macht doch die programmiererei aus... Mit kleinsten Aufwand den größten Nutzen erreichen.
Das Projekt lässt sich aber auch schwer beschreiben. Es handelt sich hierbei um ein Prog zur Berechnung von Kühlanlagen. Die Kühler lassen sich einzeln, paralell, oder in Reihe betreiben. Die Beziehungen werden zur Berechnung benötigt.
Die DB Software wechseln ist nicht möglich, da eine AccessDB gefordert wurde. Aber kannst du mir etwas empfehlen?

@VizOne: Ich glaube auch, dass ich sowas ähnliches machen werde. Hatte ich mir auch überlegt. Dachte aber es gibt vlt eleganter Lösungen.

V
162 Beiträge seit 2010
vor 13 Jahren

HI,

also nur weil etwas gefordert wurde muss es nicht gut sein.

Firebird = Embed + Server
MSSQL = Embed (Compact) + Express Server + Gui-Tool

Beide sind erstmal umsonst.
Bei MSSQL Compackt kannst du auch einfach Syncen mit einem Server.
Die Compact Datei kannst du auch öffnen mit den Microsoft SQL Server Management Studio Express.

Bei beiden Fängst du mit Embed an und wenn es mal Netzwerkfähig werden soll,
must du nicht viel ändern.

Bei Microsoft musst du kleine Details anpassen.
Bei Firebird nur die Connection Informationen.

Wenn du natürlich die Masken auch in Access machst,
dann bringt das nichts, die Datenbank-Software zu verändern.

MfG
Björn

Das Leben ist schön!

1.564 Beiträge seit 2007
vor 13 Jahren

Hi

Möchte eine Stimme für VizOne abgeben. Das was du, FeelFlow, willst ist mit der Arbeitsweise eines Compilers zu vergleichen. Auch die .NET LINQ Expressions arbeiten nach einem ähnlichem Prinzip. Bau die Ganzen Ausdrücke (= Expressions) als Bäume auf und speicher sie hierarchisch in der Datenbank ab. Wenn man innerhalb der Hierarchien nicht suchen muss wäre das auch ein guter Einsatz des XML Datentypen.

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

5.299 Beiträge seit 2008
vor 13 Jahren

@FeelFlow:
Was du da am Wickel hast ist ein klassisches Problem der Graphentheorie. Graphen stellt man mathem. dar durch eine Auflistung der Knoten (hier: Kühler) und eine Auflistung der Kanten - je eine Kante sagt eine KnotenPaarung aus, die miteinander Verbunden sind.
Für einen Graphen brauchst du also 2 Tabellen. Da ich annehme, du willst verschiedene Kombinationen durchspielen, brauchst du noch eine übergeordnete Tabelle.

Ich hab dir mal ein Dataset gelayoutet, was sowas leisten könnte.

Zum rekursiven Durchgang gibts Algorithmen, und auch zur Berechnung des Gesamtverhaltens gibts Standard-Rechenwege, - ich hatte mal eine Regeltechnik-Vorlesung, da wurden Netzwerke von Spulen, Widerständen, Kondensatoren damit berechnet, leider habichs nicht kapiert 😦, aber es hat mich sehr beeindruckt.

Der frühe Apfel fängt den Wurm.

F
FeelFlow Themenstarter:in
67 Beiträge seit 2010
vor 13 Jahren

@Erfinder: Sieht schonmal ganz gut aus deine Idee. Danke für deine Mühen!

Ich habe sowas daraus interpretiert: (siehe Anhang)

Meintest du Sowas? Was haltet ihr von dieser Lösung?

Problem wäre dann aber noch: Wie könnte man z.B.

((E1 + E2) || (E3 + E4) || (E5 + E6) darstellen?

Wobei ich erstmal so ganz zufrieden bin. Damit kann ich schonmal arbeiten!

@Edit: der eine Pfeil in meiner Grafik gehört eine Zeile weiter oben!

5.299 Beiträge seit 2008
vor 13 Jahren

Ich meins schon, wie ichs schrieb.
Dein Layout kann nur 2 Ebenen darstellen, keine Bäume, schon gar nicht alle möglichen Graphen.

(E1 + E2) || (E3 + E4) || (E5 + E6) sähe in meinem Modell etwa so aus:

Der frühe Apfel fängt den Wurm.

5.299 Beiträge seit 2008
vor 13 Jahren

na, das geht doch nicht so auf, wie ich dachte.
Man musses strikt graphentheoretisch angehen, also mit Kanten und Knoten. Und so ein Kühler ist kein Knoten, sondern eher eine Kante, das war mein Denkfehler. Denn er verbindet seinen Eingang mit seinem Ausgang. Genau genommen bestimmt er die Eigenschaften einer Kante, also deren Gewichtung, um es graphentheoretisch auszudrücken.
Die Knoten habe interessanterweise keine Eigenschaften. Ich stelle mir da ein dickes Rohr vor, mit so vielen Flanschen, wie Kühler zusammenzuschließen sind, alles so fett, dass der Strömungswiderstand vernachlässigbar bleibt.

Hier also ein Layout, was aufgeht. Leider stellt Access eine doppelte Beziehung zw. Edge und Node dar, indem es eine virtuelle Table Node_1 zufügt - es ist aber dieselbe Table Node.

Der frühe Apfel fängt den Wurm.

5.299 Beiträge seit 2008
vor 13 Jahren

Dann hab ich hier mal 2 Schaltungen angezeigt, in TestRemarks ist die algebraische Darstellung notiert.

Der frühe Apfel fängt den Wurm.

5.299 Beiträge seit 2008
vor 13 Jahren

Ich habe also auf Verdacht einen Haufen Nodes reingepackt, von denen Start und End speziell sind, denn dadurch wird die Flußrichtung im Netzwerk definiert. Die anderen verwende ich nach Belieben.

Der frühe Apfel fängt den Wurm.

F
FeelFlow Themenstarter:in
67 Beiträge seit 2010
vor 13 Jahren

Wirklich schwere Kost die ich da erstmal verdauen muss 😄
Muss mich da nochmal reindenken! Wo hast du sowas gelernt?

Deine Variante schaut recht gut aus, sodass ich endlich sagen kann, dass ich eine Lösung habe. Vielen Dank. Fühl dich umarmt und denk dir ein Dankbarkeitsbier 😃:):)