SQL Tabellenstruktur bei unterschiedlichen Datentypen

lordg2009

Lt. Commander
Registriert
Apr. 2009
Beiträge
1.503
Hi,

ich möchte für mein kleines Heimprojekt (HTML, PHP, SQL) eine Tabelle in der Datenbank um globale Einstellungen zu speichern. Im Sinn schwebt mir da eine Tabelle mit der Struktur und beispielwert:

tablename: settings
idsetting_namesetting_value
1bg_color'#f0f0f0'

Jetzt sollen aber jederzeit weitere Einstellungen von mir hinzugefügt werden können und diese haben unterschiedliche Datentypen (int, double, string). Was wäre jetzt der Beste Weg, dies zu realisieren?

Ich könne mir vorstellen:
1) Man legt für jeden Datentyp eine Spalte an und verweist in einer zusätzlichen Spalte auf den genutzen Datentyp:
idsetting_namedata_typesetting_stringsetting_doublesetting_int
1'bg_color''string''#f0f0f0'NULLNULL
2'visitor_counter''int'NULLNULL195

2) Man speichert alle Werte als VARCHAR und konvertiert dann mittels PHP in den entsprechenden Datentyp
idsetting_namedata_typesetting_value
1'bg_color''string''#f0f0f0'
2'visitor_counter''int''195'

Welches Konzept ist in einem solchen Fall zu empfehlen?
 
Zuletzt bearbeitet:
wohl eher das letztere.. das andere is nicht normalisiert..
wieso willst du die values denn noch casten? ist doch php und egal..

und nenn die felder in deiner settings tabelle nicht settings_name und settings_value.. sondern nur name und value.. ist sonst etwas redundant..
 
Zuletzt bearbeitet von einem Moderator:
Wozu? Wann bzw. weshalb genau brauchst du unterschiedliche Typen? PHP ist eh weakly typed, dem sind die Datentypen quasi vollkommen egal. Wann genau brauchst du 9 statt "9"?
 
Die Tabelle bekommt nur zwei Spalten: Name und Value.
​UNIQUE Index auf Name und fertig.


​Und Value machst du varbinary und speicherst mit PHP-serialize rein und mit PHP-unserialize wieder raus.

​Vorteil: Du kannst wirklich alles drin abspeichern, Arrays, Objekte,... und die Typen bleiben erhalten.
 
Hancock schrieb:
​Und Value machst du varbinary und speicherst mit PHP-serialize rein und mit PHP-unserialize wieder raus.

​Vorteil: Du kannst wirklich alles drin abspeichern, Arrays, Objekte,... und die Typen bleiben erhalten.
mach das bitte nicht.. und nutz eine sql datenbank wie eine sql datenbank.. ;)
 
@kling1
Ja, damit nutz man die SQL-Datenbank wie ne INI, aber ne SQL-Datenbank für globale Einstellungen zu verwenden ist auch nicht gerade das, wo Datenbanken glänzen.

​wie wärs denn mit dem Joomla-Konzept: eine configuration.php, welche includiert wird und alle Einstellungen enthält. Ein Programm zu schreiben, welches bei Änderungen die configuration.php neu schreibt, ist auch schnell geschrieben. ​:evillol: :mussweg:
 
Wie gesagt, ist bei mir nur hobby.

Die Daten werden dann als json weitergegeben und in javascript verarbeitet. Ich dachte, damit die daten für javascript den richtigen Typ haben, müssen Sie im json ints ohne "" und strings mit "" versehen werden und dafür die PHP Typen gekastet werden, da php sich beim erstellen eines json ja aus dem Kontext nicht erschließen kann, ob ich die Daten als String, oder als int brauche.
Ergänzung ()

Hancock schrieb:
@kling1
Ja, damit nutz man die SQL-Datenbank wie ne INI, aber ne SQL-Datenbank für globale Einstellungen zu verwenden ist auch nicht gerade das, wo Datenbanken glänzen.

​wie wärs denn mit dem Joomla-Konzept: eine configuration.php, welche includiert wird und alle Einstellungen enthält. Ein Programm zu schreiben, welches bei Änderungen die configuration.php neu schreibt, ist auch schnell geschrieben. ​:evillol: :mussweg:

würde es lieber über die Datenbank lösen, sonst habe ich noch eine weitere Instanz, die ich verwalten muss, inklusive des einlesen und auslesen der ini. Mit SQL wäre alles in meiner mariaDB
 
Eine "best practise" gibt es da wohl nicht. Das eine verstößt gegen die gute Sitte, was Datentypen angeht, das andere, was die Verwendung von Datenbanken angeht.

Ich persönlich würde den Ansatz über

idsetting_namedata_typesetting_value
1'bg_color''string''#f0f0f0'
2'visitor_counter''int''195'

ebenfalls bevorzugen. Es ist von allen genannten das mit dem größten Mehrwert und den geringsten "Stilbrüchen".
 
Wie wäre es mit einer Tabelle wo du nur eine Zeile haben kannst und x Spalten? Wenn du eine neue Einstellung brauchst, dann machst du einfach eine neue Spalte. Ist etwas komplizierter, aber der Umfang hält sich in Grenzen. Wenn du dann doch mal mit mehreren Clients auf die selbe Datenbank musst kannst du für jeden Client einfach eine neue Zeile hinzufügen.
 
Zurück
Oben