-- Ticket03:推式来源(PUSH_INGEST)的落地表,ADR-0065。
|
-- 甲方机器上的只读取数程序把厂商原始行推给接收端点,行按收到的键值原样落在这里:不改列名、不增删字段、不做换算(JSON 列会规范化格式,但键值不变)。
|
-- 解释只做一遍并全部落在后端:身份映射、时间换算、幂等键取值、测量列取值都在接收端点里完成,
|
-- 因此这张表既能本地回放开发与回归(不依赖那台机器在线),也是适配器读回统一观测的唯一来源——
|
-- 适配器只做投影,不含任何厂商列名。
|
-- 推送记录按事件落库:唯一键让同一条来源行重复推送被幂等忽略,同身份内容不同只报冲突、不覆盖。
|
CREATE TABLE t_device_ingest_record (
|
ingest_id BIGINT NOT NULL AUTO_INCREMENT,
|
adapter_code VARCHAR(64) NOT NULL,
|
-- 载荷类别:TOPOLOGY 拓扑上报(通道清单)、SAMPLE 逐点数据行、HEARTBEAT 存活心跳。
|
payload_kind VARCHAR(16) NOT NULL,
|
devtype INT NOT NULL DEFAULT 0,
|
devid INT NOT NULL DEFAULT 0,
|
subdevid INT NOT NULL DEFAULT 0,
|
chlid INT NOT NULL DEFAULT 0,
|
-- 厂商协议序号(22 所为 Data_Point):水位与"同一绝对秒内多行"都靠它区分。
|
record_sequence BIGINT NOT NULL DEFAULT 0,
|
-- 来源行身份(22 所为 库/表 + Data_Point);同身份只允许一行,重复推送因此天然幂等。
|
record_key VARCHAR(191) NOT NULL,
|
-- 厂商来源定位(库/表),供回放与现场排查,不参与判定。
|
source_ref VARCHAR(191) NULL,
|
device_time_utc DATETIME(3) NULL,
|
device_time_raw VARCHAR(64) NULL,
|
timezone_id VARCHAR(64) NULL,
|
cycle_no INT NULL,
|
step_no INT NULL,
|
relative_time_seconds DECIMAL(20,3) NULL,
|
-- 测量列按厂商给的物理单位原样落库(22 所不做缩放);缺列保持为空,不写零代替缺失。
|
voltage_v DECIMAL(30,12) NULL,
|
current_a DECIMAL(30,12) NULL,
|
charge_capacity_ah DECIMAL(30,12) NULL,
|
discharge_capacity_ah DECIMAL(30,12) NULL,
|
charge_energy_wh DECIMAL(30,12) NULL,
|
discharge_energy_wh DECIMAL(30,12) NULL,
|
-- 厂商原始行,按收到的键值原样保留:回放与核对解释逻辑都靠它。
|
payload_json JSON NOT NULL,
|
content_sha256 BINARY(32) NOT NULL,
|
received_at_utc DATETIME(3) NOT NULL,
|
PRIMARY KEY (ingest_id),
|
UNIQUE KEY uk_ingest_record (adapter_code, payload_kind, record_key),
|
-- 逐行接收按 (设备时间, 协议序号) 取严格晚于水位的数据行,索引列次序与它一致。
|
KEY idx_ingest_channel (adapter_code, payload_kind, devtype, devid, subdevid, chlid, device_time_utc, record_sequence)
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='推式来源落地表';
|