# a x b x c x....n   Matrizen in Datenbanken



## TomTank (15. Mai 2012)

In einem konkreten Programm habe ich das folgende Problem:

In meinem konkreten Anwendung handelt es sich um ein Farbenhersteller. Also hier nochmal etwas konkreter Ausgedrückt: Chemie A + Chemie B + Chemie C + .... Chemie N = darf Chemie Y nicht enthalten sein. Wenn ich natürlich Chemie A abfrage mit Chemie B.... muss als Ergebnis Chemie Y geben. Gleiches gilt naütrlich auch für Chemie B, wenn zusammen C ... N darf nicht Chemie Y enthalten sein. Bzw. Chemie C etc. darf nicht Chemie Y enthalten sein.

Also:
Produkt a darf in Verbindung mit Produkt b, Produkt c, .... Produkt n *nicht* Produkt y auswählbar sein. Das Produkt mus bei Abfrage von Produkt b in Verbindung mit Produkt a, Produkt c, ... Produkt n das dieses nicht das Produkt y nicht enthalten sein darf.

Dieses soll am effizientesten auf eine Datenbank abgebildet werden (über dieses Problem bin ich jetzt schon etwas länger am knobeln, mir raucht im Augenblick schon der Kopf )

Hoffe es ist nicht zu verwirrend 

Mein bisheriger ERM - Diagramm sieht wie folgt aus

Tabelle Chemie {
            int id;
            string name;
} 

Tabelle ChemieCombie {
            Invalid_Chemie invalid_id;
            Chemie             chemie_id;
}

Tabelle Invalid_Chemie {
            int id;
            Chemie chemie_id;
            Chemielist combis_id;
            Chemie  invalid_id;
}

Nach diesem Lösungsansatz müsste ich aber für alle Chemie Produkte die Liste führen, was sicherliche die Datenbank aufblähen würde. Außerdem müsste ich alle ändern wenn sich eine Kombi ändert, außerdem wäre das ermitteln auch nicht ganz einfach.

Wie kann so etwas am besten in einer Datenbank darstellen?


----------



## SlaterB (15. Mai 2012)

dein Beispiel ist schwer zu verstehen
> Chemie A + Chemie B + Chemie C + .... Chemie N = darf Chemie Y nicht enthalten sein. 
ist für sich schon keine klare Aussage, dem Rest nach verstehe ich das so
'ist die Kombination von A-N in einem Endprodukt enthalten, ist Y verboten'

im weiteren wird es aber nicht gerade leichter
> Wenn ich natürlich Chemie A abfrage mit Chemie B.... muss als Ergebnis Chemie Y geben. 
was ist das? klingt erst wie eine andere Regel 
'ist die Kombination von A-? [wieder N] in einem Endprodukt enthalten, ist Y erlaubt, wenn nicht gar zwingend'
??
vielleicht meinst du aber 'wenn A-N abgefragt wird, muss das Verbot von Y aufgrund der vorherigen Regel geliefert werden', 
ok, hoffen wir mal


es wird nicht leichter:
> Gleiches gilt naütrlich auch für Chemie B, wenn zusammen C ... N darf nicht Chemie Y enthalten sein.
wie, heißt das
'ist die Kombination von B-N in einem Endprodukt enthalten, ist Y verboten'
?
dann spielt A ja überhaupt keine Rolle, wieso vorher aufgenommen?


> Bzw. Chemie C etc. darf nicht Chemie Y enthalten sein.
macht es dann leider auch nicht verständlicher

------

was immer du vorhast, du musst die Information reproduzierbar in der DB abspeichern, 
notfalls deinen gesamten Datenbestand von GBs als String in einem einzigen Attribut eines einzigen Eintrags einer einzigen Tabelle..

etwas strukturierter wäre sicherlich zu bevorzugen, die DB ist dabei aber nur begrenzt das Problem,
hauptsächlich musst du wissen was du haben willst,
da ich es nicht so genau weiß ist es jetzt schwierig,

Listen von Chemikalien klingen aber durchaus angebracht, das ist nicht falsch und auch keine Aufblähung,
bei 20 Elementen in einer Liste musst du natürlich kein kartesisches Produkt alles denkbaren Kombinationen ablegen,
sondern nur einen Eintrag, den ins Programm einlesen als die relevante Informationen und wenn überhaupt dann dort weiter aufblähen,
wahrscheinlich aber auch zu vermeiden

mit einfachen Tabellen + JDBC ist es etwas unhandlich, beliebig lange Listen darzustellen, 
höhere Frameworks wie Hibernate würden zumindest die Java-Seite einfacher machen, allerdings auch sehr viel zu lernen zu Beginn..

in der DB wahrscheinlich eine Tabelle Chemie, eine Tabelle Kombi mit dem Invalid, richtig,
und dann eine Tabelle KombiEntry mit Link auf Kombi + Chemie,
in dieser Tabelle sind 20 Einträge, die auf dieselbe Kombi zeigen, für eine Liste von 20,
muss man später laden und zusammensuchen
(ok, hast du auch schon selber  )


----------



## TomTank (15. Mai 2012)

Dank dir erstmal.

Ich versuche es noch etwas besser zu beschreiben: ( Hierzu muss ich sagen ich bin Chemiker   )

Es gibt n unterschiedliche Chemikalien die jeder für sich in einem Datensatz gespeichert sind.
Jetzt dürfen bestimmte chemikalien nicht zusammen gemischt werden. (Aus meiner Laiensicht, weil eine Kombination dieser Chemikalien eine negative Reaktion hervorruft ). 

Also ein einfaches Beispiel:

    Chemikalie A darf nie mit Chemikale Y vermengt werden
    Chemikalie B darf nie mit Chemikalie Y vermengt werden

Hieraus würde erstmal resultieren das ich zu der Tabelle "Chemikalie" über eine Beziehung in eine weitere Tabelle "InvalidChemikalie" die Chemikalien speichern würde die niemals zusammen gemixt werden dürfen.

In einer erweiterten Version wirds etwas komplexer:

      Wenn Chemikalie A und Chemikalie B zusammengebracht wird darf >nie< Chemikalie Y
      (z.B. aus Explosionsgefahr, wenn man so will der letzte Funke  ) zusammen gebracht werden.

Diese Combinationen können beliebig erweitert werden also z.B.

-     Wenn Chemikalie A, B und C zusammengebracht wird darf >nie< Chemikalie Y zusammen
       gebracht werden.
-     Wenn Chemiklie A, B, C und D zusammengebracht wird darf >nie< Chemikalie Y hinzugefügt
      werden.
-     Wenn Chemikal A, B, C ... N zusammengebracht wird darf >nie< Chemikalie Y hinzugefügt
       werden
-     Wenn Chemikalie A, B, C ... N zusammengebracht wird darf >nie< 
      Chemikalie X oder Y oder ... oder Z verwendet werden.

Und ich bekomme es einfach nicht hin wie ich dieses am besten in eine Datenbank abbilden könnte.

Danke für eure Hilfe


----------



## SlaterB (15. Mai 2012)

wie sind die Regeln?
wenn A nicht mit Y zusammengebracht werden kann, gilt das dann für alle A, egal was sonst noch in den großen Kochtopf mit reinkommt,
genauso B usw?
denn so wie du das nun erzählt hast, klingt das weniger nach Kombinationen als nach Einzel-Ausschlüssen,

für diese Beispiele wären jeweils einzeln zu speichern 'A nicht Y', 'B nicht Y' usw.

viel mehr gibts da kaum zu sagen, speichern und wieder laden, inwiefern dazu Schwierigkeiten/ Varianten der Speicherung bestehen ist mir nicht ersichtlich,
speichere die Information so platt und billig wie möglich, dann hat es mit DB eh nix mehr zu tun,

wenn du alle Regeln wieder eingelesen hast und etwa auf einen/ viele aktuelle Kochtöpfe prüfen willst,
kann es mit richtigen Kombinationen durchaus knifflich werden, wird sich zeigen,

bei Einzelkombinationen 'A nicht Y', egal was außer A sonst noch verhanden ist, ist dagegen nicht viel dabei,
zur Prüfung nur nachschauen ob A und evtl. Y vorhanden ist, wer hätte das gedacht

------

- Wenn Chemikalie A, B, C ... N zusammengebracht wird darf >nie<
Chemikalie X oder Y oder ... oder Z verwendet werden.

das hier ist bisschen was anderes, mit der KombiEntry-Tabelle aber genauso zu erreichen,
dann eben das invalid nicht irgendwo fest als Attribut, sondern auch mit eigenen Eintrag hinzufügen,
die KombiEntry-Tabelle hat dann drei Attribute, eine Referenz auf die Kombination überhaupt, eine auf eine normale Chemie, eine auf eine Invalid-Chemie, 
oder nur ein Link auf Chemie und boolean für normal/invalid,
im Hauptdatensatz der Kombination könnten weitere boolean, ob für die normalen bzw. invaliden eine UND oder eine ODER-Verknüpfung besteht usw.,

das muss nicht in schönster Form lesbar sein in der DB, es reicht wenn es eindeutig ist,
fürs Auslesen der Daten und Umwandeln in ein schönes Java-Objekt mit Listen hat man alle Zeit der Welt


----------



## Landei (15. Mai 2012)

TomTank hat gesagt.:


> ( Hierzu muss ich sagen ich bin Chemiker



Gut, dass du das sagst, da wäre jetzt niemand drauf gekommen


----------



## Pippl (16. Mai 2012)

Landei hat gesagt.:


> Gut, dass du das sagst, da wäre jetzt niemand drauf gekommen



naja sonst gibt es ja immer wieder leute die programme für sachen schreiben wollen mit denen sie eig so nicht viel zu tun haben, es aber einfach ausprobieren wollen


----------

