sql >> Base de Datos >  >> RDS >> Mysql

Diseño de tabla de entidad-atributo-valor

Voy a ofrecer una opinión contraria a la mayoría de los comentarios sobre esta pregunta. Mientras que EAV es MALVADO por todas las razones que puede encontrar detalladamente explicadas muchas veces aquí en SO y DBA.SE y en otros lugares, hay una aplicación muy común para la cual la mayoría de las cosas que están mal con EAV son en gran medida irrelevantes y las (pocas) ventajas de EAV son muy pertinentes. Esa aplicación son catálogos de productos en línea.

El principal problema con EAV es que no permite que la base de datos haga lo que realmente sabe hacer, que es ayudar a brindar el contexto adecuado a diferentes atributos de información sobre diferentes entidades al organizarlos en un esquema . Tener un esquema brinda muchas, muchas ventajas en cuanto al acceso, la interpretación y el cumplimiento de la integridad de sus datos.

El hecho de los catálogos de productos es que los atributos de un producto son casi totalmente irrelevantes para el sistema de catálogo sí mismo. Los sistemas de catálogo de productos hacen (como máximo) tres cosas con los atributos del producto.

  1. Muestre los atributos del producto en una lista para los usuarios finales en el formulario:{nombre del atributo}:{valor del atributo}.

  2. Muestre los atributos de varios productos en una cuadrícula de comparación donde los atributos de diferentes productos se alinean entre sí (los productos suelen ser columnas, los atributos suelen ser filas)

  3. Reglas de control para algo (p. ej., precios) en función de combinaciones particulares de atributo/valor.

Si todo lo que hace su sistema es regurgitar información que es semánticamente irrelevante (para el sistema), entonces el esquema para esta información es básicamente inútil. De hecho, el esquema interfiere en un catálogo de productos en línea, especialmente si su catálogo tiene muchos tipos diversos de productos, porque siempre tiene que volver al esquema para modificarlo y permitir nuevas categorías de productos o tipos de atributos.

Debido a cómo se usa, incluso el tipo de datos de un valor de atributo en un catálogo de productos no es necesariamente (vitalmente) importante. Para algunos atributos, es posible que desee imponer restricciones, como "debe ser un número" o "debe provenir de esta lista {...}". Eso depende de cuán importante sea la consistencia de los atributos para su catálogo y cuán elaborada desee que sea su implementación. Mirando los catálogos de productos de varios minoristas en línea, diría que la mayoría está preparada para sacrificar la simplicidad por la consistencia.

Sí, EAV es malvado, excepto cuando no lo es.