Der beste Weg, um einen Wert zu speichern, der mehrere Typen sein kann

10

Ich möchte eine Frage direkter und allgemeiner stellen:

Wie erstellen Sie eine Tabelle zum Speichern von Werten, die mehrere verschiedene Typen haben können?

In meinem Fall bieten die Werte eine Diagnose für ein Ereignis. Beispiel: Ereignis aufgetreten -> Speichern Sie Messwerte von mehreren SPS, die relevante Informationen zum Ereignis enthalten. Die SPS können jede Art von Daten überwachen.

Einige Beispiele, die mir einfallen:

  • Erstellen Sie eine Spalte für jeden möglichen Typ und erstellen Sie eine weitere Spalte, um anzugeben, welche Spalte verwendet werden soll
    • Beispiel: Spalten: IntVal, StrVal, BoolVal, Type. Vals: null, null, True, "BOOL"
  • Speichern Sie die Werte, egal was als varchar
Jared Beach
quelle

Antworten:

9

Es scheint, dass Ihnen bereits mitgeteilt wurde, dass Sie den Weg zum EAV-Modell beschreiten . Schauen Sie sich das Bild hier an, warum das EAV-Modell praktisch um jeden Preis vermieden werden sollte.

Bill Karwin, der Autor, der für das obige Bild verantwortlich ist, hat ein Buch "SQL Antipatterns: Vermeiden der Fallstricke der Datenbankprogrammierung" geschrieben und widmet das erste Kapitel dem EAV-Anti-Pattern. Er ist auch ein großer Hitter auf diese Gruppe und riesige auf Stackoverflow (für Datenbankprobleme).

Mein Rat wäre, eine Tabelle für jede Art von Ergebnis zu haben und sie dann bei Bedarf mit VIEWs zu kombinieren.

Als Beispiel könnten Sie haben

CREATE TABLE char_result
(
  question_id INT,
  user_id INT,
  cresult CHAR,
  result_correct BOOLEAN (or equivalent in your RDBMS)
  ..
  <other stuff>
  ..
);

Machen Sie dasselbe für num_result, außer dass Sie cresult durch nresult INT (FLOAT ... was auch immer) ersetzen - dieselbe Idee für VARCHAR & c.

Erstellen Sie dann VIEWs über Ihre verschiedenen Ergebnistabellen für result_correct(und andere Felder - number_of_attempts... usw. - unabhängig von Ihren anderen Feldern). In diesem Fall vergleichen Sie Gleiches mit Gleichem und führen keine Berechnungen durch, die dem Hinzufügen von Bevölkerung zur Höhe gemäß dem oben erwähnten lustigen Bild entsprechen!

Vérace
quelle
Als Gegenpol zu Bill habe ich hier zugunsten von EAV geschrieben: sqlblog.com/blogs/aaron_bertrand/archive/2009/11/19/…
Aaron Bertrand
Ich denke nicht, dass mehrere mögliche Typen für dieselbe logische Spalte eine EAV darstellen. Ich denke, er sucht nach einem Typ "Variante / Objekt". Mit ein paar Spalten ist das viel einfacher als mit einer Tabelle pro Typ. Das klingt sehr unpraktisch. Und nachdem die Ansicht erstellt wurde, ist es wirklich dasselbe wie das Erstellen der Typen in derselben Tabelle.
usr
@usr Ich würde mich für Ihre Lösung interessieren.
Jared Beach
2
Nur eine Spalte pro Typ scheint mir in Ordnung zu sein. Ich habe es in der Vergangenheit so gemacht. Es ist die am wenigsten schlechte Lösung. Hier ist ein weiteres Argument: Was wäre, wenn es zwei variabel typisierte Spalten gäbe? Die Lösung dieser Antwort erfordert eine quadratische Anzahl von Tabellen. Man könnte es in eine Basistabelle plus N * M weitere Tabellen aufteilen ... Dies scheint nicht richtig zu sein.
usr
@usr ist nicht ein Problem mit Ihrer Lösung, dass keine dieser Spalten sein kann NOT NULL? Persönlich NOT NULLglaube ich fest daran, wann immer möglich einen Konstanten zu haben .
Vérace