-- +goose Up -- +goose StatementBegin ALTER TABLE tenant_ledgers ADD COLUMN IF NOT EXISTS operator_user_id bigint, ADD COLUMN IF NOT EXISTS biz_ref_type varchar(32), ADD COLUMN IF NOT EXISTS biz_ref_id bigint; -- tenant_ledgers.operator_user_id:操作者(谁触发该流水) -- 用途:用于审计与风控追溯(例如后台代退款/调账等)。 COMMENT ON COLUMN tenant_ledgers.operator_user_id IS '操作者用户ID:谁触发该流水(admin/buyer/system);用于审计与追责;可为空(历史数据或无法识别时)'; -- tenant_ledgers.biz_ref_type/biz_ref_id:业务引用(幂等与追溯) -- 用途:在 idempotency_key 之外提供结构化引用(例如 order/refund 等),便于报表与按业务对象追溯。 COMMENT ON COLUMN tenant_ledgers.biz_ref_type IS '业务引用类型:order/refund/etc;与 biz_ref_id 组成可选的结构化幂等/追溯键'; COMMENT ON COLUMN tenant_ledgers.biz_ref_id IS '业务引用ID:与 biz_ref_type 配合使用(例如 orders.id);用于对账与审计'; -- 索引:按操作者检索敏感操作流水(后台审计用)。 CREATE INDEX IF NOT EXISTS ix_tenant_ledgers_tenant_operator ON tenant_ledgers(tenant_id, operator_user_id); -- 索引:按业务引用快速定位同一业务对象的流水集合。 CREATE INDEX IF NOT EXISTS ix_tenant_ledgers_tenant_biz_ref ON tenant_ledgers(tenant_id, biz_ref_type, biz_ref_id); -- 结构化幂等(可选):同一业务引用在同一流水类型下只能出现一条。 -- 说明:biz_ref_* 允许为空;仅当两者都非空时才参与唯一性约束。 CREATE UNIQUE INDEX IF NOT EXISTS ux_tenant_ledgers_tenant_biz_ref_type_id_type ON tenant_ledgers(tenant_id, biz_ref_type, biz_ref_id, type) WHERE biz_ref_type IS NOT NULL AND biz_ref_id IS NOT NULL; -- +goose StatementEnd -- +goose Down -- +goose StatementBegin DROP INDEX IF EXISTS ux_tenant_ledgers_tenant_biz_ref_type_id_type; DROP INDEX IF EXISTS ix_tenant_ledgers_tenant_biz_ref; DROP INDEX IF EXISTS ix_tenant_ledgers_tenant_operator; ALTER TABLE tenant_ledgers DROP COLUMN IF EXISTS biz_ref_id, DROP COLUMN IF EXISTS biz_ref_type, DROP COLUMN IF EXISTS operator_user_id; -- +goose StatementEnd