mySQL - 48 numerische Felder oder nur 2 Textfelder

tombe

Erfahrenes Mitglied
Hallo,

ich habe eine Datenbank bzw. eine Tabelle in der mit PHP ein Stundenprofil gespeichert werden soll.

Es gibt hierbei für jede Stunde a) einen numerischen Wert und b) eine prozentuale Anpassung für diesen Wert.
Somit bräuchte ich für die Werte 24 Felder und für die Anpassung nochmals 24 = 48 Felder.

Jetzt bin ich am überlegen ob es nicht einfacher wäre wenn ich stattdessen nur 2 Textfelder nehme und die numerischen Werte als Liste getrennt durch Semikolon, z.B. "1,0 ; 1,5 ; 2,0 ; ..." eintrage.

Um die Werte in die DB einzutragen müssen logischerweise 24 Eingabefelder im Formular vorhanden sein. Diese Angaben könnte ich dann ja einfach zu einem String zusammenlegen.

Wenn die Werte später ausgelesen und angezeigt werden sollen könnte ich sie ja einfach mit explode wieder zerlegen.

Da immer alle 48 Angaben zumindest mit "0" belegt werden, ist bei der Augabe die Zuordnung ja auch kein Problem.

Die Werte können gehen von "0,0" bis "999,9" das heißt das die Textfelder jeweils eine maximale Länge von 144 Zeichen ("999,9" = 5 Zeichen + 1 Zeichen für das Trennzeichen = 6 x 24 = 144) haben müssten und somit rund gerechnet jedes Feld 144 Bytes belegen würde.

Die 48 numerischen Felder würden circa 96 Bytes belegen, also im schmlimmsten Fall nur geringfügig mehr.

Ich habe einfach eine Abneigung gegen so viele Felder.
Gibt es trotzdem - was die Tabelle angeht - einen Grund für jeden Wert ein eigenes Feld zu nehmen?

Danke und Gruß

Thomas
 
Ich würde es normalisieren
Code:
#myItems
id | title | etc
---|-------|----
 1 | a     |   

#hours
hour
----
 1
 2
 3

#hoursPerItem
item_id | hour | percent
--------|------|--------
      1 |    1 |     15
      1 |    2 |     10
      1 |    3 |      5
Das ganze mit zusammensetzen und zerlegen braucht einfach Rechenleistung im Programm und muss nicht wirklich sein.

Mit einem Trigger kannst du bewerkstelligen, dass bei jedem INSERT in myItems die Tabelle hoursPerItem abgefüllt und mit dem Wert 0 versehen wird.
 
Hi yaslaw,

du meinst also das ich im Grunde nur zwei Spalten "wert" und "anpassung" machen soll und dann für jede Stunde einen neuen Datensatz anlegen?

Bläht das dann nicht die Tabelle auf. Denn es gibt jeden Tag diese 2 x 24 Angaben und das dann später für X Personen.

Es wären dann tatsächlich die Felder ID, Datum, Zeit, Wert, Anpassung und davon jeden Tag pro Person 24 Datensätze.

Ich vertraue dir eigentlich blind.
Aber ich frage mich ob das Eintragen und Auslesen von so vielen Daten dann im Grunde nicht auch Rechenleistung verlangt und was vom Handling her einfacher ist?
 
Es gibt bei Datenbanken selten die richtige Lösung. Es gibt verschiedene Ansätze. Einer davon ist die Normalisierung.
Mit der Normalisierung verbaust du dir keine späteren auswertungesmöglichkeiten, verhinderst Doppelspurigkeiten etc.
Wenn du den String zusammensetzt und jedesmal zerlegst, wirst du jede Berechung in PHP ausführen müssen. Es wird keine Abfrage der Daten mittels SQL sinnvoll umsetzbar sein.
SQL-Mengenverarbeitungen sind normalerweise schneller als PHP-Mengenverarbeitung.

Also, wenn du jemals in Zukunft eine AUswertung haben willst, über alle Stunden iener PErson die den Wert über 15 hat, so ists in dienem Fall nur mit einem Fullscan und ausfiltern in PHP möglich.

Darum: Wenn du nicht ganz genau weisst, dass sicher niemals eine andere Abfrage erstellt werden muss als 'Alle 24 Stunden auf einmal auslesen', dann normalisiere es. Du verbaust dir die Zukunft weniger
 
Ich muss wohl etwas besser beschreiben um was für Werte es sich handelt.

Es ist ein medizinisches Gerät das jede Stunde eine bestimmte Medikamentenmenge ab gibt (das sind die Werte). Die Menge kann nun für besondere Umstände prozentual erhöht oder gesenkt werden (das ist die Anpassung).

Code:
Uhrzeit      |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |
Wert         |  1  |  1  |  2  |  2  |  1  |  3  |  3  |  2  |  1  |  1  |
Anpassung    | 100 | 100 | 100 | 120 | 120 | 100 |  90 |  90 | 100 | 100 |

So würde das Profil in etwa aussehen, nur halt von 0 Uhr bis 23 Uhr.

Was berechnet werden muss, ist die Gesamtmenge unabhägig von der Anpassung, im Beispiel also der Wert 17, das könnte ich mit "array_sum" lösen.

Kann für einen solchen Fall die Normalisierung nicht vernachlässigt werden?
 
können? Ja.
Es ist deine Entscheidung.

Du weisst jetzt, was du auswerten musst. Aber weisst du auch, was für Auswertungen in einem halben Jahr gefordert sind?
Deine Datenspeicherung ist opimiert für diese eine Auswertung. Wenn du sicher bist, dass es dabei bliebt, dann mach es so.

Ich würde es normalisieren. Weil ich die Erfahrung gemacht habe, dass ein Programm bereits in der Versiopn 1.2 viele neue Reports und AUswertungen drin hat, an die am Anfang noch nie jemand gedacht hat. Auch bei Programmen und Kunden gilt das Prinzip: Apetit kommt beim Essen.
Das ist meine Erfahrung mit meinen Kunden. Und darum löse ich alles normalisiert wenns irgendwie geht. Später war ich mir schon viele male selber Dankbar.

Aber eben. Auch deine Lösung führt zu deinem Ziel. Sie ist für den Einzelfall elegant schlank.

WIe du es umsetzt, dass musst du am Ende wissen.
 
Ich danke dir.

Werde mir mit dem Aufbau nochmal ein bisschen Zeit lassen und ganz in Ruhe über alles (? ? ? ?) nachdenken.
 
Zurück