Pourquoi les codes d'attribut ont-ils une longueur maximale?

9

En essayant de créer des attributs, j'ai découvert que la longueur maximale d'un code d'attribut est de 30 caractères. Il s'avère cependant que ce n'est PAS réellement une sorte de véritable restriction - c'est une valeur complètement arbitraire, définie par

Mage_Eav_Model_Entity_Attribute::ATTRIBUTE_CODE_MAX_LENGTH.

Donc, étant donné cela, pourquoi y a-t-il une restriction? Et pourquoi la valeur par défaut est 30, plutôt que par exemple 255, qui est la limite réelle de la colonne de base de données?

PS. Si quelqu'un peut penser à de meilleures balises pour cette question, veuillez les mettre à jour.

Benubird
la source

Réponses:

8

Cela a presque certainement été changé dans la partie 1.6 de l'ajout de la prise en charge d'Oracle - dans Oracle, les colonnes ne peuvent contenir que 30 caractères, donc beaucoup d'attributs Magento ont été raccourcis, et j'imagine que cette restriction a été ajoutée en même temps.

Voir http://m-chanaan.hr/wp-content/uploads/2013/04/RDBMS_Guide2.pdf pour de nombreuses discussions à ce sujet.

xyphoïde
la source
1
Cette. J'ai juste fouillé quelques anciennes bases de code bêta 1.5 et la ATTRIBUTE_CODE_MAX_LENGTHconstante n'existait pas.
Alan Storm
6

Un parfait exemple d'équipes ou de développeurs individuels qui ne se parlent pas. Bien que la eav_attributetable principale atrtibute_codesoit un varchar(255), cette valeur de code est souvent utilisée dans d'autres tables.

Il catalog_product_link_attributey a un product_link_attribute_codeattribut (qui est le code d'attribut), et cette colonne est un varchar(32). À l'époque préhistorique, lorsque les objets de vente étaient des objets EAV, ils avaient une colonne attribute_code qui avait varchar(50)une longueur.

# 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');

J'imagine qu'il y en a aussi d'autres.

Sans spécification ou accord réel sur ce qui était en cours de construction, le développeur en charge de l'interface utilisateur pour la section d'attribut a probablement regardé toutes les attribute_codecolonnes, choisi la plus courte et appliqué une longueur pour s'assurer que les utilisateurs ne pouvaient pas créer un code d'attribut ce serait trop long pour l'une des différentes tables sur lesquelles d'autres développeurs travaillaient.

Quant à savoir pourquoi un développeur choisirait une varcharlongueur qui n'était pas 255- il y a une école de pensée sur la conception de base de données qui dit que vous ne faites vos colonnes que tant qu'elles doivent être pour économiser de l'espace disque, réduire la RAM, être plus efficace dans les opérations de jointure , etc. Certains développeurs tiennent toujours à cela par rapport à la tendance moderne de "le rendre aussi grand que possible et de se soucier des implications de performances plus tard". Il est clair qu'il y avait un désaccord sur la longueur maximale d'un varcharfor attribute_codeau sein de l'équipe principale de Magento à un moment donné, et maintenant cela continue dans le code hérité.

Alan Storm
la source
Un exemple aussi parfait que cela aurait pu être, je pense que @xyphoid a la réponse moins grincheuse (et correcte).
Alan Storm
0

Comme le dit xyphoid , la limitation précédente a été provoquée lorsque Oracle BD était pris en charge car dans Oracle, les colonnes ne peuvent contenir que 30 caractères.

Maintenant,

Après la modification du noyau okorshenko ( PR # 10225 )

const ATTRIBUTE_CODE_MAX_LENGTH = 60;

Le tableau suivant décrit la longueur maximale de chaque type d'identifiant.

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

La valeur est définie comme 60 car dans le code d'attribut en mode plat sera transformé en nom de colonne. MySQL n'autorise que 64 symboles dans le nom de colonne.

Nolwennig
la source
-5

Pour résoudre cette erreur, veuillez utiliser ce code

CONST ATTRIBUTE_CODE_MAX_LENGTH = 30; à 60

Le code doit être

CONST ATTRIBUTE_CODE_MAX_LENGTH = 60;

Cela résoudra votre problème.

Sweet72
la source
4
Une modification de base?! Vous plaisantez sûrement.
philwinkle
1
Pourquoi 60 et pas 212?
Marius
1
Pourquoi pas 5000000?
Buttle Butkus
Vous ne pourrez pas enregistrer les options d'attribution lors de la modification des produits si vous le faites ...
loeffel
@Marius: le code d'attribut EAV sera transformé en nom de colonne pour les tables plates et MySQL ne prend pas en charge le nom de colonne avec plus de 64 symboles
Nolwennig