Bienvenido a los foros %s

Foro comunidad hispana Dolibarr

Identificarse Registrarse

Problema rendimiento extensión de modelos de datos

Cuestiones sobre cómo utilizar Dolibarr, ayudas sobre las funcionalidades o cualquier cuestión que no está relacionada con un error.
Miguel AR
Novato
Mensajes: 24
Registrado: Mié, 21/09/2016, 12:42

Problema rendimiento extensión de modelos de datos

Mensaje por Miguel AR »

Hola, buenos días.

Estamos mirando la manera más optima para extender las clases de modelos actuales como pudiera ser la clase producto.

Pongamos un ejemplo:

Fichero original:

Código: Seleccionar todo

//file://htdocs/product/class/product.class.php
/**
 * Class to manage products or services
 */
class Product extends CommonObject
{
	/**
  * Codigo omitido
  *
  */
	/**
	 *	Insert product into database
	 *
	 *	@param	User	$user     		User making insert
	 *  @param	int		$notrigger		Disable triggers
	 *	@return int			     		Id of product/service if OK, < 0 if KO
	 */
	function create($user,$notrigger=0)
	{
  	//Aqui se realiza la inserción de los datos nuevos del producto
    //Despues de insertar se llama al trigger "PRODUCT_CREATE"
  }
}
Fichero Extension:

Código: Seleccionar todo

//Ejemplo de extension de clase
//file://htdocs/mymodule/class/myProduct.class.php
/**
 * Class to manage Myproducts or services
 */
class MyProduct extends CommonObject
{
  /**
	 *	{@ineherit}
	 */
	function create($user,$notrigger=0)
	{
  	//Llamamos a nuestra funcion para crear ahora los productos pasando por la padre
    $result = parent::create($user, 0);
    if($result < 0) {
      return $result;
  	}
    
    //Si pasa por aqui significa que el producto se ha creado correctamente
    //Añado propiedades que se han creado nuevas
    $sql = "UPDATE" // Actualizar cambios
    
    //Si se realiza correctamente devolvemos el id del producto tal y como lo hace dolibarr
    if($this->db->query($sql)) {
      return $this->id;
    }
    
    //Comprobaremos el error y devolveremos el codigo correspondiente
    return CODE_ERROR; 
}
Realizar las creaciones con la nueva clase es ineficiente debido a la cantidad de consultas sql que se realizan para una creación:
- Clase original :
- Estamos hablando de un INSERT inicial en la tabla producto
- INSERT secundario en la tabla de precios
- UPDATE inicial en la tabla producto
- Clase Extendida
- UPDATE con el id obtenido del padre

Si se quisiera adaptar mediante el trigger tampoco podriamos eliminar el ultimo UPDATE de la tabla.

Es la primera vez que me enfrento a un problema así, ya que con la mayoria de software/frameworks que he trabajado funcionan de manera similar a esta:

Código: Seleccionar todo

class Product extends BaseModel
{
	// Algo parecido a esto dependiendo del framework es basicamente el funcionamiento actual de los triggers solo que unicamente se llaman 
       //despues de crearse sin poder cambiar absolutamente ningun dato antes de su insercion o actualizacion en la base de datos.
	function create()
	{
    $this->event('product.before.create', $this);
  	//Aqui se realiza la inserción de los datos nuevos del producto
    //Despues de insertar se llama al trigger "PRODUCT_CREATE"
    // Para por ejemplo mandar un mail al cliente o similiares
    $this->event('product.after.create', $this);
  }
  
  //Essto permitira modificar propiedades de la entidad antes de su creacion o actualizacion
  static public function boot()
  {
      parent::boot();
			//evento ejecutado por el conector de la base de datos antes de crear un nuevo registro
      static::creating(function($model) {
          $model->api_token = $this->model->generateApiToken();
      });
			//evento ejecutado por el conector antes de actualizar un registro
      static::updating(function($model){
					if($this->hasAccessToDevelop())
          	$model->api_token = $this->model->generateApiToken();
      });
 
  } 
}
Existe alguna posiblidad de implementar en un futuro en Dolibarr este tipo de herramientas.

A donde quiero llegar es la posiblidad de modificar la primera consulta de en este caso la creacion de productos para no tener que actualizar despues en mi clase.
Cuando se trabaja con pocos registros esto no es problema, pero cuando tienes miles de productos (43k aprox), clientes (189k aprox), facturas (250k aprox), es bastante tedioso.

A ver si alguien puede aportar alguna idea/sugerencia sobre el tema.

Un saludo.

Miguel AR
Novato
Mensajes: 24
Registrado: Mié, 21/09/2016, 12:42

Mensaje por Miguel AR »

Revivo!

A ver si algún programador o entendedor del tema aporta alguna idea, gracias.

Un saludo.

Miguel AR
Novato
Mensajes: 24
Registrado: Mié, 21/09/2016, 12:42

Mensaje por Miguel AR »

Revivo!

Un saludo!