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 Thema bewerten
Alt 06.07.2009, 16:01  
Erfahrener Benutzer
 
Benutzerbild von boolean
 
Registriert seit: 06.10.2008
Beiträge: 257
PHP-Kenntnisse:
Fortgeschritten
boolean ist zur Zeit noch ein unbeschriebenes Blatt
boolean eine Nachricht über Skype™ schicken
Standard Benutzer-Model

Hallo Zusammen,

ich bin derzeit an einem sehr großen Projekt und muss mir daher sehr viele Gedanken über die Struktur machen. Natürlich ist das ganze nicht so einfach wie die meisten denken und von daher richtet sich mein größtes Problem an die Benutzerverwaltung.

Ein Benutzer hat immer folgende Daten:
ID* (UNIQUE, PK)
E-Mailadresse* (UNIQUE)
Passwort* (MD5)
Vorname*
Nachname*
Status*
Adresse
Telefonnummer
Geburtstag
Punkte
Foto

Alle mit * gekennzeichneten Felder sind immer hinterlegt. Neben diesen Daten müssen nun natürlich auch noch beziehungen etabliert werden. Das heißt in erster Linie, dass jeder Benutzer Rechte und Freunde sowie eigene Alben haben kann die natürlich auch im Benutzer-Verwaltungs-System etabliert werden möchten. Desweiteren haben Benutzer Punkte, die Sie für diverse Aktionen auf dem Portal erhalten. Durch die Punkte, können die Benutzer sich dann virtuelle Goodies kaufen. Ein weiterer Punkt, was alle Benutzer haben ist das Nachrichtensystem, wo sie ausschließlich mit ihren eigenen Freunden schreiben können.

Das System braucht also folgende Bausteine (Übersicht):
Rechte
Freunde
Alben
Punkte
Nachrichtensystem
Standard-Funktionen (Benutzer auslesen, bearbeiten, löschen usw.)

Da ich keine Lust habe, das Projekt direkt am Anfang zu "versauen" möchte ich jetzt Rat von ein paar erfahrenen PHP-Nutzern, die vielleicht bereits ein derartiges Projekt geschrieben haben.

Ich gehe mal näher auf die einzelnen Module ein:

Rechte:
Wie bereits erwähnt, hat jeder Benutzer diverse Rechte, die sich aus einer Gruppe ergeben. Das heißt konkret, dass jeder Benutzer mehrere Gruppen haben kann und die Rechte sich dadurch ergänzen. Das heißt wenn ein Mitglied die Gruppen Mitglieder sowie Moderatoren hat erhält er alle Rechte aus den jeweiligen Gruppen.

Freunde:
Jeder Benutzer kann sich seinen eigenen Freundesstamm aufbauen. Da eine einfache N:M Beziehung hier meiner Meinung nach fehl am Platz wäre, wäre es meiner Meinung nach optimal, dass jede Beziehung zwei mal in der Datenbank geführt wird, dass es einfacher zum auslesen ist. Es gibt in der Tabelle einmal das Feld user_id und einmal das Feld friend_id - da man nun nicht von beiden Seiten ohne weiteres die Freunde herausbekommt, ist es meiner Meinung nach ratsam, die Einträge in beide Seiten zu führen.

Alben:
Benutzer können verschiedene Alben haben in denen es Funktionen gibt, die ich hier leider aus mehreren Gründen nicht nennen darf.

Punkte:
Für diverse Aktionen auf dem Portal erhalten Benutzer Punkte. Da ich einen Missbrauch verhindern möchte, will ich in der Datenbank einen Log haben, wo alle Buchungen festgehalten werden. Einmal in der Nacht, werden alle Benutzer kontrolliert und die Punkte geupdatet sofern sie nicht stimmen.

Nachrichtensystem:
Einer der größten Punkte ist wohl das Nachrichtensystem - wobei ich hier schon eine konkrete Vorstellung habe, wie das ganze aussehen soll. Da ich keinen doppelten Text haben möchte, soll der Text einer Nachricht als UNIQUE in einer seperaten Datenbank gespeichert werden. Desweiteren soll jeder Benutzer seine Nachricht in einen Ordner verschieben können. Das heißt zusätzlich zum Nachrichtensystem benötigt man im Nachrichtensystem folgende Optionen: Nachricht schreiben, löschen, verschieben; Ordner erstellen, löschen, bearbeiten; Postausgang löschen.

Das ganze Benutzerverwaltungssystem soll nach allen Regeln des OOP erstellt werden. Effektiv heißt das, dass ich mit vielen Interfaces sowie Abstrakten Klassen arbeiten werde.

Ich bin derzeit an einem UML-Diagramm dran, muss aber sagen, dass ich nicht so sehr mit den Funktionen eines Diagramms vertraut bin.

Wie mache ich das am schlausten. Ich möchte jetzt nicht darum bitten, dass mir jemand ein UML erstellt oder eine derartige Arbeit macht, allerdings geht es mir rein um die Logik, die ich beachten sollte bei einem derartigen Benutzertool.

Gruß,

Marc
boolean ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 06.07.2009, 19:06  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.425
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Hallo,

zeige uns doch einmal, was du bereits hast. Lade ein UML-Diagramm irgendwo hoch und verlinke es. Dann können wir dir auch bessere helfen.
Zum Thema Benutzerverwaltung gab es hier schonmal einen Thread, den solltest du dir auf jeden Fall durchlesen, um dein System zu verfeinern und auch mit Rollen zu ergänzen.
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline   Mit Zitat antworten
Alt 06.07.2009, 19:20  
Moderator
 
Registriert seit: 06.06.2008
Beiträge: 4.849
PHP-Kenntnisse:
Fortgeschritten
Wolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer Anblick
Wolla eine Nachricht über ICQ schicken
Standard

Solch ein Nachrichtensystem habe ich mal geschrieben. Dazu habe ich diese zwei tabellen:

Ordner:
PHP-Code:
CREATE TABLE IF NOT EXISTS `_post_ordner` (
  `
lfdint(10unsigned NOT NULL AUTO_INCREMENT COMMENT 'Zeilennummer',
  `
useridint(10unsigned NOT NULL DEFAULT '0' COMMENT 'user-lfd',
  `
namevarchar(16NOT NULL DEFAULT '',
  
PRIMARY KEY (`lfd`),
  
KEY `userid` (`userid`)
ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='Ordner-Verwaltung Nachrichtensystem' AUTO_INCREMENT=105 ;

--
-- 
Daten für Tabelle `post_ordner`
--

INSERT INTO `_post_ordner` (`lfd`, `userid`, `name`) VALUES(10'Posteingang');
INSERT INTO `_post_ordner` (`lfd`, `userid`, `name`) VALUES(20'Postausgang');
INSERT INTO `_post_ordner` (`lfd`, `userid`, `name`) VALUES(30'gesendete');
INSERT INTO `_post_ordner` (`lfd`, `userid`, `name`) VALUES(40'gelöschte');
INSERT INTO `_post_ordner` (`lfd`, `userid`, `name`) VALUES(1001'Privat');
INSERT INTO `_post_ordner` (`lfd`, `userid`, `name`) VALUES(1011'Beruf');
INSERT INTO `_post_ordner` (`lfd`, `userid`, `name`) VALUES(1021'Schule'); 
Die ersten 4 Ordner sind die bekanten System-Ordner, die jeder hat. Im Script wird der Ordner "gelöschte" dann mit der Nummer 4 angesprochen.

Hier im Beispiel hat der User mit der ID=1 sich drei eigene Ordner angelegt: Privat, Beruf und Schule. Im Script weden die Ordner mit den Nummern 100,101 und 102 verwaltet.

Post:
PHP-Code:
CREATE TABLE IF NOT EXISTS `_post` (
  `
lfdint(10unsigned NOT NULL AUTO_INCREMENT COMMENT 'Zeilennummer',
  `
betreffvarchar(30NOT NULL DEFAULT '',
  `
nachrichttext NOT NULL COMMENT 'Nachrichtentext',
  `
vonint(10unsigned NOT NULL DEFAULT '0' COMMENT 'user-lfd',
  `
von_ordnerint(10unsigned NOT NULL DEFAULT '0' COMMENT 'ordner-lfd',
  `
anint(10unsigned NOT NULL DEFAULT '0' COMMENT 'user-lfd',
  `
an_ordnerint(10unsigned NOT NULL DEFAULT '0' COMMENT 'ordner-lfd',
  `
gelesenenum('nein','ja'NOT NULL DEFAULT 'nein',
  `
sendezeitdatetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Nachriht abgesendet Datum/Zeit',
  
PRIMARY KEY (`lfd`),
  
KEY `von` (`von`),
  
KEY `an` (`an`)
ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=40176 
Bei einer neuen nachricht werden zunächst die Ordner von=2 und an=1 eingetragen. Die User können das dann in die eigenen privaten Ordner 'verschieben', wobei halt die existierenden Ordnernummern eingetragen werden.

Den nachrichtentext würde ich nicht auf Unique stellen. Leute könnten auf eine Nachricht mit "Vielen Dank, bis dann!" antworten.
Wolla ist offline   Mit Zitat antworten
Alt 06.07.2009, 19:30  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.069
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Zum Thema Rechtesystem kannst du dir eine Lösung vielleicht aus dem ACL des ZF holen:
Zend Framework: Documentation
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 06.07.2009, 20:16  
Erfahrener Benutzer
 
Benutzerbild von boolean
 
Registriert seit: 06.10.2008
Beiträge: 257
PHP-Kenntnisse:
Fortgeschritten
boolean ist zur Zeit noch ein unbeschriebenes Blatt
boolean eine Nachricht über Skype™ schicken
Standard

Danke bereits für eure Mühen. Das UML-Diagramm lade ich natürlich morgen im laufe des Vormittages hoch.

Rechtesystem:
Das Rechtesystem habe ich bereits zum Teil abgeschlossen. Es funktioniert über 4 Tabellen und wird dauerhaft im Cache gehalten, sofern sich nichts daran ändert.

user_rights: Beinhaltet alle Rechte inkl. Beschreibung.
user_groups: Beinhaltet alle Gruppen.
user_group_rights: Beinhaltet alle Rechte, die die jeweilige Gruppe besitzt (N:M).
user_group_joins: Beinhaltet die Beziehung zwischen Benutzer und Gruppe.

Die Struktur habe ich mir schon überlegt an Acl anzulehnen bzw. sogar in Acl zu importieren.

Nachrichtensystem:
Danke für deine Mühen, allerdings glaube ich nicht, dass ein derartiges System meinen Anforderungen ausreicht. Zunächsteinmal fehlen bei dieser Variante FKs, die mir sehr wichtig sind, da ich direkte bezüge benötige. Desweiteren gibt es einige Funktionen, die ich mit FKs verwenden kann (bspw. löschen durch eine FK-Beziehung etc.).

Desweiteren würde bei deiner Variante der Text doppelt in der Datenbank stehen, sofern ein Benutzer mehrere Nachrichten mit dem selben Text an verschiedene Benutzer übersendet.

Desweiteren hatte ich bei messages an eine derartigen aufbau gedacht:

messages: Beinhaltet alle Nachrichten (Text ausgeschlossen) - direkte Beziehung zwischen N:M zu Sender und Versender.
message_folders: Beinhaltet alle Ordner mit einer N:M Beziehung zum Benutzer (Ersteller).
message_folder_joins: Beinhaltet die Beziehung zwischen Nachricht und Ordner - gibt die Möglichkeit eine Nachricht in mehrere Ordner zu kopieren.
message_text: Beinhaltet die Texte für alle Nachrichten mit N:M Bezug auf "messages".

Standardmäßig werden 2 Folder erstellt bei einer Registrierung:

- Posteingang
- Postausgang

Beide können durch ein Flag in der Datenbank nicht entfernt werden. Die Folder werden dann verwendet um die Nachrichten anzuzeigen, die der jeweilige Benutzer erhalten und versendet hat.

UPDATE:
Ich findet das Thema nicht - erinnerst du dich ggf. an den Titel?

Geändert von boolean (06.07.2009 um 20:19 Uhr). Grund: Anfüngung!
boolean ist offline   Mit Zitat antworten
Alt 06.07.2009, 20:25  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.425
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

http://www.php.de/software-design/50...erwaltung.html (Rechteverwaltung)
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline   Mit Zitat antworten
Alt 06.07.2009, 20:27  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.633
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Sehe ich genauso, das Thema wurde IMHO schon zur Genüge diskutiert.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 06.07.2009, 23:07  
Moderator
 
Registriert seit: 06.06.2008
Beiträge: 4.849
PHP-Kenntnisse:
Fortgeschritten
Wolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer Anblick
Wolla eine Nachricht über ICQ schicken
Standard

Was sind FKs?
Wolla ist offline   Mit Zitat antworten
Alt 06.07.2009, 23:09  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.633
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Fremd-Schlüssel. Kommt von "foreign keys". Dies bezeichnet die Speicherung eines PK-Wertes einer Tabelle in einer anderen zur Referenzierung eines Datensatzes.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 06.07.2009, 23:23  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.425
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Zur Ergänzung: PK == Primary Key.
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 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
pro Benutzer eine Tabelle mit Feldern oomworld PHP Tipps 2009 8 19.04.2009 13:53
Neue Datenbank und Benutzer anlegen Quereinsteiger Datenbanken 6 02.04.2008 08:30
MySQL-Datenbank und Benutzer per PHP-Script anlegen? nicobischof PHP Tipps 2006 7 03.08.2006 20:50
[Erledigt] Benutzer in phpbb löschen - per sql-Befehl Datenbanken 2 23.12.2005 09:52
mehrere Benutzer arbeiten an einem Datensatz ajo_silent Datenbanken 6 20.11.2004 13:52
MySQL-Datenbank aufteilen auf verschiedenen Benutzer... Datenbanken 3 09.11.2004 08:23
Neuen Benutzer mittels PHP in MYSQL Anlegen PHP-Fortgeschrittene 1 28.10.2004 17:22
Gibt es "htacces" ohne Abfrage von Benutzer und Ke Server, Hosting und Workstations 2 19.06.2004 18:17

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mysql n:m rechte gruppen, software design einer benutzerverwaltung, rechtesystem rollen, http://www.php.de/software-design/56792-benutzer-model.html, \n:m bezug\, phpbb3 benutzerpunkte, model.php, model user, model, das größte portal für models und fotografen, zf rechte acl datenbank create table, php nachrichtensystem erstellen, php script model, php nachrichtensystem aufbauen, php nachrichtensystem gruppen erstellen, php nachrichtensystem gruppen, wie mache ich einen ordner zu einem beruf, n:m beziehung insert, php rechtesystem, modelling php script with uml

Alle Zeitangaben in WEZ +1. Es ist jetzt 03:33 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