Il modo migliore per memorizzare un valore che potrebbe essere di più tipi


10

Vorrei ripetere una domanda in modo più diretto e generale:

Come si crea una tabella per memorizzare valori che potrebbero essere di diversi tipi?

Nel mio caso, i valori forniscono la diagnostica di un evento. Es .: Evento verificato -> Memorizza le letture di più PLC che contengono informazioni pertinenti sull'evento. I PLC potrebbero monitorare qualsiasi tipo di dati.

Alcuni esempi a cui riesco a pensare:

  • Crea una colonna per ogni tipo possibile e crea un'altra colonna per indicare quale colonna utilizzare
    • Es .: Colli: IntVal, StrVal, BoolVal, Type. Vals: null, null, True, "BOOL"
  • Memorizza i valori indipendentemente da varchar

Risposte:


9

Sembrerebbe che ti sia già stato detto che stai andando verso il modello EAV . Dai un'occhiata all'immagine qui per il motivo per cui il modello EAV dovrebbe essere evitato praticamente a tutti i costi.

Bill Karwin, l'autore responsabile dell'immagine sopra, ha scritto un libro "SQL Antipatterns: evitare le insidie ​​della programmazione del database" e dedica il primo capitolo all'anti-pattern EAV. È anche un grande battitore di questo gruppo e grande su StackOverflow (per problemi di database).

Il mio consiglio sarebbe di avere una tabella per ogni tipo di risultato e quindi di usare VIEWs per combinarli quando necessario.

Ad esempio, potresti avere

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

Fai lo stesso per num_result, tranne il sostituto nresult INT (FLOAT ... qualunque) per cresult - stessa idea per VARCHAR & c.

Quindi crea VIEWs sulle diverse tabelle dei risultati per result_correct(e altri campi - number_of_attempts... ecc. - qualunque siano gli altri tuoi campi). In questo caso, stai confrontando i calcoli simili a quelli simili e non peforming equivalenti all'aggiunta della popolazione all'altitudine secondo l'immagine esilarante di cui sopra!


In contrasto con Bill, ho scritto a favore di EAV qui: sqlblog.com/blogs/aaron_bertrand/archive/2009/11/19/…
Aaron Bertrand

Non credo che avere più tipi possibili per la stessa colonna logica costituisca un EAV. Penso che stia cercando un tipo "variante / oggetto". È molto più facile fare con poche colonne rispetto a una tabella per tipo. Sembra molto scomodo. E dopo aver creato la vista è davvero la stessa cosa di creare i tipi nella stessa tabella in primo luogo.
usr

@usr Sarei interessato a vedere la tua soluzione.
Jared Beach,

2
Solo una colonna per tipo mi sembra a posto. L'ho fatto così in passato. È la soluzione meno negativa. Ecco un altro argomento: cosa succede se ci fossero due colonne tipizzate in modo variabile. La soluzione di questa risposta richiede un numero quadratico di tabelle. Si potrebbe dividerlo in una tabella di base più N * M più tabelle ... Questo non sembra giusto.
usr

@usr non è un problema con la tua soluzione che nessuna di quelle colonne può essere NOT NULL? Personalmente, sono un grande sostenitore di avere un NOT NULLdisprezzo quando possibile .
Vérace,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.