Pregunta

Sé que los pares de valor clave no son un buen diseño de base de datos, no se normalizan, etc., sin embargo, en este caso creo que son la solución más apropiada.

Mi excusa para esto y algunos antecedentes: Se está empujando un gran conjunto de elementos en un conjunto de tablas, y cada elemento se puede etiquetar con metadatos arbitrarios que el usuario puede elegir. El usuario puede elegir los metadatos porque están especificando cómo desea clasificar, informar y ver los elementos más adelante. Para este problema comercial específico, no es nuestro lugar (como diseñadores de sistemas) decir cuáles son estas dimensiones. No hay un conjunto consistente de claves utilizadas en todos los elementos y, en algunos casos, la presencia de una determinada clave se utilizará como condición de filtro.

Otro poco de información de fondo, las entradas se insertarán, pero no se actualizarán. Eventualmente serán eliminados (secuencialmente, en el mismo orden se insertaron).

La pregunta, "almacenamiento eficiente": Por esto me refiero al rendimiento de la consulta (leer). Se utilizarán los siguientes tipos de consultas:

  • Obtenga elementos con la clave dada, cualquier valor
  • Obtenga elementos con la clave y el valor dados
  • Obtenga elementos con todos los nombres clave
  • Obtenga elementos con todos los nombres y valores clave

Básicamente, ¿cuál es la mejor opción dadas estas opciones?:

OPCIÓN 1

Items table:
item_id (integer, pk)
... item fields ...

ItemFacts table:
item_id (integer, fk)
key_name (nvarchar(64))
key_value (nvarchar(128))

OPCION 2

Items table:
item_id (integer, pk)
... item fields ...

Facts table:
fact_id (integer, pk)
key_name (nvarchar(64))
key_value (nvarchar(128))

ItemFacts table:
item_id (integer, fk)
fact_id (integer, fk)

(Podría haber una tercera opción en la que los nombres clave se extraen a una tabla separada nuevamente para reducir la redundancia, ya que puede haber una carga completa de valores usados/posibles para un nombre clave dado, también puede valer la pena considerar)

En términos generales, habrá una gran cantidad de coincidencias de clave/valor duplicadas. Como tal, debe haber un aumento de eficiencia de almacenamiento. Me doy cuenta de que esta es una pregunta un poco abierta, pero ¿qué pasa con el rendimiento de lectura? ¿Qué tal si también presento esta consulta:?

  • Obtenga elementos donde el valor para la clave dada comienza con 'x'

Si puedo proporcionar más aclaraciones, hágamelo saber.

No hay solución correcta

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top