Почему коды атрибутов имеют максимальную длину?

9

При попытке создать атрибуты я обнаружил, что максимальная длина кода атрибута составляет 30 символов. Оказывается, однако, что это на самом деле НЕ какое-то реальное ограничение - это совершенно произвольное значение, определяемое

Mage_Eav_Model_Entity_Attribute::ATTRIBUTE_CODE_MAX_LENGTH.

Учитывая это, почему вообще существует ограничение? И почему по умолчанию 30, а не, например, 255, который является фактическим пределом столбца базы данных?

PS. Если кто-то может придумать лучшие теги для этого вопроса, пожалуйста, обновите их.

Benubird
источник

Ответы:

8

Это почти наверняка изменилось в 1.6 части добавления поддержки Oracle - в Oracle столбцы могут иметь длину только 30 символов, поэтому многие атрибуты Magento были сокращены, и я думаю, что это ограничение было добавлено одновременно.

См. Http://m-chanaan.hr/wp-content/uploads/2013/04/RDBMS_Guide2.pdf для большого обсуждения этого.

xyphoid
источник
1
Эта. Я просто покопался в старых 1,5 бета-кодах, а ATTRIBUTE_CODE_MAX_LENGTHконстанты не было.
Алан Шторм
6

Прекрасный пример команд или отдельных разработчиков, не разговаривающих друг с другом. В то время как основная eav_attributeтаблица atrtibute_code- это varchar(255), это кодовое значение часто используется в других таблицах.

Там catalog_product_link_attributeесть product_link_attribute_codeатрибут (который является кодом атрибута), и этот столбец является varchar(32). Еще в доисторические времена, когда объекты продаж были объектами EAV, у них был столбец attribute_code, который имел varchar(50)длину.

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

Я думаю, что есть и другие.

Без фактической спецификации или соглашения о том, что создавалось, разработчик, отвечающий за пользовательский интерфейс для раздела атрибутов, вероятно, просмотрел все attribute_codeстолбцы, выбрал самый короткий и установил длину, чтобы пользователи не могли создать код атрибута. это было бы слишком долго для одной из различных таблиц, над которыми работали другие разработчики.

Что касается того, почему разработчик выбрал varcharдлину, которая не соответствовала 255- есть идея о дизайне базы данных, которая гласит, что вы создаете свои столбцы только в тех случаях, когда они необходимы для экономии дискового пространства, сокращения оперативной памяти, повышения эффективности операций объединения. и т. д. Некоторые разработчики по-прежнему придерживаются этого в сравнении с современной тенденцией «сделать его как можно больше и беспокоиться о последствиях для производительности позже». Ясно, что когда-то были разногласия по поводу максимальной длины varcharfor attribute_codeсреди основной команды Magento в какой-то момент, и теперь она живет в устаревшем коде.

Алан Сторм
источник
Каким бы прекрасным ни был пример, я думаю, что @xyphoid имеет менее капризный (и правильный) ответ.
Алан Шторм
0

Как говорит xyphoid , предыдущее ограничение было вызвано поддержкой Oracle BD, поскольку в Oracle столбцы могут иметь длину только 30 символов.

Сейчас же,

После модификации ядра окоршенко ( PR № 10225 )

const ATTRIBUTE_CODE_MAX_LENGTH = 60;

В следующей таблице описана максимальная длина для каждого типа идентификатора.

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

Значение определяется как 60, потому что в плоском режиме код атрибута будет преобразован в имя столбца. MySQL допускает только 64 символа в имени столбца.

Nolwennig
источник
-5

Чтобы устранить эту ошибку, пожалуйста, используйте этот код

CONST ATTRIBUTE_CODE_MAX_LENGTH = 30; до 60

Код должен быть

CONST ATTRIBUTE_CODE_MAX_LENGTH = 60;

Это решит вашу проблему.

Sweet72
источник
4
Основная модификация ?! Конечно, ты шутишь.
Philwinkle
1
Почему 60, а не 212?
Мариус
1
Почему не 5000000?
Баттл Буткус
Вы не сможете сохранить параметры атрибута при редактировании продуктов, если вы это сделаете ...
loeffel
@Marius: код атрибута EAV будет преобразован в имя столбца для плоских таблиц, а MySQL не поддерживает имя столбца с более чем 64 символами
Nolwennig