2009-03-10 21 views
3

Ich entwerfe eine Produktdatenbank und ich habe eine Designfrage.Entwerfen für sich wiederholende Daten

Es gibt verschiedene Kategorien von Produkten, zum Beispiel Bücher, Videospiele, Heimelektronik und Heimtierbedarf. Es gibt einige Dinge gemeinsam, sagen der Hersteller und der Preis, während andere Dinge für jede Kategorie einzigartig sind, sagen wir Stromverbrauch.

Die einzelnen Produkte werden regelmäßig aktualisiert, der Preis könnte volatil sein, während der Hersteller ziemlich konstant bleibt (ich nehme an, ein Hersteller könnte von einer anderen Firma gekauft werden und der Markenname in der Käuferfirma absorbiert). Aktualisierungen können stündlich erfolgen. Anfragen für jedes Produkt können häufig gestellt werden (abhängig von der Anzahl der Clients, also unbegrenzt).

Ich bin viel mehr besorgt über die Geschwindigkeit des Zugriffs auf die Daten für die Clients als ich bin für die Geschwindigkeit, mit der ich cam Updates auf die Daten durchführen.

Welche mehr Sinn und warum ?:

  • eine Tabelle für alle Kategorien mit Spalten erlaubt sein null für jede Kategorie
  • einer Tabelle (zum Beispiel PET-Lieferungen für den Stromverbrauch würde null) macht mit Spalten wiederholt
  • einer Tabelle (zum Beispiel Preis würde in jeder Tabelle sein) für die gemeinsamen Merkmale (Preis, Hersteller, etc ...) und eine Tabelle für die einzigartigen Eigenschaften

Antwort

2

Ich würde sagen, eine Tabelle für die gemeinsamen Merkmale und eine andere mit einzigartigen Eigenschaften.

Sie könnten etwas wie das Decorator-Muster simulieren, wobei die zusätzlichen Eigenschaften nur mit den Produkten verknüpfte Tags sind.

Sie werden wahrscheinlich Gruppierungen von Tags benötigen, um das Hinzufügen neuer Produkte zu erleichtern.

Mit der obigen Konfiguration wird es Ihnen wahrscheinlich leichter fallen, mit neuen Tags zu erweitern und Tags hinzuzufügen oder zu entfernen, wenn sich die Klassifizierungen ändern.


Ich konnte die folgenden Probleme mit den anderen Ansätzen sehen.

Wenn alles in einer Tabelle wäre, müssten Sie alles im Voraus wissen und die Tabelle ständig ändern, da ein neues Feld erstellt wurde und viele Felder als NULL belassen werden.

Mit der Tabelle pro Kategorie würden Sie am Ende viele verschiedene Abfragen für jeden Produkttyp erstellen müssen und vorwärts gehen, es könnte schwierig werden, zu warten.

3

Machen Sie einen Schritt zurück und ziehen Sie Ihren Kopf aus der Datenbank. Wie werden Sie das in Ihrer Anwendung lösen? Normalerweise verwenden Sie die Vererbung. Super-Klassen definieren die gemeinsamen Eigenschaften, während Unterklassen die speziellen Merkmale definieren.

Ihre Frage kann wie folgt umgeschrieben werden: Wie implementiere ich Vererbung in einer Datenbank?

Versuchen Sie zunächst, die Datenduplikation zu vermeiden. Wenn Sie bei Ihren Transaktionen (oder in Ihrem Code) einen einfachen Fehler machen, können Daten inkonsistent werden und niemand würde wissen, welcher Preis der richtige ist.

Die eine große Tabelle ist wahrscheinlich keine gute Lösung, da Sie eventuell eine neue Funktion hinzufügen möchten. Dies führt zu mehr und mehr verschwendeten Speicherplatz in Ihrer Datenbank. Außerdem müssen Sie entweder Abfragen pro Klasse erstellen oder viele NULL-Werte aus der Datenbank abrufen.

Dies führt zu einem Multi-Table-Verfahren. Die allgemeine Basisklasse wird der zentralen Tabelle zugeordnet, die den Instanzen IDs gibt. Alle Unterklassen verwenden kleinere, spezielle Tabellen, die eine ID-Spalte haben, die aus der Basisklasse gefüllt wird.

Wenn Sie Daten laden, verbinden Sie alle Tabellen für eine Klasse zusammen und laden Sie alle Daten auf einmal (mit der ID in allen Tabellen). Dies ist sehr effektiv, da die Datensuche über den eindeutigen Primärschlüssel erfolgt und die einfache ID = ID-Verknüpfung nicht viel kostet.

Verwandte Themen