Internes Nachrichtensystem
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
ablegen
absender
anregung
datenbank
empfangene nachricht
erzeugt code
gut erkennen
information
internes system
klasse idee
nachricht
not
null
posteingang
sinn
system
tabelle
url
verwenden
zweiten tabelle
-
Hallo,
ich schreibe gerade ein internes Nachrichtensystem
Was ist da "Best Practise"
Variante A)
Alle Mails (abgeschickte und empfangene Mails) in einer grossen MySQL-Tabelle verwalten.
Variante B)
zwei Tabellen verwenden:
1) für gesendete Mails (Postausgang)
2) für empfangene Mail (Posteingang)
Wie machen andere Systeme das, die auch ein internes Mailsystem verwenden?
Beitrag zuletzt geändert: 27.10.2014 15:02:31 von dunkeltuten -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
dunkeltuten schrieb:
Wie machen andere Systeme das, die auch ein internes Mailsystem verwenden?
Alle, die ich kenne (inklusive mein eigenes CMS), nutzen Variante A.
Vielleicht, noch als Anregung, der SQL-Befehl, der meine Tabelle erzeugt:
CREATE TABLE IF NOT EXISTS `$PREFIX_nachrichten` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `userFrom` int(11) NOT NULL, `userTo` int(11) NOT NULL, `subject` varchar(220) NOT NULL, `body` text NOT NULL, `sendtime` datetime NOT NULL, `readen` tinyint(4) NOT NULL, `inbox_delete` tinyint(4) NOT NULL, `outbox_delete` tinyint(4) NOT NULL, `lang` varchar(220) NOT NULL, PRIMARY KEY (`ID`) );
-
Ich denke, dass alle Systeme Variante A verwenden und zwar ziemlich genauso, wie webfreclan es beschrieben hat.
Variante B würde doch auch keinen Sinn ergeben, da bei einem internen Mailsystem ja jede abgeschickte Nachricht, eine empfangene Nachricht eines anderen Users ist., das hieße damit doch auch, dass jede Mail doppelt im System ist. Dadurch kann es auf keinen Fall "Best Practice" sein.
Oder habe ich falsch verstanden was du bei Variante B meinst? -
Da es sich um ein internes System handelt, sind ja alle abgeschickten=alle empfangenen. Also Nachrichten in einer Tabelle.
Es gibt allerdings noch ein kleines Problem, wenn es in deinem Nachrichtensystem möglich sein soll, eine Nachricht an mehrere Empfänger zu schicken. Dann benötigt man eine 2.Tabelle, in der die Empfänger (ihre ID) abgespeichert sind. Dort lassen sich dann auch weitere Informationen ablegen, z.B. ob Empfänger-ID 95 die Nachricht-ID 123 schon gelesen hat.
-
grashuepfer schrieb:
Variante B würde doch auch keinen Sinn ergeben, da bei einem internen Mailsystem ja jede abgeschickte Nachricht, eine empfangene Nachricht eines anderen Users ist., das hieße damit doch auch, dass jede Mail doppelt im System ist.
Die Mail muss doppelt in die Tabelle!!! Begründung:
wenn die Nachricht nur einmal vorhanden wäre, dann kann sie auch nur 1x gelöscht werden.
was aber, wenn die Mail vom Empfänger gelöscht wird?
dann wäre die Mail ja auch in den "gesendeten Mails" des Absender gelöscht -
dunkeltuten schrieb:
grashuepfer schrieb:
Variante B würde doch auch keinen Sinn ergeben, da bei einem internen Mailsystem ja jede abgeschickte Nachricht, eine empfangene Nachricht eines anderen Users ist., das hieße damit doch auch, dass jede Mail doppelt im System ist.
Die Mail muss doppelt in die Tabelle!!! Begründung:
wenn die Nachricht nur einmal vorhanden wäre, dann kann sie auch nur 1x gelöscht werden.
was aber, wenn die Mail vom Empfänger gelöscht wird?
dann wäre die Mail ja auch in den "gesendeten Mails" des Absender gelöscht
Schau dir einfach mal den Tabellenaufbau bei phpBB an. Dort kannst du gut erkennen, wie man dieses Problem löst, nämlich durch die von mir schon vorher beschriebene 2. Tabelle, in der Nachrichten-ID, Sender-ID und Empfänger-ID enthalten sind. -
dunkeltuten schrieb:
Die Mail muss doppelt in die Tabelle!!! Begründung:
wenn die Nachricht nur einmal vorhanden wäre, dann kann sie auch nur 1x gelöscht werden.
was aber, wenn die Mail vom Empfänger gelöscht wird?
dann wäre die Mail ja auch in den "gesendeten Mails" des Absender gelöscht
Redundante Daten in einer Datenbank ist nie eine gute Lösung.
Das System wird langsam und Fehleranfällig.
Stattdessen gibt es in deinem Beispiel die Möglichkeit mit einer zweiten Tabelle zu arbeiten wie zuvor beschrieben.
Oder du kannst eine zusätzliche Spalte pro Nachricht in der Tabelle anlegen, in der du abfragst ob diese vom Empfänger gelesen/gelöscht wurde oder ob der Absender diese gelöscht hat.
Anhand dieses Status wird die Mail dem jeweiligen benutzer im Postfach nicht mehr angezeigt oder eben als gelesen markiert. ;) -
dunkeltuten schrieb:
grashuepfer schrieb:
Variante B würde doch auch keinen Sinn ergeben, da bei einem internen Mailsystem ja jede abgeschickte Nachricht, eine empfangene Nachricht eines anderen Users ist., das hieße damit doch auch, dass jede Mail doppelt im System ist.
Die Mail muss doppelt in die Tabelle!!! Begründung:
wenn die Nachricht nur einmal vorhanden wäre, dann kann sie auch nur 1x gelöscht werden.
was aber, wenn die Mail vom Empfänger gelöscht wird?
dann wäre die Mail ja auch in den "gesendeten Mails" des Absender gelöscht
Wie wäre es denn mit boolean-Variablen in der Datenbank für:
- gesendet (beim Absender als Entwurf angezeigt; beim Empfänger gar nicht)
- gelesen (als (un)gelesen anzeigen beim Empfänger; evtl. Bestätigung an den Absender, dass die Nachricht gelesen wurde)
- gelöscht aus dem Posteingang (dass die Nachricht nicht mehr im Posteingang des Empfängers angezeigt wird)
- gelöscht aus dem Postausgang (dass die Nachricht nicht mehr im Postausgang des Absenders angezeigt wird) -
@grashuepfer:
Das mit den boolean-Variablen finde ich eine klasse Idee
Werde ich entsprechend so umsetzen
@mein-wunschname:
Wozu zwei Tabellen?
Das habe ich einfach mit "comma separted values" umgesetzt und klappt schon einwandfrei -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage