3. 供应商报价数据模型
供应商报价数据模型是采购管理平台中所有报价分析、比价与趋势预测的基石。一个规范、完整的报价单数据结构,决定了系统能否高效地存储、检索与计算报价信息。本节将深入解析报价单的核心数据结构,并逐一拆解关键字段的业务含义与设计规范。
3.1 报价单数据结构总览
一份标准的供应商报价单,在数据库中通常以“主表 + 明细表”的范式进行设计。主表记录报价单的头部信息(如供应商、有效期、报价单号),明细表则记录具体的物料行项目。这种结构既能减少数据冗余,又能灵活支持一张报价单包含多个物料。
3.1.1 报价单主表(Quotation Header)
| 字段名称 | 数据类型 | 业务含义 | 示例值 |
|---|---|---|---|
| Quotation_ID | VARCHAR(20) | 报价单唯一编号(主键) | QTN-2025-00123 |
| Supplier_Code | VARCHAR(10) | 供应商编码(外键关联供应商主数据) | SUP-0089 |
| Quotation_Date | DATE | 报价单创建日期 | 2025-03-10 |
| Valid_From | DATE | 报价有效期起始日 | 2025-03-10 |
| Valid_To | DATE | 报价有效期截止日 | 2025-06-10 |
| Currency | VARCHAR(3) | 币种(ISO 标准) | CNY / USD |
| Payment_Terms | VARCHAR(50) | 付款条件(如:30天账期) | Net 30 |
| Status | VARCHAR(20) | 报价单状态(待审批/已批准/已过期) | 已批准 |
3.1.2 报价单明细表(Quotation Line Item)
| 字段名称 | 数据类型 | 业务含义 | 示例值 |
|---|---|---|---|
| Line_ID | INT | 行项目序号(主键) | 1 |
| Quotation_ID | VARCHAR(20) | 所属报价单ID(外键) | QTN-2025-00123 |
| Material_Code | VARCHAR(15) | 物料号(外键关联物料主数据) | MAT-10089 |
| Material_Name | VARCHAR(100) | 物料描述(冗余字段,提升查询效率) | 工业级轴承 6205 |
| Quantity | DECIMAL(12,2) | 报价数量(单位:个/千克/米) | 500.00 |
| Unit_Price | DECIMAL(10,4) | 单价(不含税,精确到4位小数) | 12.5000 |
| Tax_Rate | DECIMAL(5,2) | 税率(百分比) | 13.00 |
| Delivery_Date | DATE | 承诺交货日期 | 2025-04-15 |
| Lead_Time | INT | 交货周期(天数) | 30 |
3.2 关键字段深度解析
在众多字段中,有五个字段构成了报价趋势分析的核心维度,它们分别是:物料号、数量、单价、有效期和交货期。理解这些字段的语义与约束,是进行后续数据清洗与建模的前提。
3.2.1 物料号(Material Code)
物料号是识别物料的唯一标识。在数据模型中,它必须与物料主数据(Material Master)保持严格一致。趋势分析中,物料号是分组聚合的第一维度。如果物料号存在一物多码或一码多物的情况,将直接导致趋势曲线失真。
3.2.2 数量(Quantity)与单价(Unit Price)
数量与单价共同决定了报价的总金额。在趋势分析中,单价是核心指标,但数量决定了报价的规模效应。采购方通常需要关注“阶梯报价”场景:同一物料在不同数量区间下,单价可能存在显著差异。
- 数量阶梯: 例如:采购100个时单价为15元,采购500个时单价为12元。数据模型应支持同一物料在同一报价单中出现多条不同数量的行项目。
- 单价精度: 建议保留4位小数,避免因四舍五入导致的总价偏差累积。
- 单位一致性: 所有报价单中的物料单位必须统一(如:个、千克、米),否则无法直接比较单价。
3.2.3 有效期(Validity Period)
有效期由 Valid_From 和 Valid_To 两个字段共同定义。它是报价数据时效性的核心约束。在趋势分析中,只有处于有效期内的报价数据才应被纳入计算。
Valid_To 设为必填字段。
3.2.4 交货期(Delivery Date / Lead Time)
交货期反映了供应商的供货能力。在趋势分析中,交货期与单价往往呈现负相关:更短的交货期通常意味着更高的加急成本。数据模型应同时支持日期(Delivery_Date)和相对天数(Lead_Time),以适应不同的业务场景。
3.3 报价单数据模型关系图
下图展示了报价单主表与明细表之间的关联关系,以及它们与供应商主数据、物料主数据的外部依赖。
3.4 数据模型设计示例(DDL)
以下为基于 PostgreSQL 语法的报价单数据表定义示例,展示了主键、外键约束及字段类型的最佳实践。
-- 报价单主表
CREATE TABLE quotation_header (
quotation_id VARCHAR(20) PRIMARY KEY,
supplier_code VARCHAR(10) NOT NULL,
quotation_date DATE NOT NULL,
valid_from DATE NOT NULL,
valid_to DATE NOT NULL,
currency VARCHAR(3) NOT NULL DEFAULT 'CNY',
payment_terms VARCHAR(50),
status VARCHAR(20) NOT NULL DEFAULT '待审批',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_supplier
FOREIGN KEY (supplier_code) REFERENCES supplier_master(supplier_code)
);
-- 报价单明细表
CREATE TABLE quotation_line_item (
line_id SERIAL PRIMARY KEY,
quotation_id VARCHAR(20) NOT NULL,
material_code VARCHAR(15) NOT NULL,
material_name VARCHAR(100),
quantity DECIMAL(12,2) NOT NULL CHECK (quantity > 0),
unit_price DECIMAL(10,4) NOT NULL CHECK (unit_price >= 0),
tax_rate DECIMAL(5,2) DEFAULT 13.00,
delivery_date DATE,
lead_time INT,
CONSTRAINT fk_quotation
FOREIGN KEY (quotation_id) REFERENCES quotation_header(quotation_id),
CONSTRAINT fk_material
FOREIGN KEY (material_code) REFERENCES material_master(material_code)
);
3.5 数据质量校验规则
为了确保报价趋势分析的准确性,在数据入库前必须执行以下校验规则:
- 唯一性校验: 同一供应商在同一有效期内,对同一物料号不能存在两条单价不同的报价行(阶梯报价除外,需通过数量区间区分)。
- 时效性校验:
Valid_From必须早于Valid_To,且Valid_To不能早于当前日期(历史数据归档除外)。 - 逻辑校验: 单价不能为负数;数量必须大于零;交货日期不能早于报价单创建日期。
- 引用完整性: 所有外键(Supplier_Code、Material_Code)必须在对应的主数据表中存在。
3.6 报价数据模型与趋势分析的映射
下图展示了从原始报价数据到趋势分析指标的转换路径,帮助理解数据模型如何支撑上层的分析应用。
通过上述数据模型与映射流程,采购管理平台能够将分散的报价单转化为结构化的、可分析的数据资产,为后续的供应商报价趋势分析提供坚实的数据底座。