Ich zeige Zeilen aus einer Datenbank (SQL SERVER 2005) -Tabelle in einer Webseite an. Diese Zeilen enthalten eine StatusID (Fremdschlüssel), die durch die Statustabelle (z. B. ID, Name, ModifiedDate) definiert wird.
Die verschiedenen Status sollten unterschiedlich angezeigt werden (sagen wir, sie haben einfach eine andere Hintergrundfarbe).
Ich verwende PHP, um die Datenbank abzufragen und die Webseitentabelle zu erstellen. Während ich die Tabelle erstelle, werde ich eine CSS-Klasse auf ein Element basierend auf dem Status dieser Zeile anwenden.
Ich habe mindestens 2 Möglichkeiten, dies zu tun:
Definieren Sie Code-Logik in der PHP, um es zu behandeln, und wenn die Status in der Datenbank geändert werden, muss ich den Code ändern.
Speichern Sie die "Klasse" in der Datenbank und wenden Sie einfach die Klasse an, die gespeichert wurde.
Die letztere Option scheint mir besser zu sein, aber ich bin unsicher, ob die Einbettung von Präsentationsdaten in die Datenbank eine schlechte Design-Wahl ist. Dies wird die Grundlage sein, auf der ich mehrere Intranet-Dienstprogramme erstelle, und ich möchte auf dem rechten Fuß beginnen.
Es ist nichts falsch daran, Daten in der Datenbank einschließlich der Präsentationsdaten zu speichern. Wenn es Ihnen hilft, effektive Ergebnisse zu erzielen, während Sie weniger Code schreiben, ist es eine gute Übung. Sie müssen sicherstellen, dass Sie Ihre Präsentationslogik nicht mit Ihrer Datenbanklogik kombinieren.
Sie können sicherstellen, dass diese Probleme getrennt werden, indem Sie die Daten für Ihre Präsentationsschicht in die Eigenschaften eines Objekts elementInfo
kapseln (z. B.).
Da es sich um eine CSS-Klasse handelt, von der Sie sprechen, sollten diese Präsentationsdaten getrennt von den Geschäftsdaten aufbewahrt werden. Obwohl es in Ordnung ist, sowohl Präsentations- als auch Geschäftsdaten in der Datenbank zu speichern, ist es nicht akzeptabel, sie in derselben Tabelle zu speichern.
Aktualisieren re: comment Nein, Sie sollten keine PresentationClassRecord-ID als FK für das Geschäftsobjekt hinzufügen. Ich habe eine Probe einer Annäherung an die Datenbank unten gemacht. Ich habe die DummyTable
Ihrer Geschäftsobjekte aufgerufen, und der Rest folgt der Spezifikation. Der relevanteste Teil ist StatusPresentationAssignmentTable
Jetzt können Sie mit zwei einfachen Join-Klauseln die Präsentationsdaten erhalten und sie ist vollständig von Ihren Geschäftsdaten entkoppelt. Ihr Skript könnte etwas tun, um zu prüfen, ob der Status des Dummy irgendwelche Präsentationszuweisungen hat. Wenn dies der Fall ist, wird der PresentationType betrachtet, die entsprechende Funktion zum Anwenden der Präsentationsdaten auf die Präsentation abgerufen und ausgeführt. (Sie müssen für jeden PresentationType eine Funktion haben, die mit dem Wert umzugehen weiß - etwas, das von etwas wie function applyPresentationValue(presentationElement, presentationType, presentationValue)
eingekapselt werden könnte, das eine andere Funktion applyCssClass(presentationElement, value)
aufruft, wenn presentationType == "CssClass"
).
Die Klasse selbst ist nicht wirklich Präsentationsdaten. Es ist nur ein Etikett für jede Art von Status. Sie könnten es theoretisch für viele andere Dinge verwenden, anstatt zu entscheiden, welche Farbe der Status haben soll, wenn er auf einer Webseite erscheint.
Wenn Sie diese Klasse mit einer bestimmten Gruppe von Stilen kombinieren, dann , handelt es sich um Präsentationsinformationen. Und das tun Sie in Ihrer CSS-Datei, nicht in der Datenbank.
Allerdings müssen Sie bei Option 1 Ihren PHP-Code nicht unbedingt ändern, wenn sich die Status in der Datenbank ändern. Dein PHP könnte einfach den Klassennamen aus dem id
oder name
des Status erzeugen. Ihr CSS müsste sich ändern, wenn sich die ID / der Name eines Status ändert, aber ist das wahrscheinlich? Sollte nicht jeder Status konstant bleiben, wenn neue Status hinzugefügt werden, wenn es Änderungen an den Status gibt, die die Anwendung darstellen muss?
Obwohl Sie die CSS-Klasseninformationen in der Datenbank speichern können, tun dies viele Content-Management-Systeme. Sie machen den Status wahrscheinlich am besten zu einem Teil des Klassennamens.
d. Status = offen, geschlossen Verwenden Sie PHP-Logik zum Generieren der Tabellenzeilen und setzen Sie die CSS-Klasse auf status_ {Name} dann jedes Mal, wenn Sie einen neuen Status hinzufügen oder umbenennen, müssen Sie nur die CSS-Datei hinzufügen / bearbeiten, keine php recoding erforderlich.
.status_open{background-color:green;}
.status_closed{background-color:red;}
Ich sehe Vor- und Nachteile für die Speicherung in der DB. Natürlich ist es praktisch, die Klasseninformationen dort zu haben, aber es ist nicht wirklich Teil der Anwendung.
Ich würde mich darauf konzentrieren, es nicht dort zu speichern und etwas in der Präsentationsebene zu tun, um es basierend auf dem Status zu behandeln. Meine Argumentation liegt darin, dass die Daten, insbesondere da Sie Dienstprogramme erstellen, über eine API oder etwas später, wo die Klasse sinnlos ist, verwendet werden können.
Tags und Links sql css php database sql-server-2005