# Kanonische Disjunktive Normalform



## Camino (9. Jun 2011)

Hallo, ich hab da ein ziemlich ungewöhnliches Problem.

Ich bin gerade bei einer Datenbankmigration und Erstellung einer Anwendung in Swing zur Verwaltung der Daten. Dabei habe ich nun festgestellt, dass in der alten Datenbank (Access) der frühere Entwickler in einer DB-Tabelle zwei Integer-Wert gespeichert hat, bei denen es sich nach weiteren Recherchen wohl um eine Kanonische Disjunktive Normalform (KDNF) handelt. Ich hab zwar weiter im Internet gesucht und auch die Funktionsweise und den Sinn so einigermassen verstanden, aber das ist alles ziemlich hoch-mathematisch und mir hat irgendwann der Kopf gequalmt. Vielleicht hat ja hier jemand schon mit so etwas gearbeitet und kann mir weiterhelfen. Interessieren würde mich, ob so etwas überhaupt sinnvoll ist und normalerweise angewendet wird. Wenn ja, bräuchte ich einen Ansatz, wie ich das am einfachsten umrechnen kann.

Erst mal grundsätzliches zur KDNF (falls das jemand noch nicht kennt) und konkretes zu meinem Beispiel:
In der DB-Tabelle ist also ein einziger Integer-Wert gespeichert, der den Zustand von 10 Boolean-Werten widergeben soll. Vermutlich aus Gründen der einfachen Übersichtlichkeit, also um sich eine Menge an Boolean-Feldern zu ersparen. Die Integerzahl ergibt sich aus 512 + 2 hoch n, wobei n = 0, 1, 2, 3, 4... also die Anzahl der Boolean-Werte darstellt. Dadurch ergibt sich für den ersten Wert 2 hoch 0 = 1, der 2. Wert 2 hoch 1 = 2, der 3. Wert 2 hoch 2 = 4 usw. Durch Addition der Ergebnisse (1+2+4+8+16+32+64+128+256+512) kann in der Zahl eindeutig festgestellt werden, welche n-Werte ausgewählt wurden und somit dem Zustand true entsprechen würden, die restlichen anderen erhalten dann den Zustand false.

So , nun meine Fragen:

Weiss jemand, warum bei der Zahl bei 512 zu rechnen angefangen wurde? Man hätte ja auch bei 0 anfangen und nur die 2 hoch n zusammenzählen können. Eine Vermutung hatte ich, als ich mal die 10 n-Werte ausgerechnet hatte und der letzte (10.) Wert 512 ergab. Möglich wäre ja, dass mit der 512 als Startzahl auch die maximale Anzahl an n-Werten bestimmt wird.

OK, die Funktionsweise und der Sinn der KDNF ist mir so langsam klar geworden. Aber wie rechne ich das nun um. Der eine Weg ist ziemlich einfach: ich schaue, welche Boolean-Werte ausgewählt wurden (= true sind), rechne die in ihrer Reihenfolge (n) hoch 2, zähle die Werte zusammen und schreibe die Zahl in die Datenbank. Aber wenn ich nun die Zahl aus der DB hole, wie rechne ich das um, dass ich von der Zahl auf die gesetzten n-Werte komme? Gibt es da eine einfache mathematische Lösung?

Interessieren würde mich auch, was ihr davon haltet. Ist das sinnvoll oder völliger Quatsch? Sollte ich das in der neuen Datenbank auch so umsetzen, oder lieber pro Zahl 10 Boolean-Felder nehmen? Das wären jetzt konkret in der einen Tabelle zwei Zahlen also 20 zusätzliche Felder. Ein Vorteil wäre wohl, dass ich bei der Migration der DB die Zahlen einfach übernehmen könnte.

Ich bin leider mit meinem mathematischen Wissen an eine Grenze gestossen und würde mich über Hilfe und Input zu diesem ungewöhnlichen Thema freuen...

Viele Grüsse
Camino


----------



## homer65 (9. Jun 2011)

Meiner Ansicht nach macht sowas keinen Sinn. 
Man sollte sich das Leben so einfach wie möglich machen und das verkompliziert nur alles.


----------



## Camino (9. Jun 2011)

Ja, ich denke auch, lieber einfach als kompliziert. Ist es denn eigentlich grundsätzlich sinnvoll und empfehlenswert, mehrere solche Boolean-Felder in einem DB-Feld zusammenzufassen? Ich könnte ja z.B. auch anstatt 10 Boolean-Feldern ein Feld mit einem String erstellen, welcher die Grösse 10 und die Form 'YNNYYNNNYN' hat. Dann les ich diesen String aus und wandel den in meiner Java-Anwendung in Boolean-Werte um, mit denen ich dann dort weiter arbeiten kann (z.B. CheckBoxen selektieren). Dann hätte ich anstatt 20 Boolean-Feldern nur 2 varchar-Felder in der DB stehen.

Edit: OK, der Nachteil wäre dann sicher, dass man nicht mehr direkt über die Datenbank einfach nach dem Wert (true/false) eines Feldes suchen oder filtern könnte.


----------

