Por que os códigos de atributo têm um comprimento máximo?

9

Ao tentar criar atributos, descobri que o comprimento máximo de um código de atributo é de 30 caracteres. Acontece, porém, que isso NÃO é realmente algum tipo de restrição real - é um valor completamente arbitrário, definido por

Mage_Eav_Model_Entity_Attribute::ATTRIBUTE_CODE_MAX_LENGTH.

Então, considerando isso, por que existe alguma restrição? E por que o padrão 30, e não o exemplo 255, é o limite real da coluna do banco de dados?

PS. Se alguém puder pensar em tags melhores para esta pergunta, atualize-as.

Benubird
fonte

Respostas:

8

Isso quase certamente foi alterado na parte 1.6 da adição do suporte Oracle - no Oracle, as colunas podem ter apenas 30 caracteres, então muitos atributos do Magento foram reduzidos, e imagino que essa restrição foi adicionada ao mesmo tempo.

Veja http://m-chanaan.hr/wp-content/uploads/2013/04/RDBMS_Guide2.pdf para muita discussão sobre isso.

xifóide
fonte
11
Este. Eu apenas bisbilhotei algumas antigas bases de código beta 1.5 e a ATTRIBUTE_CODE_MAX_LENGTHconstante não existia.
Alan Storm
6

Um exemplo perfeito de equipes ou desenvolvedores individuais que não conversam entre si. Enquanto a eav_attributetabela principal atrtibute_codeé a varchar(255), esse valor de código é frequentemente usado em outras tabelas.

Em catalog_product_link_attributeque há um product_link_attribute_codeatributo (que é o código de atributo), e esta é uma coluna varchar(32). Nos tempos pré-históricos, quando os objetos de vendas eram objetos EAV, eles tinham uma coluna attribute_code que tinha varchar(50)um comprimento.

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

Eu imagino que há outros também.

Sem uma especificação ou acordo real sobre o que estava sendo construído, o desenvolvedor responsável pela interface do usuário da seção de atributos provavelmente examinou todas as attribute_codecolunas, escolheu a mais curta e aplicou um comprimento para garantir que os usuários não pudessem criar um código de atributo isso seria muito longo para uma das várias tabelas em que outros desenvolvedores estavam trabalhando.

Quanto ao motivo pelo qual um desenvolvedor escolheria um varchartamanho que não era 255- existe uma escola de pensamento sobre o design do banco de dados que diz que você só cria suas colunas o tempo necessário para economizar espaço em disco, reduzir a RAM, ser mais eficiente nas operações de junção , etc. Alguns desenvolvedores ainda mantêm isso em relação à tendência moderna de "torná-lo o maior possível e se preocupar com implicações no desempenho posteriormente". É claro que houve discordância quanto ao tamanho máximo de um varcharfor attribute_code's entre a equipe principal do Magento em um ponto, e agora ele permanece no código legado.

Alan Storm
fonte
Por mais perfeito que tenha sido um exemplo, acho que o @xyphoid tem a resposta menos irritadiça (e correta).
Alan Storm
0

Como o xyphoid diz, a limitação anterior foi causada quando o Oracle BD foi suportado, porque no Oracle as colunas podem ter apenas 30 caracteres.

Agora,

Após modificação do núcleo okorshenko ( PR # 10225 )

const ATTRIBUTE_CODE_MAX_LENGTH = 60;

A tabela a seguir descreve o comprimento máximo para cada tipo de identificador.

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

O valor é definido como 60 porque no código de atributo do modo simples será transformado em nome da coluna. O MySQL permite apenas 64 símbolos no nome da coluna.

Nolwennig
fonte
-5

Para resolver esse erro, use este código

CONST ATTRIBUTE_CODE_MAX_LENGTH = 30; a 60

O código deve ser

CONST ATTRIBUTE_CODE_MAX_LENGTH = 60;

Isso resolverá seu problema.

Sweet72
fonte
4
Uma modificação central ?! Certamente você está brincando.
philwinkle
11
Por que 60 e não 212?
Marius
11
Por que não 5000000?
precisa saber é o seguinte
Você não poderá salvar as opções de atributos ao editar produtos, se o fizer ...
loeffel
@Marius: Código atributo EAV será transformado em nome da coluna para tabelas planas e MySQL não suporta nome de coluna com mais de 64 símbolos
Nolwennig