2012-05-31 16 views
7

Tengo un viejo acertijo, así que pensé en compartirlo con usted, puede ser que vaya en la dirección correcta. La cosa es que algunas de nuestras entidades en la base de datos son bastante grandes (lee tienen muchas propiedades) y rara vez la lógica empresarial usa todas las propiedades de la entidad, por lo que cada vez que necesito pensar qué propiedades deben cargarse para que la lógica empresarial funcione correctamente. muestra muy hipotética:Entidades haciendo demasiado?

public class Product 
{ 
    public string Title {get;set;} 
    public string Description {get;set;} 

    public string RetailPrice {get;set;} 
    public string SupplierId {get;set;} 

    public Supplier Supplier { get;set;} 

    // many other properties 
} 

public class ProductDiscountService 
{ 
    public decimal Get(Product product) 
    { 
     // use only RetailPrice and Supplier code 
     return discount; 
    } 
} 

public class ProductDescriptionService 
{ 
    public string GetSearchResultHtml(Product product) 
    { 
     // use only Title and Description 
     return html; 
    } 
} 

Parece como si pudiera extraer las interfaces IDiscountProduct y ISearchResultProduct, producto de marca como la implementación de esas interfaces, a continuación, crear dtos más pequeños de ejecución cada una de esas interfaces, pero que se ve en este momento como una exageración (por lo menos No he visto a nadie agrupando propiedades usando interfaces).

dividir entidad en la base de datos a entidades más pequeñas tampoco parece razonable, ya que todas esas propiedades pertenecen al producto y me temo que me veré obligado a utilizar muchas combinaciones para seleccionar algo y si voy a decidir eso alguna propiedad pertenece a otra entidad, ese movimiento será bastante difícil de implementar.

Tener todas las propiedades utilizadas en la lógica empresarial del método particular como parámetro de método también parece una mala solución.

+0

¿De cuántas propiedades estamos hablando? – walther

+0

generalmente más de 10, menos de 20. – Giedrius

+0

Diría: si su método sabe de antemano qué propiedades usar y esto permanece fijo, entonces el uso de parámetros podría ser una buena solución. Fácil de probar y fácil de reutilizar. Sin embargo, si la implementación no está definida en la firma del método (la implementación actual usa 2 propiedades pero mañana podrían convertirse en 3), desea consumir todo el producto con todas las propiedades disponibles. Esto habla de manera consistente: este método requiere estos parámetros y este método requiere un producto. – Polity

Respuesta

1

A menos que las propiedades sean grandes (lea cadenas largas y/o binarios) simplemente las cargaría todas. a continuación

Los puntos son para las propiedades simples (por ejemplo, título)

  1. Sin código adicional (conseguir este producto con el título solamente, o conseguir con precio solamente, bla-bla)
  2. Una instancia de producto es siempre completo, para que pueda pasarlo sin verificar si la propiedad es nula.
  3. Si tiene que cargar otras propiedades perezosas, le costará más que cargarlas con entusiasmo. Si tiene como 20 propiedades, esto ni siquiera es un objeto grande (de nuevo, si su propiedad (hipotética) Descripción no tiene un tamaño de kilobytes).

Ahora, si tiene objetos relacionados (ProductSupplier) - esto debe ser cargado de forma diferida, imo, a menos que sepa que esta propiedad se utilizará.

+0

Bueno, en la descripción real del proyecto es html, por lo que varios kilobytes es el caso habitual.Otra cosa es que, debido a la naturaleza de nuestro modelo de negocio, generalmente procesamos grandes cantidades de productos (miles), por lo que la carga diferida no es aceptable debido al gran número de consultas. Entonces, si tiene miles de productos y kilobytes en propiedades, es muy importante lo que carga desde la base de datos :) Estaba pensando en colocar algo de almacenamiento de lectura rápida como reddis en el medio, siempre y cuando haya muchas más lecturas que escrituras. – Giedrius

+0

Depende de un tipo de procesamiento. Cuando tuvimos que trabajar con un gran conjunto de datos en el pasado, simplemente lo cargamos en la memoria y trabajamos desde allí, pero ese conjunto era de solo lectura ... y terminamos descartando esa solución y volviendo a la base de datos. De todos modos, en tu caso, creo que mediría la frecuencia con la que realmente necesitas las propiedades y cuál es el impacto real de cargarlas con entusiasmo. Todavía no creo que varias Kb por registro sean tan grandes, incluso si tiene unos pocos (5-10?) Miles de registros, eso es solo unos pocos MB para leer. Tener un índice adecuado sería mucho más importante. – Evgeni

+0

Reddis o memcached podría valer la pena también. Depende de tus necesidades, pero algo como RavenDB también podría ser útil. – Evgeni