2009-05-26 6 views
2

Ich verwende eine Tabelle GadgetData, um die Eigenschaften von Gadgets in meiner Anwendung zu speichern. Gadgets sind im Grunde eine Art von benutzerdefinierten Steuerelement, die 80% der Eigenschaften wie Höhe, Breite, Farbe, Typ usw. gemeinsam haben. Es gibt einige Eigenschaften pro Gadget-Typ, die für sie einzigartig sind. Alle diese Daten müssen in der Datenbank gespeichert werden. Momentan speichere ich nur gemeinsame Eigenschaften. Welchen Design-Ansatz sollte ich verwenden, um diese Art von Daten dort zu speichern, wo die Spalten dynamisch sind.SQL Server Dynamic Columns Problem

  1. Erstellen Sie eine Tabelle mit allgemeinen Eigenschaften als Spalten und fügen Sie eine zusätzliche Spalte vom Typ Text hinzu, um die eindeutigen Eigenschaften aller Gadget-Typen im XML-Format zu speichern.
  2. Erstellen Sie eine Tabelle mit allen möglichen Spalten in allen Gadget-Typen.
  3. Erstellen Sie separate Tabelle für jede Art von Gadgets.
  4. Gibt es noch eine bessere Empfehlung?

(Hinweis: Die Anzahl der Gadget-Typen wachsen könnte sogar über 100 und)

Antwort

3

Option 3 ist eine sehr normalisierte Option, wird aber wiederkehren und Sie beißen, wenn Sie mehrere Typen abfragen müssen - jeder SELECT wird einen weiteren Join haben, wenn ein neuer Typ hinzugefügt wird. Ein Wartungs-Albtraum.

Option 2 (Sparse-Tabelle) hat viele NULL-Werte und benötigt zusätzlichen Speicherplatz. Die Tabellendefinition muss auch aktualisiert werden, wenn in der Zukunft ein anderer Typ hinzugefügt wird. Nicht so schlimm, aber immer noch schmerzhaft.

Ich verwende Option 1 in der Produktion (mit einem xml Typ anstelle von text). Es ermöglicht mir, jeden Typ, der von meinem allgemeinen Typ abgeleitet ist, zu serialisieren, die allgemeinen Eigenschaften zu extrahieren und die eindeutigen in der Spalte XmlProperties zu belassen. Dies kann in der Anwendung oder in der Datenbank (z. B. eine gespeicherte Prozedur) erfolgen.

0

Je nachdem, wie unterschiedlich die „Gadgets“ sind, würde ich nicht gerne Option 2 würde es eine Menge Nullen sein herum schwimmen , die schlecht werden könnte, wenn Sie eine Spalte hätten, die für ein Gadget obligatorisch ist, aber nicht für ein anderes.

Ich würde nur Option 3 gehen, wenn die Anzahl der Gadgets selten ändert, da jedes Mal die Datenbank geändert werden müsste.

Die nicht erwähnte Option besteht darin, die Gadgets mit einer untergeordneten Tabelle zu speichern, die die Gadgets eindeutige Werte enthält. Aber das würde eine Menge Arbeit erfordern, um Gadget-Details oder mehrere Datenbank-Aufrufe zurückzugeben.

Verlassen Option 1, außer ich würde SQL-Server XML-Typ anstelle von Text verwenden, können Sie dann XQuery innerhalb Ihrer gespeicherten Prozeduren verwenden.

1

Ihre Optionen:

  1. Der war gut.Könnte sogar Schema etc zwingen
  2. Sie können nicht jene Spalte NOT NULL machen, so dass Sie es so lange
  3. einige Datenintegrität wird verlieren, wie Sie suchen nicht erlauben, für mehr als eine Art von Gadget, ist es gut genug, aber Option 1 ist besser
  4. I ORM

Notes verwenden würde:

Wenn Sie Ihre Datenbank 'relational', aber keine Angst haben ORM-Tools zu verwenden, dann würde ich ein verwenden möchte halten . In diesem Fall können Sie die Daten (fast) so speichern, wie Sie möchten, aber Sie müssen es richtig behandeln, solange Sie sie korrekt abbilden. See:

Wenn Sie SQL-only-Lösung benötigen, dann auf Ihrem RDBMS abhängig, ich wahrscheinlich XML-Spalte verwenden würden alle Daten zu speichern, die auf die spezifischen ist Gadget-Typ: Sie können eine Validierung durchführen, einfach mit neuen Attributen erweitern. Dann können Sie alles in einer Tabelle haben, schnell nach allen allgemeinen Attributen suchen und auch ziemlich einfach nach einem Typattribut suchen.

1

Wenn alle Arten von Gadgets viele gemeinsame obligatorische Eigenschaften haben, die in einer Tabelle gespeichert werden können und nur einige optionale Eigenschaften, verwenden Sie besser den ersten Ansatz: Sie verwenden also das beste relationale Schema und erleichtern Ihr Leben mit XML. Und vergessen Sie nicht, die XML-Schemasammlung zu verwenden, die die XML-Spalte mit ihr verbindet: Sie verfügen über vollständige Indexierungs- und XQuery-Funktionen.

Wenn Gadget-Typen sehr verschiedene Beschreibungen und nur 1-3 gemeinsame Spalten unter 5 oder mehr verschiedene Eigenschaften haben, verwenden Sie den 3. Ansatz.


Aber über die Situation von mehr als 100 Arten von Gadgets I ersten Ansatz verwenden würde: es hat Flexibilität mit guter Leistung und einfacher Unterstützung und Weiterentwicklung unterstützt.