Чому коди атрибутів мають максимальну довжину?


9

Намагаючись створити атрибути, я виявив, що максимальна довжина коду атрибута - 30 символів. Виявляється, що це НЕ насправді якесь реальне обмеження - це абсолютно довільне значення, визначене

Mage_Eav_Model_Entity_Attribute::ATTRIBUTE_CODE_MAX_LENGTH.

Отже, враховуючи це, чому взагалі існує обмеження? І чому за замовчуванням 30, а не 255, що є фактичним обмеженням стовпця бази даних?

PS. Якщо хтось може придумати кращі теги для цього питання, будь ласка, оновіть їх.

Відповіді:


8

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

Дивіться http://m-chanaan.hr/wp-content/uploads/2013/04/RDBMS_Guide2.pdf для багато дискусій з цього приводу.


1
Це. Я щойно просунувся навколо старих 1,5 бета-кодів, і ATTRIBUTE_CODE_MAX_LENGTHконстанта не існувала.
Алан Шторм

6

Ідеальний приклад команд чи окремих розробників, які не спілкуються один з одним. Якщо основна eav_attributeтаблиця atrtibute_codeє a 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- існує школа думок щодо дизайну баз даних, яка говорить про те, що ви створюєте свої стовпчики лише стільки, скільки потрібно для економії місця на диску, зменшення оперативної пам’яті, щоб бути ефективнішими в операціях приєднання. і т. д. Деякі розробники все ще дотримуються цього, порівняно із сучасною тенденцією "зробіть це якомога більше і пізніше переживайте про наслідки для продуктивності". Зрозуміло, що в основний колектив Magento в один момент існувала розбіжність щодо максимальної тривалості " varcharдля attribute_code", і тепер це продовжується в застарілому коді.


Як ідеальний приклад, як це могло бути, я вважаю, що @xyphoid має менш прискіпливу (і правильну) відповідь.
Алан Шторм

0

Як каже xyphoid , попереднє обмеження було викликане, коли підтримка Oracle BD підтримувалася, оскільки в Oracle стовпці можуть бути довжиною лише 30 символів.

Тепер,

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

const ATTRIBUTE_CODE_MAX_LENGTH = 60;

Наступна таблиця описує максимальну довжину для кожного типу ідентифікатора.

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

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


-5

Щоб вирішити цю помилку, будь ласка, використовуйте цей код

CONST ATTRIBUTE_CODE_MAX_LENGTH = 30; до 60

Код повинен бути

CONST ATTRIBUTE_CODE_MAX_LENGTH = 60;

Це вирішить вашу проблему.


4
Основна модифікація ?! Звичайно, ви жартуєте.
philwinkle

1
Чому 60, а не 212?
Маріус

1
Чому б не 5000000?
Buttle Butkus

Ви не зможете зберегти параметри attribut під час редагування продуктів, якщо це зробите ...
loeffel

@Marius: Код атрибута EAV буде перетворений у назву стовпців для плоских таблиць, а MySQL не підтримує ім'я стовпця з більш ніж 64 символами
Nolwennig
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.