php.de

Zurück   php.de > Webentwicklung > Software-Design

Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 2 Stimmen, 4,00 durchschnittlich.
Alt 15.06.2011, 18:26  
Neuer Benutzer
 
Registriert seit: 14.11.2009
Beiträge: 17
PHP-Kenntnisse:
Fortgeschritten
Jan M. befindet sich auf einem aufstrebenden Ast
Jan M. eine Nachricht über Skype™ schicken
Standard Struktur für Benutzeraktivitäten

Hallo PHP-Freunde,

der Titel mag merkwürdig klingen, ich nenne zu Anfang mal direkt ein Beispiel.Vielen Facebook-Nutzern wird dies sehr bekannt vorkommen:
Zitat:
Hans Peter wrote "Hey, wie gehts dir?" on Tom Peter's wall.
Ich möchte allgemein Aktivitäten (erstellen,löschen,bearbeiten) in einem Forum speichern, und zwar für Themen und Beiträge. Das sollte so aussehen:
Zitat:
Hans Peter hat einen Beitrag zum Thema "PHP Fehler" geschrieben.
Themen und Beiträge sind als Objekte realisiert

PHP-Code:
class Board_Topic
{
        public 
$Id;
        public 
$AuthorId;
        public 
$Title;
        ....
}

class 
Board_Post
{
        public 
$Id;
        ....

Wie also am besten diese drei Aktivitäten für beide Objekte speichern?

Meine Idee ist ein neues Objekt Activity
PHP-Code:
class Board_Activity
{
        public 
$Id;
        public 
$ObjectId//Referenz auf ...
        
public $ObjectType// ... Post oder Topic?
        
public $ActivityType// erstellen / bearbeiten / löschen
        
....

Die MySql-Tabelle sähe dann entsprechend dem Objekt so aus (ich bleibe bei dem Beispiel von oben):
PHP-Code:
+----+----------+-------------+----------+--------------+
Id ObjectId ObjectType  AuthorId ActivityType |
+----+----------+-------------+----------+--------------+
1  15       Board_Post  26       created      |
+----+----------+-------------+----------+--------------+ 
So kann ich jetzt aber z.B. gar keine Foreign-Keys benutzen, etc. Wäre evtl. doch eine Tabelle für jedes Objekt (Board_Topic, Board_Post) sinnvoll? Diese müssten dann natürlich bei der Ausgabe wieder wild durcheinander gewürfelt werden, zudem wäre es leichter diese Struktur zu erweitern (z.B. Bilder o.ä.).

Vielleicht habt ihr ja noch eine ganz andere Idee?!
Ich bin wie immer für jede Idee und jeden Tipp dankbar =).

Gruß,
Jan
Jan M. ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 15.06.2011, 19:18  
Erfahrener Benutzer
 
Benutzerbild von dreamcatcher
 
Registriert seit: 28.12.2010
Beiträge: 603
PHP-Kenntnisse:
Anfänger
dreamcatcher wird schon bald berühmt werden
Standard

Erstmal gratuliere ich dir zu einem sehr schönen Post.
Sehr durchschaubar, strukturiert, sauber und ohne unwichtiges Zeug.

Muss ja auch mal gelobt werden
__________________________________________________ _______________


Ich würde es ganz von dem Einsatz abhängig machen.

Ob du ggf. später nochmals die Daten zu anderen Zwecken nutzt (Statistikerhebung o.Ä.) und sich solch ein relationales Verhältnis der Tables (ggf. später) auszahlt.

Für solch ein simples Beispiel wie deins kann ggf. sogar keine Tabletrennung nötig sein.

Meine Evaluierung:

1.)
Zwei Tabellen nutzen

Advantage:
- Foreign-Keys nutzbar
- "Saubere/Strikte" Aktivitätentrennung
- Saubere Erweiterungen möglich

Disadvantage:
- Höchster Performanceverlust* im Vergleich

2.)
Eine Tabelle nutzen mit allen Aktivitätsaufzeichnungen

Advantage:
- Saubere Erweiterungen möglich

Disadvantage:
- Nicht so sauber wie Variante 1, z.B. bei Statistikerhebungen müsste man ggf. die Query auf ein bestimmtes Feld anpassen (Beispiel: ObjectType wird BoardPost gesucht)
- Erhöhter Performanceverlust im Vergleich*

3.)
Keine extra Tabelle nutzen und ein "Created on" Timestamp o.Ä. hinzufügen


Advantage:
- Keine extra Tables, dadurch keine extra Objekte
- Einfache Integration durch Erweiterung der bestehenden Klasse

Disadvantage:
- Bei möglichen Erweiterungen zum "Akitivitätstracking" wird die Table ggf. unsauber


*
Ich gehe logisch davon aus, dass der Zugriff auf mehrere Tables mehr Zeit in Anspruch nimmt als den Datensatz gleichzeitig aus der gleichen Row/Table (Je nachdem was noch angefragt wird) zu fetchen.
Bitte um sachliche Korrektur und erweiterung meines Horizontes, sollte diese Annahme falsch sein.

Geändert von dreamcatcher (15.06.2011 um 19:31 Uhr).
dreamcatcher ist offline   Mit Zitat antworten
Alt 15.06.2011, 19:23  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.994
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Die erste Entscheidung wäre wohl, ob Du loggen willst:

Code:
Beitrag FooBar wurde erstellt von H-P
Beitrag Baz wurde erstellt von Eule
Beitrag FooBar wurde editiert von H-P
Beitrag FooBar wurde editiert von H-P
…
Beitrag Baz wurde gelöscht von H-P
oder nur die jeweils letzte Aktivität speichern willst.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 15.06.2011, 20:27  
Neuer Benutzer
 
Registriert seit: 14.11.2009
Beiträge: 17
PHP-Kenntnisse:
Fortgeschritten
Jan M. befindet sich auf einem aufstrebenden Ast
Jan M. eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von dreamcatcher Beitrag anzeigen
Erstmal gratuliere ich dir zu einem sehr schönen Post.
Sehr durchschaubar, strukturiert, sauber und ohne unwichtiges Zeug.

Muss ja auch mal gelobt werden
Danke

Zitat:
Zitat von dreamcatcher Beitrag anzeigen
Für solch ein simples Beispiel wie deins kann ggf. sogar keine Tabletrennung nötig sein.
Ich gebe zu, so simpel wird es nicht bleiben, ich wollte es nur nicht unnötig aufblähen, da das Prinzip eigentlich das selbe bleiben sollte, auch wenn jetzt noch ein paar mehr Objekte hinzukommen (Bilder, Kommentare, ...). Es werden am Ende zwischen vier und sechs verschiedene Objekt-Typen sein.

Zitat:
Zitat von dreamcatcher Beitrag anzeigen
1.)
Zwei Tabellen nutzen

Advantage:
- Foreign-Keys nutzbar
- "Saubere/Strikte" Aktivitätentrennung
- Saubere Erweiterungen möglich

Disadvantage:
- Höchster Performanceverlust* im Vergleich
Siehe oben, es könnten auch mehr als zwei Tabellen werden (das ging aus meinem Startpost nicht hervor), die Vorteile bleiben aber natürlich.

Zitat:
Zitat von dreamcatcher Beitrag anzeigen
3.)
Keine extra Tabelle nutzen und ein "Created on" Timestamp o.Ä. hinzufügen


Advantage:
- Keine extra Tables, dadurch keine extra Objekte
- Einfache Integration durch Erweiterung der bestehenden Klasse

Disadvantage:
- Bei möglichen Erweiterungen zum "Akitivitätstracking" wird die Table ggf. unsauber
Hier wäre eine Lösch-Aktivität z.B. nicht anzeigbar.

Nikosch, ich möchte schon loggen.

Im moment tendiere ich zu dreamcatchers Möglichkeit 2), vielleicht kommen ja noch ein paar spannende Beiträge

Gruß,
Jan
Jan M. ist offline   Mit Zitat antworten
Alt 15.06.2011, 21:09  
Benutzer
 
Registriert seit: 25.01.2011
Beiträge: 59
PHP-Kenntnisse:
Fortgeschritten
Renner befindet sich auf einem aufstrebenden Ast
Standard

Möchtest du auch die Objekte versionieren (2) oder nur die Aktivitäten loggen (1)?

Im Fall 1 müssen es mindestens zwei Tabellen sein.

Bsp:

PHP-Code:
+----+----------+-------------+----------+--------------+ 
Id ObjectId ObjectType  AuthorId ActivityType 
+----+----------+-------------+----------+--------------+ 
1  15       Board_Post  26       created      
+----+----------+-------------+----------+--------------+  
2  15       Board_Post  25       edited      
+----+----------+-------------+----------+--------------+  
3  15       Board_Post  29       edited      
+----+----------+-------------+----------+--------------+ 
Wenn du das alles in eine Tabelle ziehen, kannst du das entweder nicht abbilden oder wiederholst die Objektdaten, was im Falle von Texten ziemlich auf Kosten des Speichers und damit auch auf die Performance gehen würde. Nebenbei wiederspricht es den Normalisierungsregeln.

Fall 2:

Wenn du eh die Versionen speichern willst, kannst du es meines Erachtens auch wiederum in eine Tabelle hauen. Ob du dann jeweils die komplette Version des Textes oder nur das Delta speicherst, wäre dann erstmal zweitrangig.
Renner ist offline   Mit Zitat antworten
Alt 15.06.2011, 21:17  
Neuer Benutzer
 
Registriert seit: 14.11.2009
Beiträge: 17
PHP-Kenntnisse:
Fortgeschritten
Jan M. befindet sich auf einem aufstrebenden Ast
Jan M. eine Nachricht über Skype™ schicken
Standard

Ich verstehe nicht ganz, was du mit "versionieren" meinst.

Texte würde ich generell nicht in dieser Tabelle speichern, die kann ich ja beim auslesen generieren.

Gruß,
Jan
Jan M. ist offline   Mit Zitat antworten
Alt 15.06.2011, 22:55  
Benutzer
 
Registriert seit: 25.01.2011
Beiträge: 59
PHP-Kenntnisse:
Fortgeschritten
Renner befindet sich auf einem aufstrebenden Ast
Standard

Naja. Also auf dein eingängliches Beispiel bezogen, meine ich damit die verschiedenen Versionen eines Posts beispielsweise.

PHP-Code:
+----+----------+-------------+-------------------------+----------+--------------+ 
Id PostId   title       text                    AuthorId ActivityType 
+----+----------+-------------+-------------------------+----------+--------------+ 
1  15       Der Titel   Langer Text             26       created      
+----+----------+-------------+-------------------------+----------+--------------+  
2  15       Der Titel   Langer Text bearbeitet  25       edited       
+----+----------+-------------+-------------------------+----------+--------------+ 
3  15       Titel  Neu  Langer Text bearbeitet! | 25       edited       
+----+----------+-------------+-------------------------+----------+--------------+ 
Hängt halt stark vom Kontext ab. Bei Forumsposts machts vielleicht keinen Sinn. Bei Wikitexten oder Kollaborationen allgemein vielleicht schon eher.

Im Endeffekt würde ich es jedoch eher in zwei Tabellen aufteilen, da z.B. bei delete oder ähnlichen Aktionen keine Änderungen im Text vermerkt werden müssten.

Sprich: Ich bleib bei meinem ersten Statement von oben: Du brauchst zwei Tabellen.
Renner ist offline   Mit Zitat antworten
Alt 15.06.2011, 23:30  
Neuer Benutzer
 
Registriert seit: 14.11.2009
Beiträge: 17
PHP-Kenntnisse:
Fortgeschritten
Jan M. befindet sich auf einem aufstrebenden Ast
Jan M. eine Nachricht über Skype™ schicken
Standard

Okay, jetzt verstehe ich was du meinst. Das soll aber nicht der Sinn werden, ich möchte wirklich nur Aktivitäten speichern.Solange der Beitrag existiert, d.h. erstellt oder geändert wurde brauche ich ja auch nicht den Ttitel speichern (den Inhalt brauche sowieso nicht), den kann ich mir ja auch so auslesen. Sobald ein Thread / Beitrag gelöscht wird könnte ich den Titel in der DB speichern.

Gruß,
Jan
Jan M. ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine 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
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
SoapClient -> Ändern der Request Struktur, sinnvoll, möglich? Nico PHP-Fortgeschrittene 6 13.05.2011 12:17
Problem: Struktur der Homepage Michelangelo PHP Einsteiger 6 02.01.2011 12:19
xml schreiben ... keine struktur knall PHP Tipps 2010 1 02.10.2010 15:40
Verschachtelte HTML Struktur --Skynet-- PHP Tipps 2010 9 07.09.2010 14:39
[Erledigt] werte aus einer spalte der struktur auslesen Dintar1989 Datenbanken 13 01.07.2010 15:47
Exportieren von daten und struktur in php mewking Datenbanken 2 30.12.2009 10:31
Db Struktur der Gebäude Dominik PHP Tipps 2009 16 07.02.2009 21:41
Struktur einer PHP-Seite webproger PHP Tipps 2008 12 11.12.2008 13:55
Macht diese Struktur Sinn? Ghosti Datenbanken 17 24.04.2008 08:24
xslt struktur.. so nur mit php-unterstützung möglich? Crypi PHP Tipps 2008 8 17.03.2008 17:58
Struktur im Newssystem tinchen PHP Tipps 2007 4 10.07.2007 21:20
die neue Struktur von der opengeodb Plague PHP-Fortgeschrittene 2 13.07.2006 08:33
verzeichnis struktur in eine tabelle packen Datenbanken 2 29.12.2004 20:15
wer weiß wie man so ein struktur schreibt?? HTML, Usability und Barrierefreiheit 1 30.08.2004 10:50

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php aktivitäten speichern, benutzeraktivitäten, facebook struktur php, performanceverlust normalisierung der tabellen

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:36 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum