如何根据人数动态配置结算周期并关联SalaryConfiguration与Periods
解决方案
核心思路是拆分薪资配置表结构,明确「薪资配置组」和「组内人员薪资明细」的层级关系,即可解决外键关联问题,同时支持动态适配不同人数、不同分摊规则的需求:
- 你现有表结构中的
IdGroup字段本质是用来标记「同一套分摊规则下的所有人员薪资配置集合」,但直接存放在明细表里无法作为主键被关联,因此拆分为两张表:- 新增
SalaryConfigGroups作为薪资配置组主表,主键为自增Id,存储每套配置的通用属性 - 原
SalaryConfigurations调整为薪资配置明细表,新增外键关联配置组主表的主键,原IdGroup字段可直接废弃
- 新增
- 调整
Periods表的外键字段,直接关联SalaryConfigGroups的主键Id,即可完成结算周期和对应薪资配置的绑定 - 补充
Transactions表的周期外键字段,满足交易关联所属结算周期、结清后冻结的需求
调整后的DDL示例
-- 新增薪资配置组主表 CREATE TABLE "SalaryConfigGroups" ( "Id" INTEGER NOT NULL UNIQUE, "Name" TEXT, -- 可选字段,可给配置设置别名如「2024年Q2三人分摊配置」 "CreateDate" TEXT NOT NULL, PRIMARY KEY("Id" AUTOINCREMENT) ); -- 调整原薪资配置表为明细表 CREATE TABLE "SalaryConfigDetails" ( "Id" INTEGER NOT NULL UNIQUE, "FkIdConfigGroup" INTEGER NOT NULL, "FkIdPerson" INTEGER NOT NULL, "Salary" INTEGER NOT NULL, CONSTRAINT "Fk_ConfigGroups_Details" FOREIGN KEY("FkIdConfigGroup") REFERENCES "SalaryConfigGroups"("Id"), CONSTRAINT "Fk_Persons_Details" FOREIGN KEY("FkIdPerson") REFERENCES "Persons"("Id"), PRIMARY KEY("Id" AUTOINCREMENT) ); -- 调整周期表的外键关联 CREATE TABLE "Periods" ( "Id" INTEGER NOT NULL UNIQUE, "StartDate" TEXT NOT NULL, "EndDate" TEXT NOT NULL, "FkIdSalaryConfigGroup" INTEGER NOT NULL, CONSTRAINT "Fk_ConfigGroups_Periods" FOREIGN KEY("FkIdSalaryConfigGroup") REFERENCES "SalaryConfigGroups"("Id"), PRIMARY KEY("Id" AUTOINCREMENT) ); -- 给交易表补充周期外键,满足结清标记、冻结需求 ALTER TABLE "Transactions" ADD COLUMN "FkIdPeriod" INTEGER; ALTER TABLE "Transactions" ADD CONSTRAINT "Fk_Periods_Transactions" FOREIGN KEY("FkIdPeriod") REFERENCES "Periods"("Id");
动态适配逻辑说明
- 后续如果参与分摊的人数变动、或者人员薪资调整需要更新分摊比例,只需要新建一条
SalaryConfigGroups记录,同时插入对应所有人员的薪资明细即可,不会影响历史周期的计算规则 - 创建结算周期时直接选择对应生效的薪资配置组,系统自动用该组下的人员薪资数据计算分摊比例,无论参与人数多少都可以灵活适配
- 已结清的历史周期绑定的配置组不会被修改,保证历史数据一致性
内容的提问来源于stack exchange,提问作者RegularNormalDayGuy
相关产品推荐
相关产品推荐

