-- ===================================================================================== -- 1.0.510 · S0 MASTER DATA PLATFORM · PHASE 2 · dim_item(大数据量门) -- -- ItemMaster → mdp_stg_s0_item → dim_item -- -- 【为什么是 dim_item 而不是复用 mdp_std_item —— 已封板,勿再讨论】 -- mdp_std_item 是 Supply/S3 的**多源**物料目录:实测混入 ic_item(另一业务域主数据), -- 租户 797 有 75 个 item_code 只来自 ic_item、在 ItemMaster 里 0 命中;其写入 SQL -- (S3MdpSyncTransformService)取值用 COALESCE($.ItemNum,$.number) 且不过滤 source_table/source_system。 -- 物理上它也无法当父维度:只有 6 个业务列,无 Domain、无 ItemMaster.RecID, -- 两个最大租户的 factory_id/company_id 100% NULL。 -- dim_item 不是第二份权威,是 ItemMaster 的第一次物化;二者消费方实测零重叠。 -- -- 【身份 = tenant_id + ItemNum】 -- 实测租户内重复 0、空白 0、非法租户 0;ItemNum 跨租户碰撞 663 码 / 1534 行 ⇒ 租户必须入身份。 -- 旧 UK uk_ItemMaster_factory_item 含 factory_ref_id,**不予继承**:它连 f(tenant) 都不是 -- (租户 838257186181189 有 3 个取值含 0),且 8010 被三个租户共用。 -- -- 【大数据量】单租户最大 16150 行 > 默认 batch_size 5000,AssertNoSourceDuplicateAsync 会硬失败。 -- 本 entity 的 batch_size 设 50000(3.1x 头寸)。该值是 **entity 级**(取自 mdp_entity.batch_size), -- **不影响其它任何维度**,绝不是全局放大。 -- -- 【字段取舍】75 列 → 只物化「全库填充率 ≥5% 且全库 distinct ≥2」的列; -- 并无条件排除:审计列 · 影子列 · bit(1) 列 · 可空 tinyint(1)。据此排除的典型: -- expire_alarm_day 0 填充的影子列(真列是 ExpireAlarmDays 22682) -- SuppWarranty bit(1) 且含 2 行 NULL —— Int 会让对账每轮必挂、BoolTrue 会滤掉那 2 行 -- DEAControlled 可空 tinyint(1),2 行 NULL 会被 BoolTrue 守卫滤掉 -- Length/Size/Height/Width/cust_supplied/enable_bom_version 全库 distinct=1,零信息 -- Status 7/22684,且真实状态语义在 IsActive -- DefaultShelf/Remark/OwnerApplication/BOMDesignTime/RoutingDesignTime/ -- drawing_design/design_owner/bom_design/routing_des/bom_version 全库 0 填充 -- SizeUM(5)/LocationType(1)/PMBOM(797 空) 近空 -- CreateUser/CreateTime/UpdateUser 审计列 -- -- 【legacy_source_id】← RecID,**技术属性**,供 C3 的 ProductStructureMaster.ComponentMaterialId -- 这类 legacy 代理键做对账解析。它不是身份;且**绝不能用 dim 的代理 id 建外键** —— -- 每轮 FULL REPLACE 后 dim_item.id 都会变。 -- ===================================================================================== CREATE TABLE IF NOT EXISTS `mdp_stg_s0_item` ( `id` bigint NOT NULL AUTO_INCREMENT, `tenant_id` bigint NOT NULL DEFAULT 0, `factory_id` bigint DEFAULT NULL, `source_system` varchar(50) NOT NULL DEFAULT 'AIDOPDEV_MYSQL', `source_table` varchar(100) NOT NULL, `source_row_id` varchar(100) NOT NULL, `source_biz_key` varchar(300) DEFAULT NULL, `sync_batch_id` varchar(100) NOT NULL, `sync_time` datetime NOT NULL, `process_status` varchar(20) NOT NULL DEFAULT 'PENDING', `raw_data` json NOT NULL, `process_message` varchar(500) DEFAULT NULL, `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_stg_s0_item` (`tenant_id`,`source_system`,`source_table`,`source_row_id`), KEY `idx_stg_s0_item_biz` (`source_biz_key`), KEY `idx_stg_s0_item_batch` (`tenant_id`,`sync_batch_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='S0 贴源:物料(源 ItemMaster)'; CREATE TABLE IF NOT EXISTS `dim_item` ( `id` bigint NOT NULL AUTO_INCREMENT, `tenant_id` bigint NOT NULL, `item_code` varchar(100) NOT NULL COMMENT '物料编码(**唯一业务键**)← $.ItemNum', `item_name` varchar(200) NOT NULL COMMENT '← $.Descr', `item_name_2` varchar(200) DEFAULT NULL COMMENT '← $.Descr1', `unit` varchar(50) DEFAULT NULL COMMENT '← $.UM', `pur_mfg` varchar(100) DEFAULT NULL COMMENT '采购/制造属性 ← $.PurMfg', `item_type` varchar(100) DEFAULT NULL COMMENT '物料类别 ← $.ItemType', `commodity_code` varchar(100) DEFAULT NULL COMMENT '← $.CommodityCode', `rev` varchar(50) DEFAULT NULL COMMENT '← $.Rev', `drawing` varchar(100) DEFAULT NULL COMMENT '← $.Drawing', `pkg_code` varchar(50) DEFAULT NULL COMMENT '← $.PkgCode', `series` varchar(100) DEFAULT NULL COMMENT '← $.Series', `emt_type` varchar(50) DEFAULT NULL COMMENT '← $.EMTType', `po_receipt_status` varchar(8) DEFAULT NULL COMMENT '← $.PORcptStatus', `warranty_code` varchar(255) DEFAULT NULL COMMENT '← $.WarrantyCode', `default_location` varchar(100) DEFAULT NULL COMMENT '← $.Location;软引用 dim_location,无 FK', `buyer` varchar(255) DEFAULT NULL COMMENT '← $.Buyer', `planner` varchar(100) DEFAULT NULL COMMENT '← $.Planner', `net_weight` decimal(18,5) DEFAULT NULL COMMENT '← $.NetWeight;精度必须与源逐位一致', `net_weight_um` varchar(50) DEFAULT NULL COMMENT '← $.NetWeightUM', `pur_lead_time` int DEFAULT NULL COMMENT '← $.PurLT', `ins_lead_time` int DEFAULT NULL COMMENT '← $.InsLT', `mfg_lead_time` int DEFAULT NULL COMMENT '← $.MfgLT', `mfg_mttr` int DEFAULT NULL COMMENT '← $.MFGMTTR', `days_between_pm` int DEFAULT NULL COMMENT '← $.DaysBetweenPM', `expire_alarm_days` int DEFAULT NULL COMMENT '← $.ExpireAlarmDays(真列;同表 expire_alarm_day 是 0 填充影子列)', `min_order_qty` decimal(18,5) DEFAULT NULL COMMENT '← $.MinOrd', `max_order_qty` decimal(18,5) DEFAULT NULL COMMENT '← $.MaxOrd', `min_order_qty_sales` decimal(18,5) DEFAULT NULL COMMENT '← $.MinOrdSales', `order_multiple` decimal(18,5) DEFAULT NULL COMMENT '← $.OrdMult', `safety_stock` decimal(18,5) DEFAULT NULL COMMENT '← $.SafetyStk', `stock_turnover` decimal(18,5) DEFAULT NULL COMMENT '← $.StockTurnOver', `is_active` tinyint(1) NOT NULL COMMENT '← $.IsActive(真实有效状态,非 Status)', `is_confirmed` tinyint(1) NOT NULL COMMENT '← $.IsConfirm', `key_item` tinyint(1) NOT NULL COMMENT '← $.KeyItem', `inspect_required` tinyint(1) NOT NULL COMMENT '← $.Inspect', `issue_policy` tinyint(1) NOT NULL COMMENT '← $.IssuePolicy', `install` tinyint(1) NOT NULL COMMENT '← $.Install', `lot_serial_control` tinyint(1) NOT NULL COMMENT '← $.LotSerialControl', `allocate_single_lot` tinyint(1) NOT NULL COMMENT '← $.AllocateSingleLot', `auto_lot_nums` tinyint(1) NOT NULL COMMENT '← $.AutoLotNums', `trace_detail` tinyint(1) NOT NULL COMMENT '← $.TraceDetail', `is_main_master` tinyint(1) NOT NULL COMMENT '← $.IsMainMas', `mrp_required` tinyint(1) NOT NULL COMMENT '← $.MRPRequired', `domain_code` varchar(50) DEFAULT NULL COMMENT 'LEGACY_SCOPE ← $.Domain;**不是身份**', `company_id` bigint NOT NULL COMMENT 'LEGACY_SCOPE ← $.company_ref_id;**不是身份**', `factory_id` bigint NOT NULL COMMENT 'LEGACY_SCOPE ← $.factory_ref_id;**不是身份**(连 f(tenant) 都不是)', `legacy_source_id` bigint NOT NULL COMMENT '技术属性 ← $.RecID;供 C3 legacy 代理键对账。**不是身份,禁止用 dim.id 建外键**', `source_system` varchar(50) NOT NULL, `source_biz_key` varchar(300) NOT NULL, `source_updated_at` datetime DEFAULT NULL COMMENT '← $.UpdateTime(源 22682/22684)', `sync_batch_id` varchar(64) NOT NULL, `sync_time` datetime NOT NULL, `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), -- 索引字节 = 8 + 100*4 = 408 < 3072 UNIQUE KEY `uk_dim_item` (`tenant_id`,`item_code`), KEY `idx_dim_item_batch` (`sync_batch_id`), -- 供 C3 的 legacy 代理键(如 ProductStructureMaster.ComponentMaterialId)反查 KEY `idx_dim_item_legacy` (`tenant_id`,`legacy_source_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='S0 主数据维度:物料。源 ItemMaster,FULL REPLACE。**S0 的 Item 权威**,与 Supply/S3 的多源 mdp_std_item 语义不同。'; SET @src_id = (SELECT `id` FROM `mdp_source` WHERE `source_code` = 'AIDOPDEV_MYSQL' LIMIT 1); INSERT INTO `mdp_entity` (`tenant_id`,`source_id`,`entity_code`,`entity_name`,`entity_type`, `source_table_name`,`target_table_name`,`sync_mode`,`incr_column`,`batch_size`, `biz_key_expr`,`status`,`create_time`,`update_time`) SELECT 0, @src_id, 'S0_ITEM', 'S0 物料主数据入站', 'TABLE', 'ItemMaster', 'mdp_stg_s0_item', 'FULL', NULL, 50000, 'ItemNum', 1, NOW(), NOW() WHERE @src_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM `mdp_entity` WHERE `entity_code` = 'S0_ITEM'); -- ── 回滚(注释,非可执行)── -- DROP TABLE IF EXISTS `dim_item`; -- DROP TABLE IF EXISTS `mdp_stg_s0_item`; -- DELETE FROM `mdp_entity` WHERE `tenant_id` = 0 AND `entity_code` = 'S0_ITEM';