วีโอไอพี 2: ความแตกต่างระหว่าง row_id และ entity_id ในตาราง% _entity คืออะไร?


17

ใน Magento 1 ไม่มีคอลัมน์ที่เรียกrow_idในตารางเอนทิตีคุณเพิ่งได้รับentity_id:

CREATE TABLE `catalog_category_entity` (
  `entity_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Entity ID',
  `entity_type_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Entity Type ID',
  `attribute_set_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Attriute Set ID',
  `parent_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Parent Category ID',
  `created_at` timestamp NULL DEFAULT NULL COMMENT 'Creation Time',
  `updated_at` timestamp NULL DEFAULT NULL COMMENT 'Update Time',
  `path` varchar(255) NOT NULL COMMENT 'Tree Path',
  `position` int(11) NOT NULL COMMENT 'Position',
  `level` int(11) NOT NULL DEFAULT '0' COMMENT 'Tree Level',
  `children_count` int(11) NOT NULL COMMENT 'Child Count',
  PRIMARY KEY (`entity_id`),
  KEY `IDX_CATALOG_CATEGORY_ENTITY_LEVEL` (`level`),
  KEY `IDX_CATALOG_CATEGORY_ENTITY_PATH_ENTITY_ID` (`path`,`entity_id`)
) ENGINE=InnoDB AUTO_INCREMENT=943 DEFAULT CHARSET=utf8 COMMENT='Catalog Category Table'

แต่ Magento 2 นำเสนอแนวคิดrow_idที่กลายเป็นกุญแจสำคัญสำหรับเอนทิตี้ดูเหมือนว่าจะมีบางอย่างเกี่ยวกับการกำหนดเวอร์ชันจากความคิดเห็น:

CREATE TABLE `catalog_category_entity` (
  `row_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Version Id',
  `entity_id` int(10) unsigned NOT NULL COMMENT 'Entity Id',
  `created_in` bigint(20) unsigned NOT NULL COMMENT 'Update Id',
  `updated_in` bigint(20) unsigned NOT NULL COMMENT 'Next Update Id',
  `attribute_set_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Attriute Set ID',
  `parent_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Parent Category ID',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Creation Time',
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Update Time',
  `path` varchar(255) NOT NULL COMMENT 'Tree Path',
  `position` int(11) NOT NULL COMMENT 'Position',
  `level` int(11) NOT NULL DEFAULT '0' COMMENT 'Tree Level',
  `children_count` int(11) NOT NULL COMMENT 'Child Count',
  PRIMARY KEY (`row_id`),
  KEY `CATALOG_CATEGORY_ENTITY_LEVEL` (`level`),
  KEY `CATALOG_CATEGORY_ENTITY_CREATED_IN` (`created_in`),
  KEY `CATALOG_CATEGORY_ENTITY_UPDATED_IN` (`updated_in`),
  KEY `CAT_CTGR_ENTT_ENTT_ID_SEQUENCE_CAT_CTGR_SEQUENCE_VAL` (`entity_id`),
  CONSTRAINT `CAT_CTGR_ENTT_ENTT_ID_SEQUENCE_CAT_CTGR_SEQUENCE_VAL` FOREIGN KEY (`entity_id`) REFERENCES `sequence_catalog_category` (`sequence_value`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=956 DEFAULT CHARSET=utf8 COMMENT='Catalog Category Table'

สิ่งนี้ทำให้ฉันมีความไม่แน่นอนเมื่อต้องการเข้าร่วมเขตข้อมูล eav เนื่องจากขณะนี้ประเภทอ้างถึงrow_idแทนentity_id:

CREATE TABLE `catalog_category_entity_varchar` (
  `value_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Value ID',
  `attribute_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Attribute ID',
  `store_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Store ID',
  `row_id` int(10) unsigned NOT NULL COMMENT 'Version Id',
  `value` varchar(255) DEFAULT NULL COMMENT 'Value',
  PRIMARY KEY (`value_id`),
  UNIQUE KEY `CATALOG_CATEGORY_ENTITY_VARCHAR_ENTITY_ID_ATTRIBUTE_ID_STORE_ID` (`row_id`,`attribute_id`,`store_id`),
  KEY `CATALOG_CATEGORY_ENTITY_VARCHAR_ENTITY_ID` (`row_id`),
  KEY `CATALOG_CATEGORY_ENTITY_VARCHAR_ATTRIBUTE_ID` (`attribute_id`),
  KEY `CATALOG_CATEGORY_ENTITY_VARCHAR_STORE_ID` (`store_id`),
  CONSTRAINT `CATALOG_CATEGORY_ENTITY_VARCHAR_STORE_ID_STORE_STORE_ID` FOREIGN KEY (`store_id`) REFERENCES `store` (`store_id`) ON DELETE CASCADE,
  CONSTRAINT `CAT_CTGR_ENTT_VCHR_ATTR_ID_EAV_ATTR_ATTR_ID` FOREIGN KEY (`attribute_id`) REFERENCES `eav_attribute` (`attribute_id`) ON DELETE CASCADE,
  CONSTRAINT `CAT_CTGR_ENTT_VCHR_ROW_ID_CAT_CTGR_ENTT_ROW_ID` FOREIGN KEY (`row_id`) REFERENCES `catalog_category_entity` (`row_id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=266383 DEFAULT CHARSET=utf8 COMMENT='Catalog Category Varchar Attribute Backend Table'

ขณะนี้อยู่ในตารางเอนทิตีrow_idและentity_idเหมือนกัน:

select row_id, entity_id from catalog_category_entity limit 3;        
+--------+-----------+
| row_id | entity_id |
+--------+-----------+
|      1 |         1 |
|      2 |         2 |
|      3 |         3 |
+--------+-----------+
3 rows in set (0.00 sec)

ฉันไม่แน่ใจในสถานการณ์ที่row_idจะเปลี่ยนแปลงและสิ่งที่ส่งผลกระทบต่อระบบ Magento ฉันได้ค้นหาเอกสารเกี่ยวกับคุณลักษณะนี้ แต่ไม่พบสิ่งใด

ฉันต้องการทราบสิ่งต่อไปนี้:

  • เอนทิตีเดียวกันสามารถมีหลายrow_ids หรือไม่?
    • ถ้าเป็นเช่นนั้นนิติบุคคลที่ใช้งานจะถูกกำหนดอย่างไร
    • หากไม่ใช่สิ่งที่กลไกวีโอไอพีใช้เพื่ออัปเดตสิ่งเหล่านี้
  • คุณสมบัติหลักของการใช้งานนี้คืออะไรและมีเอกสารอะไรบ้าง?

3
ฉันคิดว่าคุณตอบคำถามของคุณเอง เอนทิตีหนึ่งสามารถมีหลายแถวด้วยค่าเดียวกันสำหรับ entity_id และค่าที่แตกต่างกันสำหรับ row_id ขึ้นอยู่กับ 'รุ่น' ของเอนทิตีนั้นจะมีการเลือก row_id ที่แตกต่างกัน ดังนั้นแต่ละรุ่นจะมี row_id ของตัวเอง
Vincent Hornikx

4
ฉันคิดว่านี่row_idเป็นเพียง EE เท่านั้น หากคุณติดตั้ง Magento CE สดคุณจะไม่เห็นสิ่งนั้น
Bunyamin Inan

คำตอบ:


5

จากสิ่งที่ฉันพบในตัวนี้row_idเป็นตัวระบุสำหรับแถวในขณะที่entity_idเป็นเอนทิตีที่แท้จริง

มีสถานการณ์ที่กำหนดปรับปรุงตั้งค่าให้ทำงานเป็นระยะเวลาคงที่และในกรณีนี้แถวใหม่ทั้งหมดถูกสร้างขึ้นเพื่อเชื่อมโยงกับมันแตกต่างเป็นeav_attribute(s) และสามารถรักษาเดียวกันentity_idในขณะที่ถูกออกใหม่row_idนั้นrow_idมีการเปลี่ยนแปลงไป เอนทิตีชั่วคราวใหม่แล้วกลับไปที่ต้นฉบับเมื่อกำหนดการเสร็จสมบูรณ์

อาจมีกรณีการใช้งานอื่น ๆ ที่พวกเขาใช้ประโยชน์จากสิ่งนี้นี่เป็นกรณีที่ฉันได้เห็นและส่องสว่างถึงวิธีการใช้งาน


1

entity_idใช้ในวีโอไอพี 2 EE รุ่นเท่านั้น มันถูกใช้เป็นดัชนีที่กำหนดไว้ในที่ชี้ไปยังcatalog_category_entitysequence_catalog_category

โดยทั่วไปแล้วตารางลำดับจะใช้สำหรับคุณลักษณะการแยกฐานข้อมูล


-1

ฉันจะบอกว่าวัตถุประสงค์คือเพื่อให้เข้ากันได้กับ Magento 1 เมื่อคุณต้องการย้ายข้อมูลจาก m1 ถึง m2 คุณจะต้องมีความสัมพันธ์นั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.