php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 05-01-2010, 13:00
Seikilos
 Registrierter Benutzer
Links : Onlinestatus : Seikilos ist offline
Registriert seit: May 2003
Ort: Vor meinem Computer
Beiträge: 498
Seikilos ist zur Zeit noch ein unbeschriebenes Blatt
Standard 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
__________________
SQL Injection kitteh is...

Geändert von Seikilos (05-01-2010 um 13:06 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 05-01-2010, 14:54
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

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
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #3 (permalink)  
Alt 05-01-2010, 15:01
Seikilos
 Registrierter Benutzer
Links : Onlinestatus : Seikilos ist offline
Registriert seit: May 2003
Ort: Vor meinem Computer
Beiträge: 498
Seikilos ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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...
Mit Zitat antworten
  #4 (permalink)  
Alt 05-01-2010, 15:11
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Du könntest die Type-Spalte auch als SET oder ENUM definieren.
Mit Zitat antworten
  #5 (permalink)  
Alt 05-01-2010, 15:12
Seikilos
 Registrierter Benutzer
Links : Onlinestatus : Seikilos ist offline
Registriert seit: May 2003
Ort: Vor meinem Computer
Beiträge: 498
Seikilos ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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...
Mit Zitat antworten
  #6 (permalink)  
Alt 05-01-2010, 15:19
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von Seikilos Beitrag anzeigen
Allerdings wäre die "Type" Relation einspaltig, oder? Komische Tabelle
Zweispaltig: "id" und "name"
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #7 (permalink)  
Alt 05-01-2010, 15:19
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

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).
Mit Zitat antworten
  #8 (permalink)  
Alt 05-01-2010, 15:20
Seikilos
 Registrierter Benutzer
Links : Onlinestatus : Seikilos ist offline
Registriert seit: May 2003
Ort: Vor meinem Computer
Beiträge: 498
Seikilos ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
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...
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
5x Praktikum: "Marketing" oder "Webdesign" o. "Kommunikation" ... transparent Jobgesuche 4 18-06-2007 17:02
Mysql einrtag bei <input type="submit" name="Submit" value="Posten" Mathes HTML, JavaScript, AJAX, jQuery, CSS, Bootstrap, LESS 1 05-07-2006 16:05
Mit PHP "Spielrunden" realisieren? Lettort PHP Developer Forum 17 30-05-2006 17:12
"Massenmail" Realisieren? Canadian121 Apps und PHP Script Gesuche 5 21-05-2004 11:31
Newsscript: "Maxlenght" in PHP realisieren? Shelak PHP Developer Forum 2 23-06-2001 16:14

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:05 Uhr.