Hace un tiempo, encontramos la disyuntiva ante los escenarios de variables estilo tipo, entiéndase por ejemplo, un factura puede ser de tipo compra, venta, nota de débito o nota de crédito.
Al momento de hacer un modelado orientado a objetos, pudiéramos decir que se representa por un atributo llamado “type” de la clase cadenas de caracteres. Entonces, el código sería algo como:
<?php
class Invoice extends Model
{
/**
* @const TYPE
*/
const TYPE = [
‘purchase’ => ‘factura compra’,
‘sale’ => ‘factura venta’,
‘debit’ => ‘nota de débito’,
‘credit’ => ‘nota de crédito,
];/**
* @var string
*/
protected $type;public __construct()
{
$this->type = self::TYPE[‘sale’];
}
}
El otro escenario planteado, es modelar como el tipo como un entero, entonces el modelado sería algo como:
<?php
class Invoice extends Model
{
/**
* @const TYPE
*/
const TYPE = [
‘purchase’ => 0,
‘sale’ => 1,
‘debit’ => 2,
‘credit’ => 3,
];/**
* @var int
*/
protected $type;public __construct()
{
$this->type = self::TYPE[‘sale’];
}
}
De allí surgen varios argumentos que traemos a discusión. Según Sebastían Paaske, con lo enteros, las comparaciones se pueden llevar a cabo en un solo ciclo del procesador, que por el contrario, una cadena de caracteres, suponen un arreglo de varios caracteres, por lo que, en el peor caso, se deben revisar todos los caracteres de la cadena (string).
Aunado, si hablamos en términos de motores SQL, Gail nos muestra sus pruebas de rendimiento, comparando consultas para valores enteros y cadenas de caracteres. Allí se pudo concluir que los rendimientos son más eficientes si manejamos tipo enteros en lugar de cadenas de caracteres.
Asimismo, los enteros son mas eficientes, en cuanto al uso de recursos de espacio de almacenamiento. Un entero (INT) ocupa 4 bytes y entero tipo TINYINT, el cuál se ajuta para modelar un tipo de factura solamente 1 byte. Por su lado, un VARCHAR para representar ‘factura compra’ utilizaría 15 bytes.
En conclusión, podemos decir que es preferible utilizar tipos numéricos que se puedan representar como enteros en lugar de cadenas de caracteres.