Pregunta

decir que tengo un sistema con los productos que puede tener varios decoración (o imprimir) opciones.

La mayoría de los productos tendrán una gama similar de impresión nombres de opciones, pero algunos quizás único para un solo producto.

Por ejemplo, podría tener una tapa que puede tener tres opciones diferentes de decoración:

  1. sin marca
  2. Una impresión en color
  3. bordado

Mi objetivo está tratando de reducir al mínimo los nombres de opciones de decoración creadas por los usuarios administradores por lo que son siempre los mismos. ES DECIR. No quiero algunas opciones de decoración que se denominan "1 de impresión en color" y luego otro llamado "Uno de impresión en color".

Así que mi plan se encuentra en la interfaz de usuario es tener un menú desplegable de nombres de opciones de decoración existentes, sino que también les dará la opción de añadir una nueva (para los casos extremos).

Sin embargo, cada opción de decoración tiene varios otros datos con la misma, como el costo de preparación, tiempo de producción, etc, que varía en función del producto.

Por ejemplo, Hat1 y Hat2 podría ambos tienen una opción de decoración del bordado, pero el costo de instalación de Hat1 es de $ 49 y el costo de instalación de Hat2 es solamente $ 35.

Así que mi pregunta es, ¿cuál es la mejor manera de estructurar mis entidades? Debería tener tres entidades: Producto, DecorationOption y DecorationOptionName? O sólo dos entidades:? Producto y DecorationOption

Por favor vea mis ejemplos de código para entender mejor:

  1. Tres
  2. Dos
¿Fue útil?

Solución

Me gustaría utilizar el enfoque de tres entidad, con algunas pequeñas diferencias en la semántica: Producto, Decoración y ProductDecoration. Básicamente se trata de la idea detrás de muchos-a-muchos tabla de unión, pero tratar el unidas en su propio objeto, donde se puede almacenar información adicional.

Productos y decoración son sus propias entidades separadas, y la información sobre la relación entre un producto dado y cualquier DecorationOption dado se gestiona de ProductDecoration. Esto se puede conseguir utilizando dos relaciones uno a muchos.

<?php

class Product 
{   
    /** @OneToMany(targetEntity="ProductDecoration", mappedBy="product") */
    private $productDecorations;

}


class Decoration
{   
   /** @Column(type="string") */
   private $name;   

   /** @OneToMany(targetEntity="ProductDecoration", mappedBy="decoration") */
   private $productDecorations;
}

class ProductDecorations
{   

   /** @ManyToOne(targetEntity="Product", inversedBy="productDecorations") */
   private $product;

   /** @ManyToOne(targetEntity="Decoration", inversedBy="productDecorations") */
   private $decoration;

   /** @Column(type="integer") */
   private $setupCost;

   /** @Column(type="integer") */
   private $productionTime
}

La única manera que le recomiendo usar el enfoque de dos Entidad es si se puede anticipar que nunca necesita más de la columna 'nombre' para la entidad Decoración, y usted no está preocupado por los posibles problemas de normalización de bases de datos.

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