Perché i codici degli attributi hanno una lunghezza massima?


9

Quando ho cercato di creare attributi, ho scoperto che la lunghezza massima di un codice di attributo è di 30 caratteri. Si scopre però che questa NON è in realtà una sorta di vera restrizione - è un valore completamente arbitrario, definito da

Mage_Eav_Model_Entity_Attribute::ATTRIBUTE_CODE_MAX_LENGTH.

Detto questo, perché esiste una restrizione? E perché è il valore predefinito 30, anziché ad esempio 255, che è il limite effettivo della colonna del database?

PS. Se qualcuno può pensare a tag migliori per questa domanda, si prega di aggiornarli.

Risposte:


8

Questo è stato quasi sicuramente cambiato nella parte 1.6 dell'aggiunta del supporto Oracle: in Oracle, le colonne possono contenere solo 30 caratteri, quindi molti attributi di Magento sono stati abbreviati e immagino che questa restrizione sia stata aggiunta allo stesso tempo.

Vedi http://m-chanaan.hr/wp-content/uploads/2013/04/RDBMS_Guide2.pdf per molte discussioni su questo.


1
Questo. Ho appena cercato alcune vecchie basi di codice 1.5 beta e la ATTRIBUTE_CODE_MAX_LENGTHcostante non esisteva.
Alan Storm

6

Un esempio perfetto di team o singoli sviluppatori che non parlano tra loro. Mentre la eav_attributetabella principale atrtibute_codeè a varchar(255), questo valore di codice viene spesso utilizzato in altre tabelle.

In catalog_product_link_attributec'è un product_link_attribute_codeattributo (che è il codice dell'attributo) e questa colonna è un varchar(32). Nella preistoria, quando gli oggetti di vendita erano oggetti EAV, avevano una colonna attributo_codice che aveva varchar(50)una lunghezza.

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

Immagino ci siano anche altri.

Senza una specifica effettiva o un accordo su ciò che veniva creato, lo sviluppatore responsabile dell'interfaccia utente per la sezione degli attributi probabilmente guardava tutte le attribute_codecolonne, sceglieva la più breve e imponeva una lunghezza per assicurarsi che gli utenti non potessero creare un codice di attributo sarebbe troppo lungo per uno dei vari tavoli su cui stavano lavorando altri sviluppatori.

Per quanto riguarda il motivo per cui uno sviluppatore avrebbe scelto una varcharlunghezza che non lo era 255- c'è una scuola di pensiero sulla progettazione del database che dice che fai le tue colonne solo finché devono essere per risparmiare spazio su disco, ridurre la RAM, essere più efficienti nelle operazioni di join , ecc. Alcuni sviluppatori sostengono ancora questo rispetto alla tendenza moderna di "renderlo il più ampio possibile e preoccuparsi delle conseguenze sulle prestazioni in un secondo momento". È chiaro che ad un certo punto c'era disaccordo sulla lunghezza massima di un varcharfor attribute_code's nel core team di Magento, e ora sopravvive nel codice legacy.


Un esempio perfetto come potrebbe essere stato, penso che @xyphoid abbia la risposta meno irritabile (e corretta).
Alan Storm,

0

Come dice xyphoid , la precedente limitazione era stata causata dal supporto di Oracle BD perché in Oracle le colonne possono contenere solo 30 caratteri.

Adesso,

Dopo la modifica del core di okorshenko ( PR # 10225 )

const ATTRIBUTE_CODE_MAX_LENGTH = 60;

La tabella seguente descrive la lunghezza massima per ciascun tipo di identificatore.

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

Il valore è definito come 60 perché nella modalità flat il codice dell'attributo verrà trasformato in nome di colonna. MySQL consente solo 64 simboli nel nome della colonna.


-5

Per risolvere questo errore, utilizzare questo codice

CONST ATTRIBUTE_CODE_MAX_LENGTH = 30; a 60

Il codice dovrebbe essere

CONST ATTRIBUTE_CODE_MAX_LENGTH = 60;

Questo risolverà il tuo problema.


4
Una modifica fondamentale ?! Sicuramente scherzi.
Filwinkle,

1
Perché 60 e non 212?
Marius

1
Perché non 5000000?
Buttle Butkus,

Se non lo fai, non sarai in grado di salvare le opzioni di attributo durante la modifica dei prodotti ...
loeffel

@Marius: il codice dell'attributo EAV verrà trasformato nel nome della colonna per le tabelle piane e MySQL non supporta il nome della colonna con più di 64 simboli
Nolwennig,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.