Wie "Settings" Tabelle realisieren?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Wie "Settings" Tabelle realisieren?

    Ich würde gerne darüber diskutieren, wie man am Besten eine Tabelle für Einstellungen realisiert.

    Ich benutze ein ORM, welches mir eine Zeile aus einer Tabelle als Klasse mit gettern und settern gibt. Desweiteren werden mehrere Zeilen aus der Tabelle als Array von Klassen synthetisiert.
    Die Klassen generiere ich anhand des Schemas automatisch, wobei die vorhandene Tabelle und deren Daten gelöscht werden.

    Jetzt benötige ich eine Tabelle für diverse Einstellungen, es ist noch nicht exakt absehbar, wieviele und es ist wahrscheinlich, dass die Anzahl wachsen wird.
    Nun kann ich das in zwei Arten umsetzen:
    1. Eine Zeile pro Benutzer, es gibt dann Spalten wie sendeEmail, zeigeName, usw die alle als boolean existieren (Schema: user_id(pk), einstellung1, einstellung2, ...)
    2. Es gibt mehrere Zeilen pro Benutzer mit den Spalten type und value (Schema: id(pk), user_id(pk,fk), type, value)

    pk: Primary key
    fk: Foreign key
    (nur für den Fall )

    Zu 1
    Vorteile:
    Ein Primary key. Generierte Klasse "Setting" hat alle getter und setter der Einstellungen, das ermöglicht implizites Wissen über die Einstellungen, getSendeEmail, setSendeEmail, usw...
    Query ist simpel, ich bekomme ein einziges Setting Objekt, Verwaltung muss alle getter durchgehen, um die Werte zu bekommen (kann automatisiert werden)
    Nachteile:
    Neue Einstellung erfordert Anpassung des Schemas, was in der Regel eine Neugenerierung der Tabellen erfordert->Datenverlusst. Ich muss manuell zusehen, dass evtl im Produktivbetrieb gemacht Einstellungen 'portiert' werden und neue Sachen defaulten.

    Zu 2
    Vorteile: Generische Erzeugung von neuen Einstellungen, Schema bleibt dadurch unverändert. Kein Datenverlust durch Neugenerierung, keine Portierung vorhandener Daten.
    Nachteile: Kein implizites Wissen über Einstellungen, es gibt nur getType und getValue. Die Logik muss auf Appliktionsseite verwaltet werden. Probleme wie sendeEmail und sendeMail müssen explizit verhindert werden. Daraus folgt erschwerte Verwaltung. Zusammengesetztes Primary key aus id und user_id, alternativ auch type und user_id. Ich kriege ein Array von Setting Objekten (mehr Datentransfer und mehr Objekte, die durchs ORM müssen), die ich zusätzlich durch mehr Aufwand verarbeiten muss.

    Ich tendiere im Moment, da in der Entwicklung zu Lösung 1. Ich bin relativ frei mit der Erzeugung neuer Einstellungen, da keine Benutzerdaten existieren. In Prod muss ich dann das neue Schema mit Alter Table ändern, um Daten nicht zu verlieren. Für ein langfristiges Projekt wie dieses ist das Schema auch die Dokumentation, ich kann nie vergessen, welche Einstellungen bereits drin sind.

    Ich würde mich über ein paar Kommentare sehr freuen
    Zuletzt geändert von Seikilos; 05.01.2010, 13:06.
    SQL Injection kitteh is...

  • #2
    Hallo,

    Variante 1 ist aus den von dir genannten Gründen unvorteilhaft. Variante 2 finde ich besser, aber leicht abgewandelt: Statt den Eigenschaftsnamen als varchar in die Tabelle zu schreiben, könntest du einen Fremdschlüssel auf eine Eigenschaftsnamentabelle setzen. Dadurch legst du fest, welche Namen erlaubt sind und Tippfehler können nicht passieren. Trotzdem bleibt es leicht erweiterbar.

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Hallo,
      danke für den Tipp.
      Ich hab an FKs nicht gedacht, weil ich die Settings bei jedem HTTP Request brauche, um für den User die Einstellungen gemäß seiner Daten vornehmen zu können.
      Settings hätten FKs auf eine Relation Type. Ok, extra Queries kann man hier wohl mit nem Join verhindern.
      Wie man merkt, versuch ich an dieser Stelle so sparsam wie möglich mit Anfragen zu sein, aber ich hoffe nicht, dass so ein Join erheblich mehr aufwand machen würde.
      Allerdings wäre die "Type" Relation einspaltig, oder? Komische Tabelle
      SQL Injection kitteh is...

      Kommentar


      • #4
        Du könntest die Type-Spalte auch als SET oder ENUM definieren.

        Kommentar


        • #5
          Damit ändere ich aber das Schema der Settings tabelle bei neuen Einträgen und das hat eine neue Generierung und den Datenverlust von Fall 1 zur Folge
          SQL Injection kitteh is...

          Kommentar


          • #6
            Zitat von Seikilos Beitrag anzeigen
            Allerdings wäre die "Type" Relation einspaltig, oder? Komische Tabelle
            Zweispaltig: "id" und "name"
            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar


            • #7
              Ja. Musst dich eben entscheiden, was dir besser gefällt - Risiko des Datenverlusts oder einspaltige Tabelle und zusätzlicher Join. Ich wollte es nur mal erwähnen ...

              @Amica: Id wäre überflüssig oder? Braucht man nur, wenn man name auch mal ändern möchte (und diese Änderung nicht per Constraint in die Settings-Tabelle propagieren kann).

              Kommentar


              • #8
                Zitat von AmicaNoctis Beitrag anzeigen
                Zweispaltig: "id" und "name"
                Damit ich so etwas machen kann:
                1 sendeEmail
                2 sendeMail



                @onemorenerd: Danke für die Erwähnung!
                Das ist ne schwere Entscheidung, weil der Join durchs ORM nicht ganz trivial ist
                SQL Injection kitteh is...

                Kommentar

                Lädt...
                X