Dlaczego kody atrybutów mają maksymalną długość?


9

Podczas próby tworzenia atrybutów odkryłem, że maksymalna długość kodu atrybutu wynosi 30 znaków. Okazuje się jednak, że tak naprawdę NIE jest to jakieś prawdziwe ograniczenie - jest to wartość całkowicie arbitralna, zdefiniowana przez

Mage_Eav_Model_Entity_Attribute::ATTRIBUTE_CODE_MAX_LENGTH.

Biorąc to pod uwagę, dlaczego w ogóle istnieje ograniczenie? I dlaczego domyślna wartość 30 to, na przykład 255, który jest rzeczywistym limitem kolumny bazy danych?

PS. Jeśli ktoś może wymyślić lepsze tagi dla tego pytania, zaktualizuj je.

Odpowiedzi:


8

Prawie na pewno zmieniło się to w części dodawania obsługi Oracle - w Oracle kolumny mogą mieć tylko 30 znaków, więc wiele atrybutów Magento zostało skróconych, i myślę, że to ograniczenie zostało dodane w tym samym czasie.

Więcej informacji na ten temat można znaleźć na stronie http://m-chanaan.hr/wp-content/uploads/2013/04/RDBMS_Guide2.pdf .


1
To. Właśnie przeszukałem stare bazy 1.5 beta i ATTRIBUTE_CODE_MAX_LENGTHstała nie istniała.
Alan Storm

6

Idealny przykład zespołów lub indywidualnych programistów, którzy nie rozmawiają ze sobą. Chociaż główna eav_attributetabela atrtibute_codema wartość a varchar(255), ta wartość kodu jest często używana w innych tabelach.

Jest catalog_product_link_attributetam product_link_attribute_codeatrybut (który jest kodem atrybutu), a ta kolumna to varchar(32). W czasach prehistorycznych, gdy obiektami sprzedaży były obiekty EAV, mieli kolumnę z kodem atrybutu varchar(50)o długości.

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

Wyobrażam sobie, że są też inni.

Bez faktycznej specyfikacji lub porozumienia co do tego, co jest budowane, programista odpowiedzialny za interfejs użytkownika dla sekcji atrybutów prawdopodobnie przejrzał wszystkie attribute_codekolumny, wybrał najkrótszą i wprowadził długość, aby użytkownicy nie mogli utworzyć kodu atrybutu byłoby to zbyt długo na jedną z różnych tabel, nad którymi pracowali inni programiści.

Co do tego, dlaczego programista wybrał varchardługość, która nie była 255- istnieje szkoła myślenia o projektowaniu baz danych, która mówi, że tworzysz kolumny tylko tak długo, jak trzeba, aby zaoszczędzić miejsce na dysku, zmniejszyć pamięć RAM, być bardziej wydajnym w operacjach łączenia itp. Niektórzy programiści nadal trzymają się tego w przeciwieństwie do współczesnego trendu „zwiększania rozmiaru do maksimum i martwienia się o wpływ na wydajność później”. To jasne, nie było różnicy zdań w sprawie maksymalnej długości od a varchardo attribute_code„s między rdzeń zespołu Magento w jednym punkcie, a teraz żyje w starszych kod.


Choć może to być doskonały przykład, myślę, że @xyphoid ma mniej zepsutą (i poprawną) odpowiedź.
Alan Storm

0

Jak mówi xyphoid , poprzednie ograniczenie było spowodowane, gdy Oracle BD był obsługiwany, ponieważ w Oracle kolumny mogą mieć tylko 30 znaków.

Teraz,

Po modyfikacji rdzenia okorshenko ( PR # 10225 )

const ATTRIBUTE_CODE_MAX_LENGTH = 60;

W poniższej tabeli opisano maksymalną długość każdego typu identyfikatora.

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

Wartość jest zdefiniowana jako 60, ponieważ w trybie płaskim kod atrybutu zostanie przekształcony w nazwę kolumny. MySQL dopuszcza tylko 64 symbole w nazwie kolumny.


-5

Aby rozwiązać ten błąd, użyj tego kodu

CONST ATTRIBUTE_CODE_MAX_LENGTH = 30; do 60

Kod powinien być

CONST ATTRIBUTE_CODE_MAX_LENGTH = 60;

To rozwiąże twój problem.


4
Podstawowa modyfikacja ?! Na pewno żartujesz.
philwinkle

1
Dlaczego 60, a nie 212?
Marius

1
Dlaczego nie 5000000?
Buttle Butkus

Jeśli to zrobisz, nie będziesz mógł zapisać opcji atrybutu podczas edycji produktów ...
loeffel

@Marius: Kod atrybutu EAV zostanie przekształcony w nazwę kolumny dla płaskich tabel, a MySQL nie obsługuje nazwy kolumny zawierającej więcej niż 64 symbole
Nolwennig
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.