La mejor manera de almacenar un valor que podría ser de varios tipos

10

Me gustaría volver a hacer una pregunta de una manera más directa y general:

¿Cómo se crea una tabla para almacenar valores que podrían ser múltiples tipos diferentes?

En mi caso, los valores proporcionan diagnósticos sobre un evento. Ej: Evento ocurrido -> Almacenar lecturas de múltiples PLC que contienen información pertinente sobre el evento. Los PLC pueden monitorear cualquier tipo de datos.

Algunos ejemplos que se me ocurren:

  • Cree una columna para cada tipo posible y cree otra columna para indicar qué columna usar
    • Ej: Cols: IntVal, StrVal, BoolVal, Type. Vals: nulo, nulo, verdadero, "BOOL"
  • Almacene los valores sin importar como varchar
Playa Jared
fuente

Respuestas:

9

Parece que ya le han dicho que se está desviando por el camino hacia el modelo EAV . Eche un vistazo a la imagen aquí para saber por qué se debe evitar el modelo EAV a casi todos los costos.

Bill Karwin, el autor responsable de la imagen de arriba, ha escrito un libro "Antipatterns SQL: evitando las trampas de la programación de bases de datos" y dedica el primer capítulo al antipatrón EAV. También es un gran bateador en este grupo y enorme en StackOverflow (para problemas de base de datos).

Mi consejo sería tener una tabla para cada tipo de resultado y luego usar VIEWs para combinarlos cuando sea necesario.

Como ejemplo, podrías tener

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

Haga lo mismo para num_result, excepto que sustituya nresult INT (FLOAT ... lo que sea) por cresult, la misma idea para VARCHAR & c.

Luego cree VIEWs sobre sus diferentes tablas de resultados para result_correct(y otros campos - number_of_attempts... & c. Sean cuales sean sus otros campos). ¡En este caso, está comparando me gusta con me gusta y no realiza cálculos equivalentes a agregar población a la altitud según la hilarante imagen mencionada anteriormente!

Vérace
fuente
Como un contador a Bill, he escrito a favor de EAV aquí: sqlblog.com/blogs/aaron_bertrand/archive/2009/11/19/…
Aaron Bertrand
No creo que tener varios tipos posibles para la misma columna lógica constituya un EAV. Creo que está buscando un tipo de "variante / objeto". Eso es mucho más fácil de hacer con unas pocas columnas que una tabla por tipo. Eso suena muy inconveniente. Y después de crear la vista, en realidad es lo mismo que crear los tipos en la misma tabla.
Usr
@usr Me interesaría ver tu solución.
Jared Beach
2
Solo una columna por tipo me parece bien. Lo he hecho así en el pasado. Es la solución menos mala. Aquí hay otro argumento: ¿Qué pasaría si hubiera dos columnas de tipo variable? La solución de esta respuesta requiere un número cuadrático de tablas. Se podría dividir en una tabla básica más N * M más tablas ... Esto no parece correcto.
Usr
@usr no es un problema con su solución que ninguna de esas columnas puede ser NOT NULL? Personalmente, creo firmemente en tener una NOT NULLconstante siempre que sea posible .
Vérace