XxNeleXx: MySQL Datenbank Strucktur für Settings

Guten Abend,

ich bin gerade dabei eine Datenbank aufzubauen für Settings die ich auf meiner WebSeite benötige wie z.B. Titel der Seite, Daten für das Impressum usw. Derzeit sieht diese wie folgt aus:

CREATE TABLE IF NOT EXISTS settings (
  set\_id int(11) NOT NULL AUTO_INCREMENT,
  set\_titel varchar(200) NOT NULL,
  PRIMARY KEY (set\_id)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

aber ich habe das Gefühl, dass ich mit dieser Struktur auf der falsch liege oder? Denn ich kann ja nicht jedes Feld anlegen oder?

Mein Gedanke war so:

  
//Settings auslesen  
$seiten_settings = "SELECT * FROM settings";  
$out_settings = mysql_fetch_object(mysql_query($seiten_settings));  

und lese die Werte dann so aus:

  
<?php echo $out_settings->set_titel?>  

wenn ich aber jeden Wert in eine Spalte lege, dann wird diese verdammt lang. Wie würdet ihr dieses machen? Und wie kann ich solltet ihr dieses anderes machen, die einzelnen Werte auslesen?

  1. Hello,

    ich bin gerade dabei eine Datenbank aufzubauen für Settings die ich auf meiner WebSeite benötige wie z.B. Titel der Seite, Daten für das Impressum usw. Derzeit sieht diese wie folgt aus:

    CREATE TABLE IF NOT EXISTS settings (
      set\_id int(11) NOT NULL AUTO_INCREMENT,
      set\_titel varchar(200) NOT NULL,
      PRIMARY KEY (set\_id)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

    anstatt set_id nimm id, statt set_title title. Das Präfix set_ ist völlig unnötig.

    aber ich habe das Gefühl, dass ich mit dieser Struktur auf der falsch liege oder? Denn ich kann ja nicht jedes Feld anlegen oder?

    Warum nicht? Warum kannst du nicht jedes Feld anlegen?

    Mein Gedanke war so:

    //Settings auslesen
    $seiten_settings = "SELECT * FROM settings";
    $out_settings = mysql_fetch_object(mysql_query($seiten_settings));

      
    Wenn dsa mit PHP so geht, ist das doch ne tolle Sache! Allerdings Variable besser $settings nennen.  
      
    
    > und lese die Werte dann so aus:  
    >   
    > ~~~php
      
    
    > <?php echo $out_settings->set_titel?>  
    > 
    
    

    Gut. Vielleicht noch ein Semikolon hinter $out_settings->set_titel

    wenn ich aber jeden Wert in eine Spalte lege, dann wird diese verdammt lang. Wie würdet ihr dieses machen? Und wie kann ich solltet ihr dieses anderes machen, die einzelnen Werte auslesen?

    Wieviele Parameter sollen es denn sein? Wenn es zuviele sind, würde man kategorisch ordnen und einzelne Tabellen für diese Kategorien anlegen, zb. settings_colors oder settings_admin.
    Danach mit JOIN alles selecten und dann auslesen mit $out_settings->color_head oder was auch immer. Keep it simple, stupid!

    1. Hallo

      ich bin gerade dabei eine Datenbank aufzubauen für Settings die ich auf meiner WebSeite benötige wie z.B. Titel der Seite, Daten für das Impressum usw. Derzeit sieht diese wie folgt aus:

      CREATE TABLE IF NOT EXISTS settings (

      set_id int(11) NOT NULL AUTO_INCREMENT,
        set_titel varchar(200) NOT NULL,
        PRIMARY KEY (set_id)
      ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

      
      > >   
      > > und lese die Werte dann so aus:  
      > > …  
      > > wenn ich aber jeden Wert in eine Spalte lege, dann wird diese verdammt lang. Wie würdet ihr dieses machen? Und wie kann ich solltet ihr dieses anderes machen, die einzelnen Werte auslesen?  
      >   
      > Wieviele Parameter sollen es denn sein? Wenn es zuviele sind, würde man kategorisch ordnen und einzelne Tabellen für diese Kategorien anlegen, zb. settings\_colors oder settings\_admin.  
        
      An der Stelle, so sich die Struktur der Settings nicht unterscheidet, würde ich bei einer Tabelle bleiben und diese gegebenenfalls um N Spalten erweitern, die z.B. Kategorien oder eine Unterschiedung für Admin- und sonstige Aufgaben aufnehmen. Allerdings ist eine numerische ID zur Unterscheidung der Settings mMn wenig aussagekräftig. es darf auch ein Name sein, anhand dessen aus den Ergebnissen ein PHP-Array erstellt wird. Jede Einstellung ist hier eine eigene Zeile/ein eigener Datensatz, wie es sich gehört.  
        
      Mal ein Beispiel (prozedural und mit unegalen Namen zur Veranschaulichung):  
        
      ~~~php
      while ($row = mysql_fetch_assoc($resultSettings)) {  
          $r[$row['settingname']] = array($row['settingvalue'], $row['settingcategory'], $row['settinggroup']);  
          }
      

      Keep it simple, stupid!

      Nicht wahr!? ;-)

      Tschö, Auge

      --
      Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
      Terry Pratchett, "Wachen! Wachen!"
      ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
      Veranstaltungsdatenbank Vdb 0.3
      1. Hi,

        Wieviele Parameter sollen es denn sein? Wenn es zuviele sind, würde man kategorisch ordnen und einzelne Tabellen für diese Kategorien anlegen, zb. settings_colors oder settings_admin.

        An der Stelle, so sich die Struktur der Settings nicht unterscheidet, würde ich bei einer Tabelle bleiben und diese gegebenenfalls um N Spalten erweitern, die z.B. Kategorien oder eine Unterschiedung für Admin- und sonstige Aufgaben aufnehmen. Allerdings ist eine numerische ID zur Unterscheidung der Settings mMn wenig aussagekräftig. es darf auch ein Name sein, anhand dessen aus den Ergebnissen ein PHP-Array erstellt wird. Jede Einstellung ist hier eine eigene Zeile/ein eigener Datensatz, wie es sich gehört.

        Mal ein Beispiel (prozedural und mit unegalen Namen zur Veranschaulichung):

        while ($row = mysql_fetch_assoc($resultSettings)) {

        $r[$row['settingname']] = array($row['settingvalue'], $row['settingcategory'], $row['settinggroup']);
            }

        
        >   
          
        das mag für Privatzwecke dienlich sein, für Administrationsparameter professioneller Webplatformen völlig ungeignet. 
        
        1. Hallo

          Mal ein Beispiel (prozedural und mit unegalen Namen zur Veranschaulichung):

          while ($row = mysql_fetch_assoc($resultSettings)) {

          $r[$row['settingname']] = array($row['settingvalue'], $row['settingcategory'], $row['settinggroup']);
              }

          
          > >   
          >   
          > das mag für Privatzwecke dienlich sein, für Administrationsparameter professioneller Webplatformen völlig ungeignet.  
            
          Wenn du weißt, was ich nicht weiß, dann sei es so.  
            
          Tschö, Auge  
          
          -- 
          Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.  
          Terry Pratchett, "Wachen! Wachen!"  
            
          ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}  
            
          [Veranstaltungsdatenbank Vdb 0.3](http://termindbase.auge8472.de/)
          
        2. Mahlzeit,

          das mag für Privatzwecke dienlich sein, für Administrationsparameter professioneller Webplatformen völlig ungeignet.

          Kannst du mal Logik in diese unlogische Aussage bringen?

          --
          42
          1. Tach,

            das mag für Privatzwecke dienlich sein, für Administrationsparameter professioneller Webplatformen völlig ungeignet.

            Kannst du mal Logik in diese unlogische Aussage bringen?

            wenn du mir die Unlogik nachweist, gerne. Ansonsten hat Auge natürlich recht, für ein paar Parameter mehr erweitert man die Tabelle um ein paar Spalten und gut ist. Nur als Allgemeinaussage wollte ich das so nicht stehen lassen.

            1. Mahlzeit,

              Nur als Allgemeinaussage wollte ich das so nicht stehen lassen.

              Aber genau in deiner Pauschalaussage liegt die Unlogik. Denn es gibt auch im professionellen Bereich Anwendungen, bei denen eine solche Struktur völlig ausreicht.

              Wenn du also eine Pauschalaussage mit einer Pauschalaussage entkräften willst, bist du unlogisch.

              --
              42
              1. Tach,

                Nur als Allgemeinaussage wollte ich das so nicht stehen lassen.

                Aber genau in deiner Pauschalaussage liegt die Unlogik. Denn es gibt auch im professionellen Bereich Anwendungen, bei denen eine solche Struktur völlig ausreicht.

                Wenn du also eine Pauschalaussage mit einer Pauschalaussage entkräften willst, bist du unlogisch.

                Mimimimi. Ist ja gut jetzt, Schlaumeier.

                1. Mahlzeit,

                  Mimimimi. Ist ja gut jetzt, Schlaumeier.

                  Kann ich aus deiner Antwort schliessen, dass du meiner Argumentation nichts engegenzusetzen hast?
                  In diesem Fall werd ich deine Aussagen unter "Klugschiss" verbuchen un im Rundordner ablegen.

                  --
                  42
                  1. Mimimimi. Ist ja gut jetzt, Schlaumeier.

                    Kann ich aus deiner Antwort schliessen, dass du meiner Argumentation nichts engegenzusetzen hast?
                    In diesem Fall werd ich deine Aussagen unter "Klugschiss" verbuchen un im Rundordner ablegen.

                    Argumentation? Argumentation, mein Lieber, Argumentation ist was anderes. Der Rest, zu diesem wie auch vielen anderen Themen, nichts als Blech und heiße Luft.

                    1. Mahlzeit,

                      Argumentation? Argumentation, mein Lieber, Argumentation ist was anderes. Der Rest, zu diesem wie auch vielen anderen Themen, nichts als Blech und heiße Luft.

                      Traurig, dass du nur versuchst dich rauszureden, anstatt zu deinem Wort zu stehen.
                      Aber es bestätigt meine Meinung, dass du zwar laberst, wenn du nach einer Begründung gefragt wirst, dazu nicht fähig bist.
                      Deine Beleidigungen helfen dir da auch nicht. Selbst wenn deine Aussage zutreffen würde, es wäre keine Entschuldigung für dein Verhalten.

                      BTW: Dein Nick verrät schon einiges. Mit roher Gewalt gegen alles. Ja, der Name passt zu dir.

                      --
                      42
        3. Mal ein Beispiel (prozedural und mit unegalen Namen zur Veranschaulichung):

          while ($row = mysql_fetch_assoc($resultSettings)) {

          $r[$row['settingname']] = array($row['settingvalue'], $row['settingcategory'], $row['settinggroup']);
              }

          
          > das mag für Privatzwecke dienlich sein, für Administrationsparameter professioneller Webplatformen völlig ungeignet.  
            
          Du und M. scheint euch ja momentan den "Klugscheißer-Peter" gegenseitig zu zu schieben (darauf möchte ich nicht weiter eingehen), aber, da ich deine Aussage nicht wirklich verstehe, kannst du mir erklären, was daran so ungeeignet ist?  
            
          MfG  
          bubble
          
          -- 
          If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
          
  2. hi,

    aber ich habe das Gefühl, dass ich mit dieser Struktur auf der falsch liege oder?

    Ne, falsch ist das nicht, aber...

    Denn ich kann ja nicht jedes Feld anlegen oder?

    ...genau hier liegt der Karnickel in der Pfeffersoße: Dein Programm wird vom DB-Design abhängig und Änderungen am Programm erfordern Änderungen am DB-Design.

    wenn ich aber jeden Wert in eine Spalte lege, dann wird diese verdammt lang. Wie würdet ihr dieses machen? Und wie kann ich solltet ihr dieses anderes machen, die einzelnen Werte auslesen?

    So mancher DB-Designer kennt da nix und legt Tabellen an mit 20..50 Spalten, das wird jedoch sehr schnell zu Schrott. Eine mögliche andere Lösung besteht darin, eine Basistabelle zu haben und eine weitere, nicht normalisierte Tabelle für die Attribute.

    Die Basistabelle hat nur eine Handvoll Felder, eine Abfrage select * from ... where id = ... liefert performante Abfragen und eine Liste weniger Attribute für eine bestimmte ID. An dieser Tabelle ist nur selten was zu ändern und die Datenmengen der Abfragen sind klein, womit auch mehrere solcher Array's im Hauptspeicher liegen können, auch bei jedem Request.

    Das Los der Attribute hingegen, wird nur dann geladen, wenn es tatsächlich gebraucht wird. Das ist dann eine größere Liste und u.U. sind da auch größere Datenmengen je Attribut drin, wie z.B. der BODY für die Response. Es gibt Modelle für die Datenabstraktion, da wird aus der Sicht der Anwendung ein komplettes Array aus der DB geholt und nicht etwa einzelne Werte abgefragt. Ein solches Array ist assoziativ, die Namen der Attribute haben mit DB-Feldnamen nichts mehr gemeinsam. Die Attribute liegen namentlich in einer Tabelle mit dem zugehörigen Wert, das Modell heißt Entity-Attribute-Value, das ist recht einfach zu implementieren.

    Gus