mySQL Frage: Ein Feld mit mehreren numerischen Werten füllen
Gunther
- datenbank
0 Cheatah0 Thomas Schmieder0 Gunther
0 Thomas Meinike0 Cheatah
0 romy
Hallo zusammen!
Folgendes Problem: Ich habe eine Tabelle in meiner mySQL DB. An diese Tabelle möchte ich nun gerne noch ein Feld anfügen, in dem mehrere (0-999) numerische Werte (1 bis max. 3 stellig) je nach Bedarf gespeichert werden sollen.
1. Frage: welchen Feldtyp verwende ich dafür am besten?
2. Frage: wie 'zerlege' ich den Wert nach dem Auslesen am einfachsten in PHP?
Für Tipps besten Dank im voraus!
MfG
Gunther
Hi,
Folgendes Problem: Ich habe eine Tabelle in meiner mySQL DB. An diese Tabelle möchte ich nun gerne noch ein Feld anfügen, in dem mehrere (0-999) numerische Werte (1 bis max. 3 stellig) je nach Bedarf gespeichert werden sollen.
_eine_ Spalte ist für _einen_ Wert gedacht. Zwar gibt es Datentypen, die dies relativieren (SET, ENUM), die sind aber nicht für tausend verschiedene mögliche Werte gedacht.
Was Du möchtest, ist eine zweite Tabelle anlegen und mit dieser eine 1:n-Beziehung aufbauen.
Cheatah
Hallihallo,
_eine_ Spalte ist für _einen_ Wert gedacht. Zwar gibt es Datentypen, die dies relativieren (SET, ENUM), die sind aber nicht für tausend verschiedene mögliche Werte gedacht.
Was Du möchtest, ist eine zweite Tabelle anlegen und mit dieser eine 1:n-Beziehung aufbauen.
Im Prinzip ja, aber ... :-)
Das ist natürlich schöne Theorie. Aber man muss sich nicht unbedingt zum Sklaven der totalen Normalisierung machen, da es in MySQL ja zum Glück VarChars gibt. Die kann man hier bestens als varianten Datentyp verwenden.
Wenn es keine Notwendigkeit gibt, mit den Werten schon in der Datenbank zu rechnen und man sowieso immer alle, die zu einem Datensatz gehören, gemeinsam benötigt, dann ist eine Speicherung als varianter Datentyp druchaus billiger.
Die Werte kann man z.B. aus einem Array mit Hilfe von Implode() in einen String schreiben und dann abspeichern. Mit explode() kann man dann nach dem Holen aus der Datenbank wieder ein Array daraus machen. Wenn man ganze Variablenstrukturen in einem Block abspeichern will, eigenen sich auch die Funktionen serialize() und unserialize().
Wenn man natürlich mit diesen Werten rechnen will, den größten oder den kleinsten suchen muss, oder irgendwelche Filter setzen will, dann macht eine zweite Tabelle sicher Sinn.
Liebe Grüße aus http://www.braunschweig.de
Tom
Hey Tom,
Das ist natürlich schöne Theorie. Aber man muss sich nicht unbedingt zum Sklaven der totalen Normalisierung machen, da es in MySQL ja zum Glück VarChars gibt. Die kann man hier bestens als varianten Datentyp verwenden.
Wenn es keine Notwendigkeit gibt, mit den Werten schon in der Datenbank zu rechnen und man sowieso immer alle, die zu einem Datensatz gehören, gemeinsam benötigt, dann ist eine Speicherung als varianter Datentyp druchaus billiger.
das trifft genau zu -> Typ=VARCHAR ?
Die Werte kann man z.B. aus einem Array mit Hilfe von Implode() in einen String schreiben und dann abspeichern. Mit explode() kann man dann nach dem Holen aus der Datenbank wieder ein Array daraus machen. Wenn man ganze Variablenstrukturen in einem Block abspeichern will, eigenen sich auch die Funktionen serialize() und unserialize().
Jo, prima!
Wenn man natürlich mit diesen Werten rechnen will, den größten oder den kleinsten suchen muss, oder irgendwelche Filter setzen will, dann macht eine zweite Tabelle sicher Sinn.
Nein, will ich nicht
Liebe Grüße aus http://www.braunschweig.de
Gruß zurück und besten Dank!
Gunther
Hallo,
_eine_ Spalte ist für _einen_ Wert gedacht. Zwar gibt es Datentypen, die dies relativieren (SET, ENUM), die sind aber nicht für tausend verschiedene mögliche Werte gedacht.
Was Du möchtest, ist eine zweite Tabelle anlegen und mit dieser eine 1:n-Beziehung aufbauen.
Es gibt immer Anwendungen, die sich mit solchen strengen Regeln nur schlecht bewerkstelligen lassen.
Was macht mann denn bei Daten, die sich nicht so einfach strukturieren lassen?
Ich habe z. B. eine MySQL-Datenbank mit Massenspektren chemischer Verbindungen angelegt, die folgenden Aufbau hat:
id
summenformel
verbindungsname
daten
Unter "daten" sind jeweils die Paare Massenzahl(m),Intensitaet(I) vermerkt, die aber fuer jede Verbindung eine unterschiedliche Anzahl ergeben. Daher ist das Feld vom Typ varchar und enthaelt die Daten in der Form:
m|I|m|I|m|I|m|I|m|I
|m|I|...
Beispiel:
2
C4H8
2-BUTENE
2|12|12|4|13|8|14|20|15|76|...|57|20
Beim Auslesen wird mittels PHP und explode()-Funktion ein Array generiert und daraus der Datensatz extrahiert. Das klappt ganz vorherragend und waere anders kaum so praktikabel realisierbar (vor allem im Hinblick auf die Weiterverarbeitung). In der Tabelle sind die Daten von mehr als 50000 Verbindungen gespeichert ...
Daran schließen sich noch mehr Schritte an wie XML-Generierung und XSLT-Umwandlung der Daten in ein Massenspektrum im SVG-Format (vgl. XML & Web-Services Magazin 2.02).
MfG, Thomas
Hi,
Es gibt immer Anwendungen, die sich mit solchen strengen Regeln nur schlecht bewerkstelligen lassen.
ja, es gibt immer Ausnahmen. Bitte entschuldige, dass ich hier keine Abhandlung über alle existierenden Möglichkeiten und die Umfelder, in denen sie Sinn machen, verfasst habe.
Ich habe z. B. eine MySQL-Datenbank mit Massenspektren chemischer Verbindungen angelegt, die folgenden Aufbau hat:
Ich bin mir sicher, Du kennst die Grundlagen eines relationalen Datenmodells. Gunthers Posting konnte ich dieses Wissen nicht entnehmen; daher lag es auf der Hand, dass er unbedacht den falschen Weg eingeschlagen hat.
Cheatah
Hallo Gunther,
- Frage: welchen Feldtyp verwende ich dafür am besten?
integer
- Frage: wie 'zerlege' ich den Wert nach dem Auslesen am einfachsten in PHP?
in was/als was willst Du den Wert zerlegen?
Letztendlich hat das natürlich auch eine Auswirkung auf den Datentyp. Wenn Du die Zahl nicht als Zahl verwenden willst, bietet sich auch String an (was performanter ist, weiss ich nicht)
Mit den Stringfunktionen kannst Du alles was Du willst zerlegen.
ciao
romy
- Frage: wie 'zerlege' ich den Wert nach dem Auslesen am einfachsten in PHP?
in was/als was willst Du den Wert zerlegen?
Also ich versuche es mal etwas genauer zu erklären:
Das Feld soll ja Zahlen (als String) enthalten, also z.B.: 2|5|13|101
Wenn ich jetzt das Feld wieder ausgelesen habe, soll es wieder in ein Array zerlegt werden, mit den einzelnen Zahlen.
(Sorry, aber hab' leider noch nicht so viel Ahnung von der Materie!)
MfG
Gunther
Hallo Gunther,
Das Feld soll ja Zahlen (als String) enthalten, also z.B.: 2|5|13|101
Wenn ich jetzt das Feld wieder ausgelesen habe, soll es wieder in ein Array zerlegt werden, mit den einzelnen Zahlen.
Ich glaube du suchst explode() (http://php.net/de/explode):
$zahl = explode("|",$wertausderdatenbank);
dann kannst du mit $zahl[0], $zahl[1] usw. auf die Werte zugreifen.
Grüße aus Nürnberg
Tobias
Hallo Tobias,
Ich glaube du suchst explode() (http://php.net/de/explode):
$zahl = explode("|",$wertausderdatenbank);
dann kannst du mit $zahl[0], $zahl[1] usw. auf die Werte zugreifen.
Ja, so werd' ich es dann machen. Vielen Dank und Gruß zurück!
Gunther