Warum haben Attributcodes eine maximale Länge?

9

Beim Versuch, Attribute zu erstellen, habe ich festgestellt, dass die maximale Länge eines Attributcodes 30 Zeichen beträgt. Es stellt sich jedoch heraus, dass dies KEINE echte Einschränkung ist - es ist ein völlig willkürlicher Wert, definiert durch

Mage_Eav_Model_Entity_Attribute::ATTRIBUTE_CODE_MAX_LENGTH.

Warum gibt es angesichts dessen überhaupt eine Einschränkung? Und warum ist die Standardeinstellung 30 anstelle von beispielsweise 255 die tatsächliche Grenze der Datenbankspalte?

PS. Wenn sich jemand bessere Tags für diese Frage vorstellen kann, aktualisieren Sie diese bitte.

Benubird
quelle

Antworten:

8

Dies wurde mit ziemlicher Sicherheit in 1.6 Teil des Hinzufügens der Oracle-Unterstützung geändert. In Oracle können Spalten nur 30 Zeichen lang sein, sodass viele Magento-Attribute verkürzt wurden, und ich kann mir vorstellen, dass diese Einschränkung gleichzeitig hinzugefügt wurde.

Weitere Informationen hierzu finden Sie unter http://m-chanaan.hr/wp-content/uploads/2013/04/RDBMS_Guide2.pdf .

Xyphus
quelle
1
Dies. Ich habe mich nur in einigen alten 1.5 Beta-Codebasen umgesehen und die ATTRIBUTE_CODE_MAX_LENGTHKonstante existierte nicht.
Alan Storm
6

Ein perfektes Beispiel für Teams oder einzelne Entwickler, die nicht miteinander sprechen. Während die eav_attributeHaupttabelle a atrtibute_codeist varchar(255), wird dieser Codewert häufig in anderen Tabellen verwendet.

In catalog_product_link_attributegibt es ein product_link_attribute_codeAttribut (das ist der Attributcode), und diese Spalte ist ein varchar(32). In prähistorischen Zeiten, als die Verkaufsobjekte EAV-Objekte waren, hatten sie eine Attributcode-Spalte mit varchar(50)einer Länge.

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

Ich stelle mir vor, es gibt auch andere.

Ohne eine tatsächliche Spezifikation oder Vereinbarung darüber, was erstellt wurde, hat der für die Benutzeroberfläche des Attributabschnitts verantwortliche Entwickler wahrscheinlich alle attribute_codeSpalten überprüft, die kürzeste ausgewählt und eine Länge erzwungen, um sicherzustellen, dass Benutzer keinen Attributcode erstellen konnten Das wäre zu lang für eine der verschiedenen Tabellen, an denen andere Entwickler arbeiteten.

Warum ein Entwickler eine varcharLänge wählen würde, die nicht so ist 255- es gibt eine Denkschule zum Datenbankdesign, die besagt, dass Sie Ihre Spalten nur so lange erstellen, wie es erforderlich ist, um Speicherplatz zu sparen, RAM zu reduzieren und bei Verknüpfungsvorgängen effizienter zu sein usw. Einige Entwickler halten immer noch an diesem modernen Trend fest: "Machen Sie es so groß wie möglich und sorgen Sie sich später um die Auswirkungen auf die Leistung." Es ist klar, dass es Meinungsverschiedenheiten über die maximale Länge eines varcharfor gabattribute_code im Magento-Kernteam gab, und jetzt lebt es im Legacy-Code weiter.

Alan Storm
quelle
So perfekt ein Beispiel auch gewesen sein mag, ich denke, @xyphoid hat die weniger launische (und richtige) Antwort.
Alan Storm
0

Wie xyphoid sagt, wurde die vorherige Einschränkung verursacht, als Oracle BD unterstützt wurde, da in Oracle Spalten nur 30 Zeichen lang sein können.

Jetzt,

Nach Okorshenko-Kernmodifikation ( PR # 10225 )

const ATTRIBUTE_CODE_MAX_LENGTH = 60;

In der folgenden Tabelle wird die maximale Länge für jeden Bezeichnertyp beschrieben.

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

Der Wert ist als 60 definiert, da im Flat-Modus der Attributcode in den Spaltennamen umgewandelt wird. MySQL erlaubt nur 64 Symbole im Spaltennamen.

Nolwennig
quelle
-5

Verwenden Sie diesen Code, um diesen Fehler zu beheben

CONST ATTRIBUTE_CODE_MAX_LENGTH = 30; bis 60

Der Code sollte sein

CONST ATTRIBUTE_CODE_MAX_LENGTH = 60;

Dies wird Ihr Problem lösen.

Sweet72
quelle
4
Eine Kernmodifikation?! Sicher scherzen Sie.
Philwinkle
1
Warum 60 und nicht 212?
Marius
1
Warum nicht 5000000?
Buttle Butkus
Sie können Attributoptionen beim Bearbeiten von Produkten nicht speichern, wenn Sie dies tun ...
Loeffel
@Marius: EAV-Attributcode wird in Spaltennamen für flache Tabellen umgewandelt und MySQL unterstützt keinen Spaltennamen mit mehr als 64 Symbolen
Nolwennig