Nachrichtensystem in MySQL
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
arbeit
ausgehende nachricht
benutzer
eingehende nachricht
einzeln speichern
erstellen
extra tabelle
feld
frage
lager
methode
nachricht
nutzer
performance
problem
system
tabelle
typ
union
url
-
Hallo,
ich habe wieder mal eine Frage.
Mit dem Basicsystem von sql kenne ich mich aus :)
Meine Frage bezieht sich eher darauf, WIE ich ein Nachrichtensystem implementieren sollte.
Jeder User soll eine eigene Tabelle mit seinen Nachrichten erhalten.
Nun stellt sich die Frage, wie sieht es mit täglichen Admin/System Nachrichten aus, die der User erhalten soll?
Vorallem soll das System auch bei größeren Nutzeranzahlen funktionieren.
Wie habt ihr das gemacht, bzw wie würdet ihr das machen?
Was mir noch wichtig wäre, ob der User es gelesen hat. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Das regelt man in der regel über Verbindungen innerhalb der Tabellen. Am einfachsten ist es denke ich mit folgendem Tabellen Schema:
---------------------------------------------
| userid | username | password | ... |
---------------------------------------------
als User Tabelle (wichtig ist mir eig die UserId), und dann eine Tabelle für die Nachrichten die so aussieht:
----------------------------------------------------------
| messageid | from | to | type | title | message |
----------------------------------------------------------
Wobei das "from" und "to" die jeweiligen userid's der Nutzer sind. Als Typ kannst du dann hinterlegen ob es eine ausgehende Nachricht, eine eingehende Nachricht, oder eine Systemnachricht ist.
In MySQL gibts es etwas das heißt "Contraint", was bedeutet, dass du Felder miteinander verbindest. In diesem Fall wären die Felder "from" und "to" mit jeweiligen userid Feldern Verbunden.
In der Messages Tabelle kannst du dann ALLE Nachrichten ALLER Nutzer sammeln, und filterst diese mittels SQL Bedingungen dann raus.
Liebe Grüße -
Vielen Dank für die schnelle Antwort!
Falls ich dich richtig verstanden habe,
jeder nachricht erhält eine eigene id, from userid1, to userid2, etc.
Daraus entnehme ich, dass du empfiehlst alle Nachrichten in einer Tabelle zu lagern?
Falls dies so ist, gibt es dann nicht performanz einbuße bei vielen Nutzern oder
ist es vielleicht sogar besser nicht für jeden Nutzer eine eigene Nachrichtentabelle zu erstellen?
Weil ich eher die Methode mit eigener Nachrichtentabelle vorziehen würde.
Das Problem bei meiner Methode (ebenfalls auch in deiner) ist das man bei System/Admin Nachrichten für alle Userids einen insert machen müsste.
Gibt es dafür eine elegante Lösung? -
ggamee schrieb:
Wobei das "from" und "to" die jeweiligen userid's der Nutzer sind. Als Typ kannst du dann hinterlegen ob es eine ausgehende Nachricht, eine eingehende Nachricht, oder eine Systemnachricht ist.
Macht das mit eingehend/ausgehend Sinn? Es ist für den User FROM nämlich ausgehend und für den User TO eingehend...
xfate schrieb:
Das Problem bei meiner Methode (ebenfalls auch in deiner) ist das man bei System/Admin Nachrichten für alle Userids einen insert machen müsste.
Gibt es dafür eine elegante Lösung?
Nicht unbedingt elegant, aber auf jeden Fall Performance- und Speichertechnisch besser wäre eine weitere Tabelle anzulegen, die nur Systemnachrichten enthält. Das ist dann zwar mehr Arbeit in PHP, aber dafür musst du die selbe Nachricht nicht für jeden Benutzer einzeln speichern.
mfg
Jonas -
xfate schrieb:
Daraus entnehme ich, dass du empfiehlst alle Nachrichten in einer Tabelle zu lagern?
Falls dies so ist, gibt es dann nicht performanz einbuße bei vielen Nutzern
Eine Tabelle ist da schon die imho die beste Lösung. Viele Tabellen zu erstellen kostet nämlich auch Serverkapazitäten.
Klar SQL erreicht irgendwann seine grenzen, aber das müssen schon viele... sehr viele nachrichten sein, die verschickt werden, bevor das Probleme macht. Für das einfügen einer neuen Nachricht ist es egal. SQL hat bestimmte wege die Tabellen zu durchsuchen, wenn du nach den userids indiziert hast du einen sehr performanten zu griff. Deutlich besser als wenn du im posteingang oder Ausgang hunderte Tabellen öffnen müsstest. -
Entweder nimmste einen union select und extra tabelle, oder:
From = 0 für System
Ich kombiniere gerne beides.
Ersteres für Serverwartungen, etc. Letzteres für Infonachrichten wenn zb. ein Beitrag gelöscht wurde. -
Vielen Dank für die Antworten!
jonas-bayer schrieb:
Nicht unbedingt elegant, aber auf jeden Fall Performance- und Speichertechnisch besser wäre eine weitere Tabelle anzulegen, die nur Systemnachrichten enthält. Das ist dann zwar mehr Arbeit in PHP, aber dafür musst du die selbe Nachricht nicht für jeden Benutzer einzeln speichern.
Das ist eine gute Idee. Jedoch muss ich ebenfalls feststellen ob der User die Nachricht gelesen hat.
-------------------------------------
| id | nachricht | gelesen | ...
-------------------------------------
wobei gelesen einfach true/false bzw 1/0 Eintrag hat, zb um festzustellen ob es neue ungelesene Nachrichten gibt.
Wie könnte man dann das am Besten lösen?
muellerlukas schrieb:
Entweder nimmste einen union select und extra tabelle, oder:
From = 0 für System
Scheinen die einzigen sinnvollen alternativen zu sein. Bei vielen Nachrichten und vielen Usern, welches ist da vorzuziehen? -
NimmNimm doch die Kombi:
Tabelle für Dinge wie Serverwartung, Updates, die eh alle zu interessieren hat.
Einzelne Nachricht mit From-0 in der normalen Tabelle mit Infos für einzelne User.
Das nimmst du als Union Select. Du musst im Script halt über einen Parameter entscheiden was es ist.
Spart halt Platz.
Einfacher wäre es aber nur die 2. Lösung zu nutzen. Dann kannst du eben 20k Nachrichten ma der ben haben.
Vorschlag 2. im Thread kann ich dir machen wenn du sagst was du brauchst.
Evtl kann man ja auch wie in Boards globale Posts nutzen. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage