Problem mit mySQL bzgl. Spaltenlänge
Problem mit mySQL bzgl. Spaltenlänge
am 17.08.2005 16:33:23 von StephanD
Hallo! Ich hab da mal ein Problem und würde gern folgendes wissen:
In einer PHP-Seite lasse ich Daten aus einer DB auslesen. Der
Vollständigkeit halber hier mal ein Screenshot
(http://stephandziurla.st.funpic.de/sshotgruebel.jpg)
Dabei trage ich oben bestimmte Daten wie Adresse, Tel/Fax-Numemr
ein...nun mein Problem.
Ich habe - unten rechts im Screenshot zu erkennen - eine Menge an
Zusatzinformationen in Form von Checkboxen. Nun möchte ich nicht pro
Checkbox eine zusätzliche Spalte anlegen. Bei 30 Checkboxen kann das
schnell unübersichtlich werden.
Ich hatte schon überlegt, bei jeder angeklickten Checkbox einem String
eine "1" hinzuzufügen, aber bei einer 30stelligen Zahl ist die Anzahl
der Kombinationen ja nahezu unmöglich, das wäre ja total
unprofessioneller Programmierstil.
Gibts da nicht eine bessere Möglichkeit? Zu bedenken wäre dabei auch,
dass ich gern auch nach dem ein oder anderen Kriterium suchen
möchte.....
Ich hoffe ich konnte mich verständlich ausdrücken und mein Problem
darstellen. Wäre schön, wenn jemand eine Antwort hätte!
Danke
Re: Problem mit mySQL bzgl. Spaltenlänge
am 17.08.2005 20:48:58 von Andreas Bischoff
/* F'up auf StephanD in de.comp.lang.php.datenbanken/*
> Ich habe - unten rechts im Screenshot zu erkennen - eine Menge an
> Zusatzinformationen in Form von Checkboxen. Nun möchte ich nicht
> pro Checkbox eine zusätzliche Spalte anlegen. Bei 30 Checkboxen
> kann das schnell unübersichtlich werden.
>
> Ich hatte schon überlegt, bei jeder angeklickten Checkbox einem
> String eine "1" hinzuzufügen, aber bei einer 30stelligen Zahl ist
> die Anzahl der Kombinationen ja nahezu unmöglich, das wäre ja
> total unprofessioneller Programmierstil.
Warum arbeitest Du nicht mit einer Binärzahl? Die Kombination mit
Nullen und Einsen bietet sich doch förmlich an.
Oder falls es für Dich einfacher umzusetzen ist, eben mit einem String
aus Nullen und Einsen. Oder J und N, oder ... oder ... oder.
HTH,
Andreas
Re: Problem mit mySQL bzgl. Spaltenlänge
am 17.08.2005 21:12:38 von Martin Kurz
Hallo,
> [...]
> Ich hatte schon überlegt, bei jeder angeklickten Checkbox einem String
> eine "1" hinzuzufügen, aber bei einer 30stelligen Zahl ist die Anzahl
> der Kombinationen ja nahezu unmöglich, das wäre ja total
> unprofessioneller Programmierstil.
>
> Gibts da nicht eine bessere Möglichkeit? Zu bedenken wäre dabei auch,
> dass ich gern auch nach dem ein oder anderen Kriterium suchen
> möchte.....
Wenn Du pro "Spalte" als Wert 0 oder 1 hast, erhälst Du einen 30-stelligen
Binärwert, ein MySQL-Int hat 4 Bytes, also 32 Bit, müsste also passen. Also
wandelst Du einfach das 30-stellige Muster aus 0 und 1 in PHP von Binär nach Int
und fügst diese Zahl in die DB um. Zum Suchen kannst Du dann die Bit-Funktionen
von MySQL verwenden (http://dev.mysql.com/doc/mysql/de/bit-functions.html). Du
musst halt nur immer die selbe Reihenfolge für die Werte beibehalten. Einfaches
Beispel mit vier Werten, wobei der erste und dritte Wert gesetzt sind:
0101 = 5
Wenn Dich jetzt alle Felder, in denen der zweite Wert gesetzt ist,
interessieren, kannst Du das mit einer ODER-Verknüpfung (wahr, wenn mindestens
ein Wert wahr ist) rausfinden: mit der maske 1101 (= 13) muss bei der
Oder-Verknüfung 1111 (=15) rauskommen, wenn der zweite Wert gesetzt ist.
In MySQL wäre das dann in etwa so:
SELECT * FROM tabelle WHERE (values|13)=15;
Immer daran denken, dass die Werte von rechts nach links gehen.
und ganz allgemein:
Einzelnes (oder mehrere) Bit gesetzt: eine Oder-Verknüpfung mit einer Zahl, bei
der alle Bits außer den zu prüfenden 1 sind, muss 111111111... ergeben.
Ich hab' auch keine Ahnung, wie performant das in MySQL umgesetzt ist, in
größeren Tabellen hab' ich das noch nicht verwendet.
Viele Grüße,
Martin
Re: Problem mit mySQL bzgl. Spaltenlänge
am 17.08.2005 21:52:32 von Martin Kurz
Noch ein kleiner Nachtrag, da ich eben wohl etwas auf dem Schlauch stand: Also
Du hast einen 30-stelligen Binärwert, für die Suche verknüpfst Du diesen
Binärwert mit einem zweiten Binärwert mit ODER nach folgendem Schema:
Werte die Dich nicht interessieren: 1
Werte, die 1 sein sollen: 0
Werte, die 0 sein sollen: 0
Das Ergebnis der ODER-Verknüpfung wird mit dem Wert nach folgendem Schema
verglichen:
Werte die Dich nicht interessieren: 1
Werte, die 1 sein sollen: 1
Werte, die 0 sein sollen: 0
Also wenn Du nach einem Wert suchst, bei dem bspw der zweite Wert eins sein soll
und der dritte 0 nimmst Du für die ODER-Verknüpfung (wieder nur vier Stellen)
1001 und vergleichst das Ergebnis mit 1011.
So, ich hoffe, ich hab' diesmal nichts vergessen.
Grüße,
Martin
Re: Problem mit mySQL bzgl. Spaltenlänge
am 17.08.2005 23:00:32 von Kris
StephanD wrote:
> Ich habe - unten rechts im Screenshot zu erkennen - eine Menge an
> Zusatzinformationen in Form von Checkboxen. Nun möchte ich nicht pro
> Checkbox eine zusätzliche Spalte anlegen. Bei 30 Checkboxen kann das
> schnell unübersichtlich werden.
Ein grober und nicht zu empfehlender Hack wäre es, mit Bits in Binärzahlen
zu arbeiten.
Besser, aber immer noch ein Hack wäre die Verwendung eines Set-Typs von
MySQL http://dev.mysql.com/doc/mysql/en/set.html
Noch besser wäre es, das Schema zu normalisieren, also die möglichen
Checkboxen in eine Tabelle checkbox auszulagern:
(c_id, c_name)
(1, "Getränke")
(2, "Obst")
(3, ...)
Deine Personentabelle enthält jetzt die Informationen über Personen, aber
nicht über Checkboxen:
(p_id, p_name)
(1, "Stephan")
(2, "Kristian")
(3, ...)
Die Beziehung zwischen Checkboxen und Personen ist n:m: Eine Checkbox kann
bei vielen Personen gesetzt sein, eine Person kann viele Checkboxen gesetzt
haben. Wir haben also eine p_c_rel-Tabelle
(p_id, c_id)
(1, 1)
(1, 2)
(2, 3)
d.h. Stephan hat die Kreuze Getränke und Obst gesetzt und Kristian hatte das
Kreuz 3 gesetzt.
Eine Abfrage ist über Join leicht zu bewerkstelligen: select c.c_name,
p.p_name from checkbox c, p_c_rel pc, person p where c.c_id = pc.c_id and
pc.p_id = p.p_id;
Durch Einfügen in checkbox kann die Liste der möglichen Checkboxen ohne
Schemaänderung aktualisiert werden.
Mehr Informationen findest Du hier
http://dev.mysql.com/doc/mysql/en/join.html
und hier
http://dev.mysql.com/tech-resources/articles/intro-to-normal ization.html
Kristian