Zwei Fragen zu Chat
-
Hallo,
ich programmiere gerade einen Chat für meine Seite, und bisher läuft alles. Nun bin ich aber an einem Punkt angekommen, an dem sich mir ein paar Fragen stellen.
1. Wenn ich einen Chatraum für jeden Benutzer habe (z.B. A und B, A und C, B und C, B und D...) muss ich das ganze irgendwie in der Datenbank unterbringen. Was für ein Datenbank-Schema würdet ihr hier wählen? Eine Tabelle für jeden Chatraum, eine Tabelle für den ganzen Chat...?
2. Ich weiß nicht recht ob das geht, was ich vorhabe, aber momentan habe ich eine kleine Leiste mit Dropdown-Menüs am unteren Bildschirmrand, in der der Chat untergebracht ist. Nun will ich aber nicht, dass bei jedem neuen Seitenaufruf diese Leiste neu geladen wird. Geht das, und wenn ja, wieviel Webmagie ist dazu nötig?
-
Bei 1. gebietet schon die Logik, dass es keinen Sinn macht für einen neuen Raum eine neue Tabelle anzulegen. Das Datenbankschema legt man bei der Installation an. Also eine (oder vielleicht auch zwei, drei, je nachdem wieviele Metadaten, Protokolle, ... Du speicherst) Tabelle für den gesamten Chat.
-
LordJaxom schrieb:
Bei 1. gebietet schon die Logik, dass es keinen Sinn macht für einen neuen Raum eine neue Tabelle anzulegen.
nö, logisch ists nicht... es ist sogar total unlogisch, wird aber so gemacht!
-
Webär schrieb:
Hallo,
2. Ich weiß nicht recht ob das geht, was ich vorhabe, aber momentan habe ich eine kleine Leiste mit Dropdown-Menüs am unteren Bildschirmrand, in der der Chat untergebracht ist. Nun will ich aber nicht, dass bei jedem neuen Seitenaufruf diese Leiste neu geladen wird. Geht das, und wenn ja, wieviel Webmagie ist dazu nötig?
klingt nach ajax
-
KingKarl schrieb:
LordJaxom schrieb:
Bei 1. gebietet schon die Logik, dass es keinen Sinn macht für einen neuen Raum eine neue Tabelle anzulegen.
nö, logisch ists nicht... es ist sogar total unlogisch, wird aber so gemacht!
Es ist logisch, das nicht für jeden Raum eine neue Tabelle erstellt wird! Allein schon zur Vermeidung von Redundanzen.
-
inflames2k schrieb:
Allein schon zur Vermeidung von Redundanzen.
was heißt redundanzen
-
KingKarl schrieb:
inflames2k schrieb:
Allein schon zur Vermeidung von Redundanzen.
was heißt redundanzen
datenbanktheorie
http://de.wikipedia.org/wiki/Normalisierung_(Datenbank)
-
elise schrieb:
KingKarl schrieb:
inflames2k schrieb:
Allein schon zur Vermeidung von Redundanzen.
was heißt redundanzen
datenbanktheorie
http://de.wikipedia.org/wiki/Normalisierung_(Datenbank)hat jetzt was mit der frage zu tun klärt mich doch mal _leicht verständlich_ auf
-
also ich versuchs mal, es gibt folgende 2 situationen...
mögl. a
id_chat_room | id_user ---------------------- 1 | 1 1 | 2 1 | 3 1 | 4 2 | 1 2 | 2 2 | 3 2 | 4
mögl. b
tbl id_chat_room_1 id_user ---------------------- 1 2 3 4 tbl id_chat_room_2 id_user ---------------------- 1 2 3 4
wo sind jetzt die redundanzen bzw. normalisierung
-
Klär mich doch mal auf, warum es in Deinen Augen unlogisch ist
-
LordJaxom schrieb:
Klär mich doch mal auf, warum es in Deinen Augen unlogisch ist
logisch wirds, wenn man wissen will, in welchen räumen user 1 ist, was vllt. nicht gefordert ist...
-
KingKarl schrieb:
logisch wirds, wenn man wissen will, in welchen räumen user 1 ist, was vllt. nicht gefordert ist...
select raum_id from chat_tabelle where user=1 ???
Wozu braucht man da mehrere Tabellen?
-
LordJaxom schrieb:
Wozu braucht man da mehrere Tabellen?
Er geht wahrscheinlich von Millionen von Chattern aus, die gleichtzeitig da sind.
-
inflames2k schrieb:
LordJaxom schrieb:
Wozu braucht man da mehrere Tabellen?
Er geht wahrscheinlich von Millionen von Chattern aus, die gleichtzeitig da sind.
wieso? macht man dann ein select * from user_1_chat_rooms;
@edit: dann geht sogar ein performantes limit 10,10... was bei der tabellen lösung ohne 3. spalte echt schwer wird... aber hey, wer ist in so vielen räumen
-
Du würdest doch auch nicht für jeden Chatraum eine neue Klasse entwickeln. Schließlich hat die Klasse "Chatroom" schon alle Felder, Properties etc. die benötigt werden und nach dem Prinzip sollte auch bei der Datenbankarchitektur vorgegangen werden.
-
inflames2k schrieb:
Du würdest doch auch nicht für jeden Chatraum eine neue Klasse entwickeln.
nö, aber ich würde mehrere instanzen erstellen!
@edit: falls ich es noch nicht gesagt hab, datenbanken sind eh scheiße... die brauchen immer eine extrawurst :p
-
KingKarl schrieb:
@edit: falls ich es noch nicht gesagt hab, datenbanken sind eh scheiße... die brauchen immer eine extrawurst :p
Das begründe mir mal...
Zu den Tabellen, folgende würde ich konzipieren:
tbl_Users
----------
- UserID
- UserName
...tbl_ChatRooms
-------------
- RoomID
- RoomName
...tbl_??
-------
- UserID (Fremdschlüssel)
- RoomID (Fremdschlüssel)
...Somit komme ich mittels Selects an alles was ich brauche.
Beispiel:
Alle Nutzer in Raum 1SELECT a.UserID, a.UserName FROM tbl_?? c INNER JOIN tbl_Users a ON c.UserID = a.UserID INNER JOIN tbl_ChatRooms b ON c.RoomID = b.RoomID WHERE RoomName = 'Raum 1';
Alle Räume in denen Nutzer 1 ist:
SELECT a.RoomID, a.RoomName FROM tbl_?? c INNER JOIN tbl_ChatRooms a ON a.RoomID = c.RoomID INNER JOIN tbl_Users b ON b.UserID = c.UserID WHERE b.UserName = 'Nutzer 1';
-
mir reichts, ich muß jetzt autowaschen... dafür bekomm ich zumindest was
-
Danke für eure Antworten
Ich glaube ich werde die Lösung zur ersten Frage von inflames2k nehmen, scheint mir sehr praktisch.Zu meiner zweiten Frage, dass da Ajax als antwort kommt, hatte ich mir schon gedacht. Das Problem ist aber, dass soweit ich weiß, man mit Ajax nur Teile der Seite neuladen kann. Wie aber schaffe ich es, dass mit einem Klick auf einen Link oder auf F5 alles bis auf den Chat geladen wird, der Chat aber immernoch im Vordergrund bleibt?
-
Du kannst selbst definieren, was neu geladen wird. "Neu geladen" ist hier jedoch sehr schwammig, grundlegend werden eigentlich über AJAX die dahinter liegenden Daten neu geladen, der Seitenaufbau nicht.
-
Zu 2
Schau Dir das hier mal an, musst Du natürlich anpassen, aber läuft super:
https://github.com/balupton/History.js/Hier gibts ne Demo, die Du Dir für nahezu jede beliebige Seite anschauen kannst..
https://gist.github.com/919358