¿Por qué los códigos de atributo tienen una longitud máxima?


9

Al intentar crear atributos, descubrí que la longitud máxima de un código de atributo es de 30 caracteres. Sin embargo, resulta que esto NO es en realidad una especie de restricción real: es un valor completamente arbitrario, definido por

Mage_Eav_Model_Entity_Attribute::ATTRIBUTE_CODE_MAX_LENGTH.

Entonces, dado que, ¿por qué hay alguna restricción? ¿Y por qué el valor predeterminado es 30, en lugar de 255, que es el límite real de la columna de la base de datos?

PD. Si alguien puede pensar en mejores etiquetas para esta pregunta, actualícelas.

Respuestas:


8

Es casi seguro que esto cambió en la parte 1.6 de agregar soporte de Oracle: en Oracle, las columnas solo pueden tener 30 caracteres de longitud, por lo que muchos atributos de Magento se acortaron, e imagino que esta restricción se agregó al mismo tiempo.

Ver http://m-chanaan.hr/wp-content/uploads/2013/04/RDBMS_Guide2.pdf para mucha discusión sobre esto.


1
Esta. Acabo de hurgar en algunas viejas bases de código beta 1.5 y la ATTRIBUTE_CODE_MAX_LENGTHconstante no existía.
Alan Storm

6

Un ejemplo perfecto de equipos o desarrolladores individuales que no hablan entre sí. Si bien la eav_attributetabla principal atrtibute_codees a varchar(255), este valor de código a menudo se usa en otras tablas.

En catalog_product_link_attributehay un product_link_attribute_codeatributo (que es el código de atributo), y esta columna es un varchar(32). En tiempos prehistóricos, cuando los objetos de ventas eran objetos EAV, tenían una columna de atributo_código que tenía varchar(50)como longitud.

# Mage/Sales/sql/sales_setup/mysql4-upgrade-0.9.45-0.9.46.php
$installer->getConnection()->addColumn($this->getTable('sales_order'), $attribute['attribute_code'], 'varchar(50) NULL');

Me imagino que hay otros también.

Sin una especificación o acuerdo real sobre lo que se estaba construyendo, el desarrollador a cargo de la interfaz de usuario para la sección de atributos probablemente miró todas las attribute_codecolumnas, eligió la más corta e impuso una longitud para asegurarse de que los usuarios no pudieran crear un código de atributo eso sería demasiado largo para una de las diversas tablas en las que otros desarrolladores estaban trabajando.

En cuanto a por qué un desarrollador elegiría una varcharlongitud que no fuera así 255: hay una escuela de pensamiento sobre el diseño de la base de datos que dice que solo hace sus columnas siempre que sea necesario para ahorrar espacio en disco, reducir RAM, ser más eficientes en las operaciones de unión , etc. Algunos desarrolladores aún se aferran a esto frente a la tendencia moderna de "hacerlo lo más grande posible y preocuparse por las implicaciones de rendimiento más adelante". Está claro que hubo un desacuerdo sobre la longitud máxima de un varcharfor attribute_codeentre el equipo central de Magento en un punto, y ahora sigue vivo en el código heredado.


Por perfecto que haya sido este ejemplo, creo que @xyphoid tiene la respuesta menos irritable (y correcta).
Alan Storm

0

Como dice xyphoid , la limitación anterior fue causada cuando se admitió Oracle BD porque en Oracle, las columnas solo pueden tener 30 caracteres de longitud.

Ahora,

Después de la modificación del núcleo de Okorshenko ( PR # 10225 )

const ATTRIBUTE_CODE_MAX_LENGTH = 60;

La siguiente tabla describe la longitud máxima para cada tipo de identificador.

| Identifier | Maximum Length (characters) |
|------------|-----------------------------|
| Column     | 64                          |

El valor se define como 60 porque en el modo plano el código de atributo se transformará en el nombre de la columna. MySQL solo permite 64 símbolos en el nombre de la columna.


-5

Para resolver este error, use este código

CONST ATTRIBUTE_CODE_MAX_LENGTH = 30; a 60

El código debe ser

CONST ATTRIBUTE_CODE_MAX_LENGTH = 60;

Esto resolverá tu problema.


44
¿Una modificación central? Seguramente bromeas.
philwinkle

1
¿Por qué 60 y no 212?
Marius

1
¿Por qué no 5000000?
Buttle Butkus

Usted no será capaz de salvar attribut Opciones durante la edición de productos, si lo hace ...
Loeffel

@Marius: el código de atributo EAV se transformará en el nombre de la columna para tablas planas y MySQL no admite el nombre de la columna con más de 64 símbolos
Nolwennig
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.