属性コードに最大長があるのはなぜですか?


9

属性を作成しようとしたところ、属性コードの最大長が30文字であることがわかりました。ただし、これは実際には何らかの実際の制限ではないことがわかります。これは完全に任意の値であり、

Mage_Eav_Model_Entity_Attribute::ATTRIBUTE_CODE_MAX_LENGTH.

では、なぜ制限があるのでしょうか。そして、なぜデータベース列の実際の制限であるインスタンス255ではなくデフォルト30なのでしょうか。

PS。誰かがこの質問のためのより良いタグを考えることができるならば、それらを更新してください。

回答:


8

これは、Oracleサポートの追加の1.6部分でほぼ確実に変更されました。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はですがvarchar(255)、このコード値は他のテーブルでよく使用されます。

catalog_product_link_attributeありますproduct_link_attribute_code(属性コードである)属性は、このコラムですvarchar(32)。先史時代、salesオブジェクトがEAVオブジェクトであった時代にはvarchar(50)、長さとして持つattribute_code列がありました。

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

他にもあると思います。

何が作成されるかについての実際の仕様や合意がない場合、属性セクションのUIを担当する開発者は、おそらくすべてのattribute_code列を見て、最も短い列を選択し、ユーザーが属性コードを作成できないように長さを強制しました。これは、他の開発者が取り組んでいるさまざまなテーブルの1つには長すぎます。

開発者がそうvarcharではない長さを選択する理由については、255データベースの設計について、ディスク領域を節約し、RAMを削減し、結合操作をより効率的にするために必要な列だけを作成するという考え方があります。など。一部の開発者は、「これを可能な限り大きくして、後でパフォーマンスへの影響を心配する」という最近の傾向と対比して、今でもこれを保持しています。Magentoコアチーム間でのvarcharfor attribute_codeの最大長に不一致があったことは明らかであり、現在はレガシーコードで使用されています。


これがそうであったかもしれないので、完璧な例として、@ xyphoidの方が気難しい(そして正しい)答えを持っていると思います。
アランストーム

0

同様剣状突起、と言う以前のオラクルでは、列はわずか30文字の長さにすることができため、Oracle BDがサポートされていた時に制限が発生しました。

さて、

okorshenkoコア修正(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 2013

1
なぜ212ではなく60なのですか?
マリウス

1
なぜ5000000ではないのですか?
Buttle Butkus 14

製品の編集時に属性オプションを保存すると、保存できなくなります...
loeffel

@Marius:EAV属性コードはフラットテーブルの列名に変換され、MySQLは64を超える記号を含む列名をサポートしません
Nolwennig
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.