数据治理基础——打通数据孤岛的关键
引言:数据孤岛的代价 数字化转型后,企业有了多个系统,但如果数据不通: 同一个SKU,各系统编码不一样 同一个客户,各系统信息不一致 想做数据分析,要从多个系统导出再合并 数据治理的目标:建立统一的数据标准,让数据在各系统间自由流转。 一、主数据管理(MDM) 1.1 什么是主数据 主数据(Master Data):企业核心业务实体的基础数据,具有: 跨系统共享 相对稳定 唯一标识 跨境电商的核心主数据: 主数据 说明 使用系统 商品主数据 SKU信息 OMS、WMS、ERP 供应商主数据 供应商信息 ERP、WMS 客户主数据 买家信息 OMS、CRM 仓库主数据 仓库、库位信息 WMS、OMS 承运商主数据 物流商信息 TMS、OMS 1.2 商品主数据设计 -- 商品主数据表 CREATE TABLE t_sku_master ( id BIGINT PRIMARY KEY AUTO_INCREMENT, sku_id VARCHAR(32) NOT NULL COMMENT 'SKU编码(唯一)', sku_name VARCHAR(256) NOT NULL COMMENT 'SKU名称', sku_name_en VARCHAR(256) COMMENT '英文名称', -- 分类信息 category_id VARCHAR(32) COMMENT '分类ID', category_name VARCHAR(128) COMMENT '分类名称', brand VARCHAR(64) COMMENT '品牌', -- 规格信息 spec VARCHAR(256) COMMENT '规格描述', color VARCHAR(32) COMMENT '颜色', size VARCHAR(32) COMMENT '尺寸', -- 物理属性 weight DECIMAL(10,2) COMMENT '重量(g)', length DECIMAL(10,2) COMMENT '长(cm)', width DECIMAL(10,2) COMMENT '宽(cm)', height DECIMAL(10,2) COMMENT '高(cm)', -- 条码 barcode VARCHAR(64) COMMENT '商品条码', upc VARCHAR(32) COMMENT 'UPC码', ean VARCHAR(32) COMMENT 'EAN码', -- 采购信息 default_supplier_id VARCHAR(32) COMMENT '默认供应商', purchase_price DECIMAL(12,4) COMMENT '采购价', moq INT COMMENT '最小起订量', -- 销售信息 retail_price DECIMAL(12,2) COMMENT '零售价', currency VARCHAR(8) DEFAULT 'USD' COMMENT '币种', -- 库存参数 safety_stock INT DEFAULT 0 COMMENT '安全库存', lead_time_days INT DEFAULT 7 COMMENT '采购周期(天)', -- 状态 status VARCHAR(16) DEFAULT 'ACTIVE' COMMENT '状态', created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uk_sku_id (sku_id), KEY idx_barcode (barcode), KEY idx_category (category_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品主数据表'; -- 渠道SKU映射表 CREATE TABLE t_sku_channel_mapping ( id BIGINT PRIMARY KEY AUTO_INCREMENT, sku_id VARCHAR(32) NOT NULL COMMENT '内部SKU编码', channel VARCHAR(32) NOT NULL COMMENT '渠道', channel_sku_id VARCHAR(64) NOT NULL COMMENT '渠道SKU编码', channel_sku_name VARCHAR(256) COMMENT '渠道SKU名称', asin VARCHAR(32) COMMENT 'Amazon ASIN', created_at DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_channel_sku (channel, channel_sku_id), KEY idx_sku_id (sku_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='渠道SKU映射表'; 1.3 供应商主数据设计 -- 供应商主数据表 CREATE TABLE t_supplier_master ( id BIGINT PRIMARY KEY AUTO_INCREMENT, supplier_id VARCHAR(32) NOT NULL COMMENT '供应商编码', supplier_name VARCHAR(128) NOT NULL COMMENT '供应商名称', supplier_type VARCHAR(32) COMMENT '类型:MANUFACTURER/TRADER', -- 联系信息 contact_name VARCHAR(64) COMMENT '联系人', contact_phone VARCHAR(32) COMMENT '联系电话', contact_email VARCHAR(128) COMMENT '邮箱', address VARCHAR(256) COMMENT '地址', -- 结算信息 payment_terms VARCHAR(64) COMMENT '账期:COD/NET30/NET60', bank_name VARCHAR(128) COMMENT '开户行', bank_account VARCHAR(64) COMMENT '银行账号', tax_id VARCHAR(32) COMMENT '税号', -- 评级 rating VARCHAR(8) DEFAULT 'B' COMMENT '评级:A/B/C/D', cooperation_years INT DEFAULT 0 COMMENT '合作年限', -- 状态 status VARCHAR(16) DEFAULT 'ACTIVE', created_at DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_supplier_id (supplier_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='供应商主数据表'; 1.4 主数据管理服务 @Service public class MasterDataService { /** * 创建SKU主数据 */ @Transactional public SkuMaster createSku(SkuMasterRequest request) { // 1. 生成SKU编码 String skuId = generateSkuId(request.getCategoryId()); // 2. 校验唯一性 if (skuMasterRepository.existsBySkuId(skuId)) { throw new DuplicateSkuException(skuId); } // 3. 创建主数据 SkuMaster sku = new SkuMaster(); BeanUtils.copyProperties(request, sku); sku.setSkuId(skuId); sku.setStatus("ACTIVE"); skuMasterRepository.save(sku); // 4. 同步到各系统 syncToDownstreamSystems(sku); return sku; } /** * 同步到下游系统 */ private void syncToDownstreamSystems(SkuMaster sku) { // 发布主数据变更事件 MasterDataChangeEvent event = new MasterDataChangeEvent(); event.setDataType("SKU"); event.setDataId(sku.getSkuId()); event.setChangeType("CREATE"); event.setData(sku); eventPublisher.publish("master-data-change", event); } /** * 生成SKU编码 * 规则:分类前缀 + 6位序号 * 示例:EL000001(电子类) */ private String generateSkuId(String categoryId) { String prefix = getCategoryPrefix(categoryId); int seq = sequenceService.nextVal("SKU_SEQ"); return prefix + String.format("%06d", seq); } } 二、数据标准化 2.1 编码规范 SKU编码规范: ...