Pregunta

Me estoy diseñando mi base de datos / dominio para una aplicación de comercio electrónico y estoy teniendo un tiempo difícil encontrar la manera de almacenar productos.

La página web va a vender una amplia gama de productos, bolígrafos, tangas, tatuajes, paraguas, todo. Cada uno de estos productos comparten algunas características comunes, altura, anchura, longitud, peso, etc, pero algunos productos tienen datos especiales. Por ejemplo, las plumas tienen diferentes colores de tinta y consejos / tapas y folletos puede tener diferentes tipos de pliegues. Hasta ahora he inventado algunas 20+ atributos adicionales, pero estos atributos pueden aplicarse únicamente al 1% de los productos en el sitio web.

Así que me pregunto si es apropiado para implementar un modelo EAV para manejar los datos adicionales. Teniendo en cuenta que cuando los clientes están viendo el sitio en el frontend, habrá una barra lateral de filtrado como en eBay y carsales.com.au. (Así que teniendo en cuenta que va a ser un poco justo de consulta)

No creo que sea práctico para aplicar la tabla de clase de herencia que el sistema necesita para seguir siendo flexibles. Esto se debe a que, por la pista podemos tener más atributos en el futuro con nuevos tipos de productos.

La otra cosa que he considerado es el uso de una base de datos NoSQL (probablemente MongoDB) sin embargo tiene poca experiencia con este tipo de bases de datos, será aún resolver mi problema?

Examen de las opciones:

  1. Productos de una sola entidad con una gran cantidad de columnas
  2. atributos independiente entidad (EAV)
  3. Cambiar al esquema menor persistencia

Estoy en el proceso de construcción de un prototipo con una entidad atributos para ver lo flexible que es, y probar el rendimiento y cómo fuera de control la consulta pone.

EDIT:. Estoy, por supuesto, abierto a otras soluciones

¿Fue útil?

Solución

Muy buena pregunta, pero por supuesto, no hay "un solo camino verdadero". Según @BenV, Magento hace utilizar el modelo EAV. Mi experiencia con él ha sido muy positiva, sin embargo lo hace tropezar a otros usuarios. Algunas consideraciones:

1. El rendimiento. EAV requiere complejo, multi-mesa se une a poblar el objeto con los atributos relevantes. Eso sí incurre en un golpe de rendimiento. Sin embargo, que puede mitigarse mediante el almacenamiento en caché cuidado (a todos los niveles a través de la pila, incluyendo almacenamiento en caché) y el uso selectivo de desnormalización. Magento sí permite a los administradores seleccionar un modelo desnormalizado para las categorías de productos y donde el número de SKUs lo justifica (generalmente en los miles). Que a su vez requiere que los observadores gatillo volver a clasificar (siempre es bueno!) Y cambios a la "plana" desnormalizar tablas cuando cambian los datos del producto. Eso también se pueden programar manualmente o disparado con un mensaje para el administrador.

2. 3rd Party Complejidad del usuario Si alguna vez va a hacer esta aplicación esté disponible para otros usuarios, muchos encontrarán EAV demasiado complejo y que va a terminar tratando con una gran cantidad de balidos y el abuso desinformados sobre los foros de usuarios (ref Magento !!).

3. Futuras ampliaciones y la arquitectura plug-in. No hay duda de que el modelo EAV realmente entra en su propia cuando la extensibilidad es un factor. Es muy sencillo añadir nuevos atributos en el modelo y reducir al mínimo el riesgo de romper el código ORM y el controlador existente.

4. Los cambios en el tipo de datos EAV hace que sea un poco más difícil de tipos de datos de atributos alter. Si sus llamadas iniciales de diseño para un tipo de datos determinado atributo que los cambios en el futuro (a decir int varchar), esto significa que usted tendrá que migrar todos los registros para ese atributo de la tabla correspondiente que coincida con el nuevo tipo de datos. Por supuesto, los puristas sugerirían que se obtiene el diseño adecuado primera vez, pero la realidad no se inmiscuyen en ocasiones!

5. Manual de las importaciones de productos Una cosa que hace casi imposible EAV es la importación de productos (u otras entidades) en la base de datos utilizando SQL y / o CSV de estilo phpMyAdmin / XML. Tendrá que escribir un módulo de importación, que acepta los datos estructurados y se lo pasa a través de la capa de modelo de la aplicación de persistir a la base de datos. Eso le añade a su complejidad.

Otros consejos

El carrito de la compra de código abierto Magento permite atributos personalizados para sus productos utilizando un diseño EAV. Se puede extraer de su base de datos de esquema aquí .

Yo sugeriría usted a mirar más de cerca en Doctrine 2 ORM con el plugin para que OXM (https://github.com/doctrine/oxm). Se va a resolver su problema con diferentes atributos. Por supuesto, se le pedirá a los índices de compilación para los atributos personalizados de búsqueda, pero no creo que será un problema:)

Si no se preocupan por el número de miembros de la comunidad, entonces se puede usar MongoDB también.

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