商超商品域配置化设计与智能分析解决方案

1. 核心数据模型设计

1.1 表关系逻辑说明

  1. metadata_dict(元数据字典表):定义所有可配置的字段,包括系统预置的公共字段和商户自定义的私有字段。它决定了商品可以有哪些字段(包括基础字段和扩展字段)。注意,这里我们通过customer_id来区分不同商户的私有字段,category_id可以用于将字段与特定商品分类关联。

  2. product_base(商品基础表):存储商品的核心基础信息,这些信息是所有商品共有的,比如商品编码、基础名称、规格等。这里我们假设基础字段是固定的,不会动态增加,但可以通过元数据字典来配置它们的显示和校验规则。

  3. product_extension(商品扩展表):存储商户自定义的扩展字段的值。每个商品的自定义字段值以键值对的形式存储,通过product_id关联到商品基础表,通过field_code关联到元数据字典表。

  4. product_category(商品分类表):存储商品的分类信息。分类是商品的一个基本属性,通常具有树状结构,并且分类本身可能也需要扩展字段。我们将分类独立成表,是因为分类是商品的一个基本维度,并且分类本身也可能需要配置化。

product_category (分类主表)
    ↑
    | (1:N) 分类作为商品的基础维度
    |
product_base (商品主表) ←→ (1:N) product_extension (扩展数据)
    |                           |
    | (N:1) 扩展数据引用字段定义  |
    ↓                           ↓
metadata_dict (字段定义中心) ← 配置化分析规则

设计要点:

  • 分类表独立:分类作为稳定业务维度,支持树形结构和权限控制

  • 基础扩展分离:基础表存储稳定核心数据,扩展表支持动态字段

  • 元数据驱动:所有字段定义统一管理,支持分析配置

  • 多租户隔离:通过customer_id实现数据逻辑隔离

1.2 四表关系架构

-- 1. 商品分类表 - 稳定的基础维度(不适合配置化)
CREATE TABLE product_category (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    category_name VARCHAR(100) NOT NULL COMMENT '分类名称',
    parent_id BIGINT DEFAULT 0 COMMENT '父级ID,支持树形结构',
    customer_id VARCHAR(50) NOT NULL COMMENT '商户ID',
    sort_order INT DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    INDEX idx_customer_parent (customer_id, parent_id),
    INDEX idx_customer_sort (customer_id, sort_order)
) COMMENT '商品分类基础表 - 稳定的业务维度';

-- 2. 元数据字典表 - 配置化核心引擎
CREATE TABLE metadata_dict (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    field_code VARCHAR(100) NOT NULL COMMENT '字段编码,唯一标识',
    field_name VARCHAR(100) NOT NULL COMMENT '显示名称',
    field_type ENUM('string','number','date','select','boolean') NOT NULL,
    field_length INT DEFAULT 255,
    is_required BOOLEAN DEFAULT FALSE,
    validation_rule JSON COMMENT '校验规则',
    options JSON COMMENT '下拉选项',
    customer_id VARCHAR(50) DEFAULT 'public' COMMENT 'public为公共字段',
    category_id BIGINT COMMENT '关联分类,NULL表示通用',
    
    -- 分析配置扩展
    is_analyzable BOOLEAN DEFAULT FALSE COMMENT '是否参与分析',
    analysis_field_name VARCHAR(100) COMMENT '分析字段名(英文)',
    analysis_data_type ENUM('dimension','metric') COMMENT '维度/指标',
    analysis_group VARCHAR(50) COMMENT '分析分组',
    display_order INT DEFAULT 0 COMMENT '分析显示顺序',
    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    FOREIGN KEY (category_id) REFERENCES product_category(id),
    UNIQUE KEY uk_field_customer (field_code, customer_id),
    INDEX idx_customer_category (customer_id, category_id)
) COMMENT '元数据字典表 - 配置化核心,支持分析扩展';

-- 3. 商品基础表 - 核心业务数据
CREATE TABLE product_base (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    product_code VARCHAR(50) NOT NULL COMMENT '商品编码,业务唯一',
    base_name VARCHAR(200) NOT NULL COMMENT '商品基础名称',
    base_spec VARCHAR(100) COMMENT '商品规格',
    category_id BIGINT NOT NULL COMMENT '分类ID',
    customer_id VARCHAR(50) NOT NULL COMMENT '商户ID',
    status ENUM('active','inactive') DEFAULT 'active',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (category_id) REFERENCES product_category(id),
    UNIQUE KEY uk_product_customer (product_code, customer_id),
    INDEX idx_customer_category (customer_id, category_id),
    INDEX idx_status (status)
) COMMENT '商品基础信息表 - 存储稳定核心数据';

-- 4. 商品扩展表 - 动态个性化数据
CREATE TABLE product_extension (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    product_id BIGINT NOT NULL COMMENT '商品ID',
    field_code VARCHAR(100) NOT NULL COMMENT '字段编码',
    field_value TEXT COMMENT '字段值',
    customer_id VARCHAR(50) NOT NULL COMMENT '商户ID',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    FOREIGN KEY (product_id) REFERENCES product_base(id) ON DELETE CASCADE,
    UNIQUE KEY uk_product_field (product_id, field_code, customer_id),
    INDEX idx_product_id (product_id),
    INDEX idx_field_code (field_code)
) COMMENT '商品扩展数据表 - 存储动态字段数据';

1.3 实际数据示例

初始化数据

-- 1. 创建商品分类(稳定的基础数据)
INSERT INTO product_category (id, category_name, customer_id, sort_order) VALUES
(1, '生鲜食品', 'customer_a', 1),
(2, '日用品', 'customer_a', 2),
(3, '酒水饮料', 'customer_a', 3);

-- 2. 创建字段定义(配置化核心)- 只包含扩展字段,基础字段不在metadata_dict中定义
INSERT INTO metadata_dict (field_code, field_name, field_type, customer_id, category_id, is_analyzable, analysis_field_name, analysis_data_type) VALUES
-- 生鲜食品分类的扩展字段
('origin', '产地', 'string', 'customer_a', 1, TRUE, 'origin', 'dimension'),
('fresh_temp', '保鲜温度', 'string', 'customer_a', 1, TRUE, 'fresh_temperature', 'dimension'),
('supplier', '供应商', 'string', 'customer_a', 1, TRUE, 'supplier', 'dimension'),

-- 日用品分类的扩展字段
('shelf_life', '保质期', 'string', 'customer_a', 2, TRUE, 'shelf_life', 'dimension'),
('material', '材质', 'string', 'customer_a', 2, TRUE, 'material', 'dimension'),
('usage', '使用方法', 'string', 'customer_a', 2, FALSE, NULL, NULL),

-- 酒水饮料分类的扩展字段
('alcohol_level', '酒精度', 'number', 'customer_a', 3, TRUE, 'alcohol_level', 'metric'),
('volume', '净含量', 'string', 'customer_a', 3, TRUE, 'volume', 'dimension'),
('brand', '品牌', 'string', 'customer_a', 3, TRUE, 'brand', 'dimension');

-- 3. 创建商品基础数据(注意:基础字段如商品名称、规格等直接存储在product_base中,不在metadata_dict中定义)
INSERT INTO product_base (id, product_code, base_name, base_spec, category_id, customer_id) VALUES
-- 生鲜食品分类的商品
(1, 'FRESH-001', '进口香蕉', '1kg/把', 1, 'customer_a'),
(2, 'FRESH-002', '澳洲牛排', '200g/份', 1, 'customer_a'),
(3, 'FRESH-003', '智利车厘子', '500g/盒', 1, 'customer_a'),

-- 日用品分类的商品
(4, 'DAILY-001', '洗衣液', '2kg/瓶', 2, 'customer_a'),
(5, 'DAILY-002', '洗发水', '500ml/瓶', 2, 'customer_a'),
(6, 'DAILY-003', '牙膏', '120g/支', 2, 'customer_a'),

-- 酒水饮料分类的商品
(7, 'DRINK-001', '红酒', '750ml/瓶', 3, 'customer_a'),
(8, 'DRINK-002', '啤酒', '500ml/罐', 3, 'customer_a'),
(9, 'DRINK-003', '白酒', '500ml/瓶', 3, 'customer_a');

-- 4. 添加扩展数据 - 完全匹配metadata_dict中定义的字段
INSERT INTO product_extension (product_id, field_code, field_value, customer_id) VALUES
-- 生鲜食品的扩展数据
(1, 'origin', '菲律宾', 'customer_a'),
(1, 'fresh_temp', '13℃', 'customer_a'),
(1, 'supplier', '热带水果贸易公司', 'customer_a'),

(2, 'origin', '澳大利亚', 'customer_a'),
(2, 'fresh_temp', '-18℃', 'customer_a'),
(2, 'supplier', '澳洲肉类出口', 'customer_a'),

(3, 'origin', '智利', 'customer_a'),
(3, 'fresh_temp', '2℃', 'customer_a'),
(3, 'supplier', '南美水果进口', 'customer_a'),

-- 日用品的扩展数据
(4, 'shelf_life', '3年', 'customer_a'),
(4, 'material', '表面活性剂', 'customer_a'),
(4, 'usage', '机洗手洗均可', 'customer_a'),

(5, 'shelf_life', '2年', 'customer_a'),
(5, 'material', '氨基酸配方', 'customer_a'),
(5, 'usage', '湿发后按摩头皮', 'customer_a'),

(6, 'shelf_life', '2年', 'customer_a'),
(6, 'material', '氟化物', 'customer_a'),
(6, 'usage', '每日刷牙2次', 'customer_a'),

-- 酒水饮料的扩展数据
(7, 'alcohol_level', '13.5', 'customer_a'),
(7, 'volume', '750ml', 'customer_a'),
(7, 'brand', '长城', 'customer_a'),

(8, 'alcohol_level', '4.3', 'customer_a'),
(8, 'volume', '500ml', 'customer_a'),
(8, 'brand', '青岛', 'customer_a'),

(9, 'alcohol_level', '52', 'customer_a'),
(9, 'volume', '500ml', 'customer_a'),
(9, 'brand', '茅台', 'customer_a');

业务查询示例

验证1:每个分类的字段定义与商品数据匹配
sql
-- 检查生鲜食品分类的字段定义和实际数据
SELECT 
    pc.category_name,
    md.field_code,
    md.field_name,
    COUNT(pe.id) as data_count
FROM product_category pc
JOIN metadata_dict md ON pc.id = md.category_id
LEFT JOIN product_extension pe ON md.field_code = pe.field_code AND pe.customer_id = md.customer_id
WHERE pc.id = 1
GROUP BY pc.category_name, md.field_code, md.field_name;

-- 预期结果:每个字段都有对应的数据记录
-- 生鲜食品 | origin | 产地 | 3
-- 生鲜食品 | fresh_temp | 保鲜温度 | 3  
-- 生鲜食品 | supplier | 供应商 | 3
验证2:商品基础数据与扩展数据的完整性
sql
-- 检查每个商品的基础数据和扩展数据
SELECT 
    pb.product_code,
    pb.base_name,
    pc.category_name,
    COUNT(pe.id) as extension_field_count
FROM product_base pb
JOIN product_category pc ON pb.category_id = pc.id
LEFT JOIN product_extension pe ON pb.id = pe.product_id
WHERE pb.customer_id = 'customer_a'
GROUP BY pb.product_code, pb.base_name, pc.category_name
ORDER BY pc.category_name, pb.product_code;

-- 预期结果:每个商品都有对应分类的完整扩展字段
-- FRESH-001 | 进口香蕉 | 生鲜食品 | 3
-- FRESH-002 | 澳洲牛排 | 生鲜食品 | 3
-- FRESH-003 | 智利车厘子 | 生鲜食品 | 3
-- DAILY-001 | 洗衣液 | 日用品 | 3
-- ... 以此类推
验证3:分析配置的完整性
sql
-- 检查可分析字段的配置情况
SELECT 
    pc.category_name,
    md.field_code,
    md.field_name,
    md.analysis_field_name,
    md.analysis_data_type
FROM metadata_dict md
JOIN product_category pc ON md.category_id = pc.id
WHERE md.is_analyzable = TRUE
ORDER BY pc.category_name, md.field_code;

-- 预期结果:除了'usage'字段外,其他字段都配置为可分析
-- 生鲜食品 | fresh_temp | 保鲜温度 | fresh_temperature | dimension
-- 生鲜食品 | origin | 产地 | origin | dimension  
-- 生鲜食品 | supplier | 供应商 | supplier | dimension
-- 日用品 | material | 材质 | material | dimension
-- 日用品 | shelf_life | 保质期 | shelf_life | dimension
-- 酒水饮料 | alcohol_level | 酒精度 | alcohol_level | metric
-- 酒水饮料 | brand | 品牌 | brand | dimension
-- 酒水饮料 | volume | 净含量 | volume | dimension
实际分析场景示例
基于这个完整匹配的数据,我们可以进行有意义的分析:

场景1:生鲜商品产地分析
sql
-- 分析各产地的商品数量和平均保鲜温度要求
SELECT 
    pe_origin.field_value as origin,
    COUNT(DISTINCT pb.id) as product_count,
    GROUP_CONCAT(DISTINCT pb.base_name) as products
FROM product_base pb
JOIN product_extension pe_origin ON pb.id = pe_origin.product_id AND pe_origin.field_code = 'origin'
JOIN product_extension pe_temp ON pb.id = pe_temp.product_id AND pe_temp.field_code = 'fresh_temp'
WHERE pb.category_id = 1  -- 生鲜食品分类
GROUP BY pe_origin.field_value
ORDER BY product_count DESC;
场景2:酒水饮料酒精度分布
sql
-- 分析不同品牌的酒精度分布
SELECT 
    pe_brand.field_value as brand,
    COUNT(*) as product_count,
    AVG(CAST(pe_alcohol.field_value AS DECIMAL(5,2))) as avg_alcohol_level,
    MIN(CAST(pe_alcohol.field_value AS DECIMAL(5,2))) as min_alcohol_level,
    MAX(CAST(pe_alcohol.field_value AS DECIMAL(5,2))) as max_alcohol_level
FROM product_base pb
JOIN product_extension pe_brand ON pb.id = pe_brand.product_id AND pe_brand.field_code = 'brand'
JOIN product_extension pe_alcohol ON pb.id = pe_alcohol.product_id AND pe_alcohol.field_code = 'alcohol_level'
WHERE pb.category_id = 3  -- 酒水饮料分类
GROUP BY pe_brand.field_value
ORDER BY avg_alcohol_level DESC;

2. 大数据采集架构

2.1 分层数据同步策略

业务数据库 (MySQL)
    ↓ 全量同步 (DataX) + 增量同步 (Canal)
数据湖/ODS层  
    ↓ ETL处理 (Flink)
分析数仓 (Doris)

2.2 Doris分析表设计

-- 商品分析宽表 - 支持动态字段分析
CREATE TABLE doris_product_analysis (
    -- 固定基础字段
    product_id BIGINT NOT NULL,
    customer_id VARCHAR(50) NOT NULL,
    product_code VARCHAR(100) NOT NULL,
    product_name VARCHAR(200) NOT NULL,
    category_id BIGINT NOT NULL,
    category_name VARCHAR(100) NOT NULL,
    
    -- 动态扩展字段统一存储
    extension_map MAP<VARCHAR(100), VARCHAR(500)) NOT NULL COMMENT '所有扩展字段键值对',
    
    -- 智能分析字段分类(基于配置自动生成)
    analysis_dimensions MAP<VARCHAR(100), VARCHAR(500)) COMMENT '维度字段集合',
    analysis_metrics MAP<VARCHAR(100), DOUBLE) COMMENT '指标字段集合',
    
    -- 时间维度
    created_date DATE NOT NULL,
    updated_time DATETIME NOT NULL,
    
    PRIMARY KEY (product_id, customer_id)
) ENGINE=OLAP
DUPLICATE KEY(product_id, customer_id, created_date)
PARTITION BY RANGE (created_date) ()
DISTRIBUTED BY HASH(product_id) BUCKETS 32
COMMENT '商品分析宽表 - 支持配置化字段分析';

-- 元数据快照表 - 记录字段定义变化
CREATE TABLE doris_metadata_snapshot (
    id BIGINT NOT NULL,
    field_code VARCHAR(100) NOT NULL,
    field_name VARCHAR(100) NOT NULL,
    analysis_field_name VARCHAR(100),
    analysis_data_type VARCHAR(20),
    customer_id VARCHAR(50) NOT NULL,
    snapshot_date DATE NOT NULL,
    is_active BOOLEAN DEFAULT TRUE,
    
    PRIMARY KEY (field_code, customer_id, snapshot_date)
) ENGINE=OLAP
DUPLICATE KEY(field_code, customer_id, snapshot_date)
COMMENT '元数据快照表 - 追踪字段定义变化';

2.3 智能ETL处理流程

# 伪代码:配置化ETL处理器
class ConfigurableETLProcessor:
    
    def build_analysis_record(self, product_data):
        """构建分析宽表记录 - 自动识别维度/指标"""
        
        record = {
            # 基础字段
            'product_id': product_data['id'],
            'customer_id': product_data['customer_id'],
            'product_code': product_data['product_code'],
            'product_name': product_data['base_name'],
            'category_id': product_data['category_id'],
            'category_name': product_data.get('category_name', ''),
            
            # 动态字段容器
            'extension_map': {},
            'analysis_dimensions': {},
            'analysis_metrics': {},
            'created_date': product_data['created_at'].date(),
            'updated_time': product_data['updated_at']
        }
        
        # 获取该商户的字段分析配置
        analysis_config = self.get_analysis_config(product_data['customer_id'])
        
        # 处理扩展字段
        for field_code, field_value in product_data.get('extension_data', {}).items():
            # 存储原始扩展数据
            record['extension_map'][field_code] = str(field_value)
            
            # 智能分类:根据配置自动识别维度/指标
            field_config = analysis_config.get(field_code)
            if field_config and field_config['is_analyzable']:
                target_field = field_config['analysis_field_name']
                
                if field_config['analysis_data_type'] == 'dimension':
                    # 维度字段:直接存储字符串值
                    record['analysis_dimensions'][target_field] = str(field_value)
                else:
                    # 指标字段:尝试数值化处理
                    numeric_value = self.try_convert_to_number(field_value)
                    record['analysis_metrics'][target_field] = numeric_value
        
        return record
    
    def get_analysis_config(self, customer_id):
        """获取商户的分析字段配置"""
        # 从metadata_dict中查询该商户参与分析的字段配置
        config = {}
        analyzable_fields = self.query_analyzable_fields(customer_id)
        
        for field in analyzable_fields:
            config[field['field_code']] = {
                'is_analyzable': True,
                'analysis_field_name': field['analysis_field_name'],
                'analysis_data_type': field['analysis_data_type']
            }
        
        return config

3. 配置化分析方案

3.1 动态查询构建引擎

class DynamicAnalysisQueryBuilder:
    
    def build_analysis_query(self, analysis_request):
        """
        根据分析请求动态构建Doris查询
        analysis_request示例:
        {
            "template": "category_analysis",  // 预置模板
            "dimensions": ["category_name", "origin"],  // 分析维度
            "metrics": ["product_count", "avg_fresh_temperature"],  // 分析指标
            "filters": [
                {"field": "category_id", "operator": "=", "value": 1}
            ],
            "time_range": {"start_date": "2024-01-01", "end_date": "2024-12-31"}
        }
        """
        
        # 1. 处理预置模板
        if analysis_request.get('template'):
            analysis_config = self.load_template(analysis_request['template'])
        else:
            analysis_config = analysis_request
        
        # 2. 构建SELECT子句
        select_parts = self.build_select_clause(analysis_config)
        
        # 3. 构建WHERE条件
        where_conditions = self.build_where_clause(analysis_config)
        
        # 4. 构建GROUP BY
        group_by_clause = self.build_group_by_clause(analysis_config)
        
        # 5. 组装完整SQL
        sql = f"""
        SELECT {', '.join(select_parts)}
        FROM doris_product_analysis
        WHERE {' AND '.join(where_conditions)}
        """
        
        if group_by_clause:
            sql += f" GROUP BY {group_by_clause}"
            
        return sql
    
    def build_select_clause(self, config):
        """构建SELECT子句 - 支持动态字段"""
        select_parts = []
        
        # 处理维度字段
        for dimension in config.get('dimensions', []):
            if dimension in self.FIXED_FIELDS:  # 固定字段
                select_parts.append(dimension)
            else:  # 动态维度字段
                select_parts.append(f"analysis_dimensions['{dimension}'] as {dimension}")
        
        # 处理指标字段
        for metric in config.get('metrics', []):
            if metric == 'product_count':
                select_parts.append('COUNT(*) as product_count')
            elif metric.startswith('avg_'):
                field_name = metric[4:]  # 去掉avg_前缀
                select_parts.append(f"AVG(analysis_metrics['{field_name}']) as {metric}")
            elif metric.startswith('sum_'):
                field_name = metric[4:]  # 去掉sum_前缀
                select_parts.append(f"SUM(analysis_metrics['{field_name}']) as {metric}")
        
        return select_parts

3.2 预置分析模板体系

-- 分析模板配置表
CREATE TABLE analysis_template (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    template_code VARCHAR(50) NOT NULL COMMENT '模板编码',
    template_name VARCHAR(100) NOT NULL COMMENT '模板名称',
    template_config JSON NOT NULL COMMENT '模板配置JSON',
    customer_id VARCHAR(50) DEFAULT 'public' COMMENT '商户ID',
    category_id BIGINT COMMENT '适用分类',
    is_active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    UNIQUE KEY uk_template_customer (template_code, customer_id)
) COMMENT '分析模板配置表';

-- 预置模板数据示例
INSERT INTO analysis_template (template_code, template_name, template_config) VALUES
('category_overview', '分类概览分析', '{
    "dimensions": ["category_name"],
    "metrics": ["product_count"],
    "description": "按商品分类统计商品数量分布"
}'),
('fresh_product_analysis', '生鲜商品分析', '{
    "dimensions": ["category_name", "origin"],
    "metrics": ["product_count", "avg_fresh_temperature"],
    "filters": [
        {"field": "category_id", "operator": "IN", "value": [1,2]},
        {"field": "analysis_dimensions[\\"origin\\"]", "operator": "IS NOT NULL", "value": ""}
    ],
    "description": "生鲜商品产地和保鲜温度分析"
}'),
('custom_field_coverage', '自定义字段覆盖率', '{
    "dimensions": ["category_name"],
    "metrics": ["product_count"],
    "description": "分析各分类自定义字段填充情况"
}');

3.3 实际分析场景示例

场景1:生鲜商品产地分析

-- 动态生成的SQL(客户无需关心具体字段)
SELECT 
    category_name,
    analysis_dimensions['origin'] as origin,
    COUNT(*) as product_count,
    AVG(analysis_metrics['fresh_temperature']) as avg_fresh_temperature
FROM doris_product_analysis
WHERE customer_id = 'premium_mart'
    AND category_id IN (1, 2)  -- 生鲜分类
    AND analysis_dimensions['origin'] IS NOT NULL
GROUP BY category_name, analysis_dimensions['origin']
ORDER BY product_count DESC;

场景2:跨客户字段使用分析

-- 分析各商户自定义字段使用情况
SELECT 
    customer_id,
    COUNT(DISTINCT product_id) as total_products,
    COUNT(DISTINCT 
        CASE WHEN analysis_dimensions['origin'] IS NOT NULL THEN product_id END
    ) as products_with_origin,
    COUNT(DISTINCT 
        CASE WHEN analysis_metrics['fresh_temperature'] IS NOT NULL THEN product_id END  
    ) as products_with_temperature
FROM doris_product_analysis
GROUP BY customer_id;

场景3:动态字段趋势分析

-- 分析保鲜温度随时间的变化趋势
SELECT 
    DATE_FORMAT(created_date, '%Y-%m') as month,
    AVG(analysis_metrics['fresh_temperature']) as avg_temperature,
    COUNT(*) as product_count
FROM doris_product_analysis  
WHERE customer_id = 'premium_mart'
    AND analysis_metrics['fresh_temperature'] IS NOT NULL
    AND created_date >= '2024-01-01'
GROUP BY DATE_FORMAT(created_date, '%Y-%m')
ORDER BY month;

4. 方案优势总结

4.1 配置化价值

  • 业务自主:商户可自主配置字段和展示规则,无需开发介入

  • 快速响应:新字段从配置到分析使用,全程无需代码变更

  • 统一管理:所有字段定义和分析规则集中管理,避免分散配置

4.2 分析价值

  • 数据完整性:个性化字段统一进入分析体系,避免数据孤岛

  • 智能分类:自动识别维度/指标字段,简化分析配置

  • 模板化分析:预置行业最佳实践模板,降低使用门槛

  • 跨客户洞察:支持跨商户的字段使用情况和效果分析

4.3 技术优势

  • 架构扩展性:动态Schema设计支持无限字段扩展

  • 性能优化:分析宽表预聚合,支持实时分析查询

  • 数据一致性:通过元数据驱动,确保业务数据与分析数据的一致性

该方案实现了商品域从业务配置到数据分析的全链路闭环,既满足了商户个性化需求,又保证了数据分析的标准化和可扩展性。

 posted on 2025-10-21 15:54  xibuhaohao  阅读(6)  评论(0)    收藏  举报