Datentypen Referenzen oder seperate IDs vergleichen?

Mark.W

Mitglied
Hallo,
ich hoffe dass sich einige etwas unter dem Threadtitel vorstellen können, wenn nicht tu mir Leid 🙁

Zunächst einmal beschreibe ich mein Vorhaben:
Ich habe Chaträume und Spieler, wobei ein Spieler in beliebig vielen Chaträumen aktiv sein kann (lesen) und ein Chatraum entsprechend von beliebig vielen Spielern benutzt werden kann. Die Spieler können in mehreren Chaträumen gleichzeitig aktiv sein! Weil ich lieber den Arbeitsspeicher als Rechenleistung beanspruchen möchte, habe ich mir gedacht, dass Chaträume die aktiven Spieler verwalten. Das hätte natürlich zur Folge, dass Datensätze doppelt vorhanden wären, da zum Beispiel die Standardchannel von 90% der ~150 User genutzt werden würden. Im Zweifesfall könnte man die Standardchannel umkehren, aber mir geht es nun um Folgendes:

Es handelt sich um ein Minecraft Plugin und dort erhalte ich, sobald ein Spieler in den Chat postet, lediglich ein Spieler-Objekt, aus welchem ich keine Informationen bezüglich des Chatraums herauslesen kann. Ich dachte also zunächst ein eine HashMap, die für jeden aktiven Spieler eine entsprechende ChatSpieler Referenz enthält. Anschließend würde ich aus dem Spieler den aktiven Chatraum auslesen und anhand dessen Liste die Nachricht an die jeweiligen Spieler weiterleiten.

Mich verunsichert nun die Dopplung der Datensätze, da man datenbanktechnisch eine zusätzliche Spielertabelle einrichten würde, die über Indizes angesprochen wird. So hätte ich in der HashMap statt den ChatPlayern dann nur noch einen Integer, über welchen ich aus einem entsprechenden Array dann den ChatPlayer erhalte. So gäbe es nur eine Liste, in welcher die einzelnen ChatPlayer referenziert sind, aber lohnt sich dieser Aufwand?

Ich habe zusätzlich einen Überblick über mein Gesamtvorhaben gegeben, da es möglicherweise bessere Lösungen gibt 🙂
Bin um jeden Rat dankbar, da mir sehr viel an der Optimierung meiner Programme liegt.
 
geht es um einen Java-basierten Server? für flüchtige Chat-Eintritte sehe ich nicht unbedingt die Notwendigkeit einer neuen DB-Tabelle,
überhaupt brauchst du die doch nur, wenn du neue Daten ablegst, nach 'Dopplung der Datensätze' klingt das für mich nicht,
allein doppelte Ids, damit alle Tabellen einander zugeordnet werden können, sind eher unkritisch

-----

auf Java Ebene paar hundert Objekte untereinander verknüpfen ist performancemäßig unkritisch,
jedes wichtige Objekte sollte nur genau einmal vorhanden sein, da ist ein Link in einer Liste nicht größer als eine einzelne Id als Objekt, jedes vorhandene Objekt ist als Referenz nur 4 Bytes groß
 
Zunächst einmal danke für die Antwort.
Es geht mir um das Speichern der Daten im Arbeitsspeicher und zwar so, dass der Server möglichst wenig tun muss.

Die Dopplung besteht in dem Moment, in welchem ein Spieler in mehr als einem Channel eingetragen ist, denn dann taucht er in jedem einzelnen Channel in der entsprechenden Liste auf. Den Vergleich zu den Datenbanken habe ich nur gemacht, weil ich es von dort gewohnt bin 😛
 
Zuletzt bearbeitet von einem Moderator:
gottgegeben ist es nicht, dass Daten doppelt sind,
'irgendwo auftauchen' ist ziemlich ungenau, hast du etwas konkrete Informationen?

wenn man ganz allgemein ein Objekt x in 5 Liste einfügt, hat man nicht 4-5 Doppelte von x,
sondern einen ziemlich normalen Zustand

für eine verteilte Anwendung mit Server und vielen Clients sind freilich Daten in jedem PC kopiert,
aber auch der Server selber kann natürlich so kompliziert sein, dass Daten doppelt vorliegen,
etwa pro dort eingeloggten User mit eigener Session, wie es in J2EE heißen würde

gewiss kann man da überlegen zu sparen,
so allgemein kann glaube ich aber schwer jemand viel ergänzen, mein Redefluss endet gerade 😉
 
Also jeder Channel hat eine Liste mit Spielern, die ihm "angehören", die also Nachrichten empfangen, die an diesen Channel gehen. Im Moment habe ich zwei Channel, zu welchen jeder neue Benutzer automatisch gehören soll. Das würde schon mal bedeuten, dass es zwei Listen mit demselben Inhalt gibt, wenn kein User den Channel wechselt. Aber selbst wenn gewechselt wird, so werden die Listen größtenteils übereinstimmen.. die Alternative, bei welcher keine Daten doppelt vorhanden sind, wäre wenn jeder Spieler seine eigenen Channel verwaltet, aber dann muss das Programm ja mehr rechnen, als würde es lediglich aus einer Liste auswählen.

Verstehst du ungefähr was ich meine?

Vielleicht siehst du das Problem nicht, weil du es aufgrund deiner Erfahrung nicht als Problem bewertest.
 
Also grundsätzlich solltest du es so machen, wie es programmtechnisch am sinnvollsten ist. Außerdem reden wir hier doch von Java Objekten. Wenn ein Objekt (ein Spieler in deinem Fall) in 100 Channel vertreten ist, so wäre er trotzdem nur ein mal vorhanden (vorausgesetzt du clonst nicht das Objekt). Und in Objektorientierten Sprachen (wie Java sie ist) werden Objekte nun mal an vielen verschiedenen Stellen verwendet um mit ihnen zu arbeiten. Deswegen sind sie nicht doppelt!

Versuche deine Welt (also deine Chaträume, User, evtl. auch Nachrichten) in Java Objekte umzusetzen. Und dann gibst du jedem Objekt die Objekte die er zum arbeiten benötigt.

Grundsätzlich würde ich dir Lektüre zu Objektorientierter Programmierung empfehlen.
 
> Vielleicht siehst du das Problem nicht, weil du es aufgrund deiner Erfahrung nicht als Problem bewertest.

so kann man es schmeichelnd ausdrücken,

Hinweis: 'wenn jeder Spieler seine eigenen Channel verwaltet'
-> dann wären ja die Channel 'doppelt' bzw. gar 100fach vorhanden, von jedem Spieler aus,

aber das ist einfach kein Problem sondern Normalzustand
 

Zurück
Oben