为什么属性代码具有最大长度?


9

尝试创建属性时,我发现属性代码的最大长度为30个字符。事实证明,这实际上并不是某种真正的限制-它是一个完全任意的值,由

Mage_Eav_Model_Entity_Attribute::ATTRIBUTE_CODE_MAX_LENGTH.

因此,既然如此,为什么会有限制呢?以及为什么默认值为30,而不是实例255(数据库列的实际限制)?

PS。如果有人可以为这个问题想到更好的标签,请更新它们。

Answers:



6

团队或个人开发人员不互相交谈的一个很好的例子。虽然主eav_attributeatrtibute_codevarchar(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');

我想还有其他人。

如果没有关于构建内容的实际规范或协议,负责属性部分的UI的开发人员可能会查看所有attribute_code列,选择最短的列,并强制执行一定的长度以确保用户无法创建属性代码对于其他开发人员正在处理的各种表之一来说,这太长了。

至于为什么开发人员会选择没有的varchar长度255-关于数据库设计的一门流派认为,您只在需要节省磁盘空间,减少RAM并提高联接操作效率的前提下创建列等等。一些开发人员仍然坚持这种与现代趋势相对的趋势,即“使其尽可能大,并在以后担心性能影响”。很明显,Magento核心团队在一个时间上对varcharfor 的最大长度存在分歧attribute_code,现在它仍然存在于遗留代码中。


作为一个完美的例子,我认为@xyphoid的回答比较荒谬(正确)。
艾伦·风暴

0

就像xyphoid所说,以前的限制是在支持Oracle BD时引起的,因为在Oracle中,列的长度只能为30个字符。

现在,

之后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

1
为什么是60,而不是212?
马吕斯

1
为什么不5000000?
Buttle Butkus 2014年

如果这样做,您将无法在编辑产品时保存属性选项...
loeffel

@Marius:EAV属性代码将被转换为平面表的列名,而MySQL不支持具有超过64个符号的列名
Nolwennig
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.