![]() |
Datenbank: MySQL • Version: 5.1 • Zugriff über: Zeos
Datenbank Design für einen Userserver
Hallo Leute,
ich bin gerade dabei eine Datenbank zu designen. Nun bin ich auf ein paar Fragen/Probleme gestoßen mit denen ich euch jetzt nerven werde :D Anwendung: Es gibt einen Service der eine ständige Verbindung zur Datenbank (zurzeit MySQL geplant) besitzt. Dieser Service hat dann so eine Art Chat Server Funktion. Es sollen also mehrere User in der Datenbank gespeichert werden die dann auch eine KontaktListe und so weiter bekommen sollen. Ich lege das ganze mal für 100.000 User aus. Was ich bis jetzt mir überlegt habe: Usertabelle: (PrimärKey) UserID INT(10) Not Null Auto Inc (PrimärKey) Username VARCHAR(100) Not Null password VARCHAR(32) Not Null email VARCHAR(100) Not Null displayname VARCHAR(100) In dieser Tabelle sollen die User gespeichert werden. UserID ist eine eindeutige ID für jeden User. Username ist der Anmeldenamen. Das Password wird als MD5 Hash gespeichert. Displayname sollte klar sein. Avatartabelle: (PrimärKey) UserID INT(10) Not Null avatar BLOB Die Avatare kommen in eine eigene Tabelle und werden als Bilder im BLOB Feld gespeichert. So nun fangen meine Fragen an: 1) Welches Datenbanksystem verwende ich in diesem Fall am besten? MyISAM oder InnoDB? 2) Ich möchte noch zusätzliche Informationen zu jedem User speichern (Adresse, EMail, Geschlecht, ...) ist es besser diese in die Usertabelle hinzuzufügen oder sollte ich eine eigene Tabelle mit alle zusätzlichen Informationen machen die dann über die UserID verknüpft ist? 3) Wie kann ich die Kontaktliste am besten speichern? Ich habe mir überlegt eine Tabelle mit UserID und PartnerID. Aber angenommen ich habe 100.000 User jeder davon hat 10 Kontakte. Dann hätte diese Liste 1.000.000 Einträge. Ist das so denkbar oder gibt es eine viel bessere Lösung dafür? ahm ja mehr fällt mir im Moment nicht ein ;) |
Re: Datenbank Design für einen Userserver
Hi,
erstmal eine Frage: Zitat:
Zitat:
Zitat:
Zitat:
An sich ist das übrigens durchaus eine Lösung, die völlig ok ist. Du hast ggf. allerdings etwas Redundanz, die sich vermeiden lässt. Hier musst Du schauen, ob die Relation immer bidirektional ist, also gilt immer, dass wenn User A Partner B hat, dann auch User B Partner A hat? Wenn dem so ist, dann solltest Du nicht beide Richtungen abspeichern (macht die Pflege schwerer wenn die Partnerschaft aufgehoben wird, dann musst Du halt unnötig viele Stellen korrigieren). Da solltest Du dann lieber sicherstellen, dass es immer nur in einer Richtung gespeichert wird und dann eben beim Suchen entsprechend berücksichtigen (natürlich kann man aus Perfomance - Gründen auch eine unnötige Redundanz hinnehmen). Wie Du hier vielleicht schon ahnst, es gibt keine Patentlösung. Vieles hängt vom konkreten Anwendungsszenario ab. Da können dann völlig unterschiedliche Ansätze für die Optimierung zum Einsatz kommen. Gruß, Der Unwissende |
Re: Datenbank Design für einen Userserver
Zitat:
Zitat:
Noch kurz warum ich zwei Primär Keys hab: Ich denke, ein select sollte man immer nur auf einen identizierten Eintrag durchführen. Da sich der User über den Usernamen anmeldet, brauch ich den am Anfang und dann verwendet der Server nur noch die UserID zur Identifikation. Zitat:
Funktionieren die Zeos überhaupt richtig mit den Transaktionen? Zitat:
Zitat:
Ich glaub schon, dass ich für jeden Kontakt einen Eintrag benötige, da, nur weil Person A Kontakt B hat, noch lang nicht Person B die Person A als Kontakt haben muss. Zitat:
|
Re: Datenbank Design für einen Userserver
Zitat:
SQL-Code:
(Primary Key) UserID INT(10) Not Null Auto Inc
(Unique Key) Username VARCHAR(100) Not Null password VARCHAR(32) Not Null email VARCHAR(100) Not Null displayname VARCHAR(100) |
Re: Datenbank Design für einen Userserver
Zitat:
Dein Primärschlüsselfeld ist UserID; ein künstlicher Schlüssel. Das ist so auch ganz in Ordnung. Das Feld Username ist nun ein Ersatz- oder Surrogatschlüssel für den Primärschlüssel. Username ist aber nicht Bestandteil des Primärschlüssels!! Auf dem Feld Username sollte unbedingt ein Index liegen. Dieser Index sollte UNIQUE sein; damit wird verhindert, dass es zwei oder mehr Datensätze mit dem gleichen Username geben kann. Dennoch ist das Umbenennen des Usernamen problemlos möglich, weil abhängige Tabellen nicht betroffen sind. Deine Usertabelle sollte auch noch ein Disabled-Feld enthalten. Damit kann man User sperren, ohne den Datensatz löschen zu müssen. |
Re: Datenbank Design für einen Userserver
Zitat:
Also versuch ich mal das zu wiederholen, dass ich es verstehe: Also den Usernamen zu verwenden um in anderen Tabellen auf diesen Usereintrag zu referenzieren wäre ziemlich schlecht da es ein Varchar ist (Bin ich der gleichen Meinung). Bis jetzt hab ich immer nur Primary Keys verwendet aber jetzt hab ich auch herausgefunden, dass ich im MySQL Administrator auch andere Indexe angeben kann. Somit hab ich jetzt einen neuen Index mit der Indexart UNIQUE und dem IndexTyp BTREE (war default) für den username erstellt. Aber was ist jetzt der genaue Unterschied schließlich kann bei einem Primär Key auch nichts doppelt sein? Wird der username dann auch richtig indiziert damit das ganze Performant ist wenn ich darauf eine Abfrage dafür erstelle? Als Primären Key würdest du also einen "künstlichen" Key verwenden der nirgendwo anderes verwendet wird oder? Aber was bringt der mir dann? Das mit den Forgeign Keys habe ich mit Google so verstanden, dass ich damit Spalten von zwei Tabellen verknüpfen kann. Aber wie kann ich das dann genau verwenden und auf was muss ich dabei beachten? Fragen über Fragen. |
Re: Datenbank Design für einen Userserver
Zitat:
Das Disabled Feld klingt gut ... Dafür sollte ich am besten ein Feld mit dem Typ BOOLEAN verwenden oder? |
Re: Datenbank Design für einen Userserver
Besser einen Integer: Wer weiß, welchen "Zustand" deine Datensätze später noch so haben sollen...
also z.B. 0 = normal 1 = gesperrt 2 = abgelaufen usw. usw. |
Re: Datenbank Design für einen Userserver
Zitat:
|
Re: Datenbank Design für einen Userserver
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz