MySQL-Datenbankdesign

7

Ich könnte Hilfe beim Entwerfen einer Datenbank für eine Website gebrauchen, an der ich arbeite. Ich sollte erwähnen, dass ich ein Anfänger bin und in der Vergangenheit noch nie eine Datenbank entwerfen musste.

Ok, meine Implementierung muss Daten zu Auktionen enthalten, die auf 5 Weltregionen basieren (EU, USA, KR, CN, TW). Jede Auktion wird mit einer ID identifiziert, die nicht für eine Region eindeutig ist, sondern nur für einen Bereich in dieser Region. Die endgültigen Anforderungen sind:

  • Kann historische Marktpreise einzelner Artikel verfolgen, die in den letzten 4 bis 6 Monaten versteigert wurden.
  • Kann die aktuellen Artikel zur Auktion anzeigen.
  • Kann Verkäufer von Artikeln und deren Geschichte verfolgen.
  • Kann ein Profil auf der Site erstellen.
  • Es ist nicht erforderlich, Regionen vergleichen zu können.

Einige Statistiken:

  • Jede Region kann aus mehr als 240 Bereichen bestehen.
  • In jedem Reich stehen gleichzeitig rund 20.000 Auktionen zum Verkauf.

Mein aktueller Plan ist es, mit einer Datenbank für jede Region zu arbeiten, also insgesamt 5. Jede dieser Datenbanken hätte die folgenden Tabellen:

  • Bereiche - Enthält Informationen zu allen Bereichen in einer Region
  • Scannen - Enthält eine Momentaufnahme der aktuellen Artikel, die in einer Region zum Verkauf angeboten werden. Indiziert nach Reich.
  • Historisch - Hält 4-6 Monate Geschichte für jede Region. Dies schließt jede Auktion ein, die gesehen wurde.
  • Verkäufer - Enthält Daten zu allen Verkäufern, die in den letzten 4 bis 6 Monaten gesehen wurden.

Ich überlege, ob es besser wäre, nur zwei Tabellen zu haben und die Tabellen Scan, Verlauf und Verkäufer zusammenzuführen. Wenn ein Benutzer nur die aktuellen Scandaten oder Informationen für einen Verkäufer anzeigen möchte, wird dies aus der kombinierten Tabelle berechnet die Fliege.

Da ich neu in diesem Bereich bin, könnte ich mit jemandem mit mehr Erfahrung einen Blick darauf werfen und mich wissen lassen, ob ich etwas übersehen habe. Denken Sie daran, dass ich nichts über Leistung weiß und ob das Design, das ich habe, akzeptabel wäre oder nicht.

Alle Interessierten können die Dokumentation für die API, mit der ich arbeite, hier einsehen. Http://blizzard.github.com/api-wow-docs/ Ich habe geplante Aufgaben, um die Daten zu importieren und in die Datenbank einzufügen.

Fühlen Sie sich frei, mich etwas zu fragen, wenn ich nicht klar genug war.

ChrisO
quelle

Antworten:

3

Ich werde eine Pause einlegen. Beachten Sie, dass ich gerade Felder aufgelistet habe, die notwendig sind. Wenn Sie zusätzliche Daten haben, die Sie in diesen Tabellen speichern möchten, können Sie diese hinzufügen (sofern sie normalisiert sind).

Während Sie angegeben haben, dass Sie für jede Region eine andere Datenbank verwenden würden, habe ich dies so gestaltet, dass alle in einer Datenbank funktionieren können. Im Moment haben Sie vielleicht nur 5 Regionen, aber dies bietet die Flexibilität, einfach weitere hinzuzufügen:

table: region
regionID        varchar(2)
regionName      varchar(50)

Definiert Daten für jeden Bereich. Ich habe mich für einen Ersatzschlüssel (RealmID) entschieden, da RealmName möglicherweise nicht eindeutig ist. Dies setzt voraus, dass jeder Bereich nur zu einer Region gehören kann (regionID muss ein Fremdschlüssel für regionID in der Regionstabelle sein):

table: realm
realmID         int
regionID        varchar(2)
realmName       varchar(50)

Definiert Daten für jeden Benutzer (Verkäufer / Käufer). Ich entschied, dass es besser wäre, wenn es einen Ersatzschlüssel (sellerID) hätte, da die Kombinationen aus Vor- und Nachnamen von Verkäufer / Käufer möglicherweise nicht vollständig eindeutig sind. Beachten Sie, dass in einer Adresstabelle möglicherweise mehrere gespeichert werden sollen:

table: user
userID          int
userFirstName   varchar(20)
userLastName    varchar(20)
userEmail       varchar(100)

Daten für jede Auktion. AuctionID wäre eine automatisch generierte ID und der Primärschlüssel. Sie möchten auch Fremdschlüssel für RealmID (RealmID für Realm-Tabelle) und SellerID (UserID für User-Tabelle):

table: auction
auctionID       int
realmID         int
sellerID        int
auctionPrice    decimal
auctionStart    datetime

Daten für jede Auktion, die mit einem Fremdschlüssel in der Käufer-ID (Benutzer-ID in der Benutzertabelle) abgeschlossen wurde:

table: auctionHistory
auctionID       int
buyerID         int
finalPrice      decimal
auctionFinished datetime

Ich glaube nicht, dass Sie für "Scan" eine separate Tabelle benötigen würden. Dies wäre eine einfache Abfrage von Zeilen in der Auktionstabelle, die keine übereinstimmenden Zeilen in der Tabelle "auctionHistory" enthalten. Hoffentlich hilft Ihnen dies beim Einstieg. Wenn ich etwas verpasst / falsch verstanden habe, lassen Sie es mich bitte wissen.

Aaron
quelle
Hallo, danke, dass du dir die Zeit genommen hast, das durchzusehen. Deine Antwort war wirklich hilfreich. Ich habe mich für eine große Datenbank für alle Regionen entschieden, wie Sie vorgeschlagen haben. Dies ist sinnvoll und lässt sich leicht erweitern, wenn ich in Zukunft Regionen vergleichen muss. Ich kann nicht herausfinden, ob eine Auktion überhaupt beendet wurde. Die einzigen Daten, die mir zur Verfügung gestellt werden, sind eine aktuelle Liste aktiver Auktionen, die etwa jede Stunde aktualisiert werden. Ich denke, ich werde am Ende eine große Tabelle mit dem Namen "Auktion" für alle gesehenen Auktionen haben, die alle ihre Daten enthält, und dann eine separate Tabelle mit dem Namen "Scan" mit einem Fremdschlüssel, der mit der Tabelle "Auktion" verknüpft ist.
ChrisO