Tại sao mã thuộc tính có độ dài tối đa?


9

Khi cố gắng tạo thuộc tính, tôi đã phát hiện ra rằng độ dài tối đa của mã thuộc tính là 30 ký tự. Mặc dù hóa ra, đây thực sự KHÔNG phải là một loại hạn chế thực sự - nó là một giá trị hoàn toàn tùy ý, được xác định bởi

Mage_Eav_Model_Entity_Attribute::ATTRIBUTE_CODE_MAX_LENGTH.

Vì vậy, tại sao có một hạn chế ở tất cả? Và tại sao 30 mặc định, thay vì 255, là giới hạn thực tế của cột cơ sở dữ liệu?

Tái bút Nếu bất cứ ai có thể nghĩ về các thẻ tốt hơn cho câu hỏi này, xin vui lòng cập nhật chúng.

Câu trả lời:


8

Điều này gần như chắc chắn đã thay đổi trong 1.6 phần bổ sung hỗ trợ của Oracle - trong Oracle, các cột chỉ có thể dài 30 ký tự, vì vậy rất nhiều thuộc tính Magento đã được rút ngắn và tôi tưởng tượng hạn chế này đã được thêm vào cùng một lúc.

Xem http://m-chanaan.hr/wp-content/uploads/2013/04/RDBMS_Guide2.pdf để biết nhiều thảo luận về vấn đề này.


1
Điều này. Tôi chỉ chọc vào một số cơ sở mã 1,5 beta cũ và ATTRIBUTE_CODE_MAX_LENGTHhằng số không tồn tại.
Alan Storm

6

Một ví dụ hoàn hảo về các nhóm hoặc các nhà phát triển cá nhân không nói chuyện với nhau. Trong khi eav_attributebảng chính atrtibute_codelà a varchar(255), giá trị mã này thường được sử dụng trong các bảng khác.

Trong catalog_product_link_attributeđó có một product_link_attribute_codethuộc tính (là mã thuộc tính) và cột này là a varchar(32). Quay lại thời tiền sử khi các đối tượng bán hàng là các đối tượng EAV, họ có một cột thuộc tính_code có varchar(50)chiều dài.

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

Tôi tưởng tượng có những người khác là tốt.

Không có thông số kỹ thuật thực tế hoặc thỏa thuận về những gì đang được xây dựng, nhà phát triển phụ trách giao diện người dùng cho phần thuộc tính có thể đã xem xét tất cả các attribute_codecột, chọn cột ngắn nhất và thực thi độ dài để đảm bảo người dùng không thể tạo mã thuộc tính điều đó sẽ quá dài đối với một trong những bảng khác nhau mà các nhà phát triển khác đang làm việc.

Về lý do tại sao nhà phát triển sẽ chọn varcharđộ dài không 255- có một trường phái suy nghĩ về thiết kế cơ sở dữ liệu nói rằng bạn chỉ tạo các cột của mình miễn là họ cần để tiết kiệm dung lượng ổ đĩa, giảm RAM, hiệu quả hơn trong các hoạt động tham gia , v.v ... Một số nhà phát triển vẫn giữ điều này so với xu hướng hiện đại là "làm cho nó lớn nhất có thể và lo lắng về ý nghĩa hiệu suất sau này". Rõ ràng đã có sự bất đồng về độ dài tối đa của một varcharcho attribute_code's một trong những đội ngũ nòng cốt Magento tại một thời điểm, và bây giờ nó sống mãi trong mã di sản.


Một ví dụ hoàn hảo như điều này có thể đã xảy ra, tôi nghĩ rằng @xyphoid có câu trả lời ít cáu kỉnh hơn (và chính xác).
Alan Storm

0

Giống như xyphoid nói, giới hạn trước đó được tạo ra khi Oracle BD được hỗ trợ vì trong Oracle, các cột chỉ có thể dài 30 ký tự.

Hiện nay,

Sau khi sửa đổi lõi okorshenko ( PR # 10225 )

const ATTRIBUTE_CODE_MAX_LENGTH = 60;

Bảng sau đây mô tả độ dài tối đa cho từng loại định danh.

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

Giá trị được xác định là 60 vì trong mã thuộc tính chế độ phẳng sẽ được chuyển thành tên cột. MySQL chỉ cho phép 64 ký hiệu trong tên cột.


-5

Để khắc phục lỗi này, vui lòng sử dụng mã này

CONST ATTRIBUTE_CODE_MAX_LENGTH = 30; đến 60

Mã phải là

CONST ATTRIBUTE_CODE_MAX_LENGTH = 60;

Điều này sẽ giải quyết vấn đề của bạn.


4
Một sửa đổi cốt lõi?! Chắc chắn bạn vui vẻ.
philwinkle

1
Tại sao 60 mà không phải là 212?
Marius

1
Tại sao không 5000000?
Butussy Butkus

Bạn sẽ không thể lưu các tùy chọn thuộc tính khi chỉnh sửa sản phẩm nếu bạn làm như vậy ...
loeffel 17/2/2017

@Marius: Mã thuộc tính EAV sẽ được chuyển thành tên cột cho các bảng phẳng và MySQL không hỗ trợ tên cột có hơn 64 ký hiệu
Nolwennig
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.