ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

mysql设计一下工资系统表

mysql设计一下工资系统表 下面给你一套 **MySQL 工资系统表设计**覆盖典型的中小企业薪资场景员工、部门、薪资结构、考勤、社保公积金、个税、工资单、发放记录。设计原则**基础数据与计算结果分离**工资单一经确认不可随意改动留痕便于审计和重算。## 一、整体表清单| 表名 | 用途 ||---|---|| department | 部门 || employee | 员工基本信息 || employee_bank | 员工银行卡发薪用 || salary_item | 薪资项目字典基本工资、津贴、扣款等 || salary_structure | 薪资结构模板岗位/职级对应 || salary_structure_item | 结构模板明细 || employee_salary | 员工薪资标准定薪 || attendance | 考勤记录月度汇总 || social_insurance_config | 社保公积金配置城市/基数上下限/比例 || insurance_fund | 员工社保公积金月度明细 || tax_config | 个税税率表累进 || salary_sheet | 工资单主表月度、员工 || salary_sheet_item | 工资单明细各薪资项金额 || salary_payment | 发放记录银行回盘、状态 || salary_adjust_log | 调薪记录 |## 二、建表 SQL### 1. 部门sqlCREATE TABLE department (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,parent_id BIGINT UNSIGNED NOT NULL DEFAULT 0,name VARCHAR(100) NOT NULL,code VARCHAR(50) NOT NULL,leader_id BIGINT UNSIGNED DEFAULT NULL COMMENT 部门负责人 employee.id,status TINYINT NOT NULL DEFAULT 1 COMMENT 1启用 0停用,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (id),UNIQUE KEY uk_code (code),KEY idx_parent (parent_id)) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT部门;### 2. 员工sqlCREATE TABLE employee (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,emp_no VARCHAR(50) NOT NULL COMMENT 工号,name VARCHAR(50) NOT NULL,gender TINYINT NOT NULL DEFAULT 0 COMMENT 0未知 1男 2女,id_card VARCHAR(32) DEFAULT NULL COMMENT 身份证(建议加密存储),phone VARCHAR(20) DEFAULT NULL,email VARCHAR(100) DEFAULT NULL,dept_id BIGINT UNSIGNED NOT NULL,position VARCHAR(100) DEFAULT NULL COMMENT 岗位,job_level VARCHAR(50) DEFAULT NULL COMMENT 职级,hire_date DATE NOT NULL COMMENT 入职日期,leave_date DATE DEFAULT NULL COMMENT 离职日期,employment_type TINYINT NOT NULL DEFAULT 1 COMMENT 1全职 2兼职 3实习 4外包,status TINYINT NOT NULL DEFAULT 1 COMMENT 1在职 2试用 3离职 4停薪留职,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (id),UNIQUE KEY uk_emp_no (emp_no),KEY idx_dept (dept_id),KEY idx_status (status)) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT员工;### 3. 员工银行卡sqlCREATE TABLE employee_bank (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,employee_id BIGINT UNSIGNED NOT NULL,bank_name VARCHAR(100) NOT NULL,branch_name VARCHAR(200) DEFAULT NULL,account_no VARCHAR(64) NOT NULL COMMENT 银行卡号(建议加密),account_name VARCHAR(50) NOT NULL COMMENT 开户名,is_default TINYINT NOT NULL DEFAULT 1,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (id),KEY idx_emp (employee_id)) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT员工银行卡;### 4. 薪资项目字典sqlCREATE TABLE salary_item (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,code VARCHAR(50) NOT NULL COMMENT 项目编码 如 BASIC/BONUS/TAX,name VARCHAR(100) NOT NULL COMMENT 项目名称,type TINYINT NOT NULL COMMENT 1固定收入 2浮动收入 3固定扣款 4浮动扣款 5公司承担,calc_type TINYINT NOT NULL DEFAULT 1 COMMENT 1手工 2公式 3系统计算,formula VARCHAR(500) DEFAULT NULL COMMENT 计算公式,taxable TINYINT NOT NULL DEFAULT 1 COMMENT 是否计税 1是 0否,sort_no INT NOT NULL DEFAULT 0,status TINYINT NOT NULL DEFAULT 1,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (id),UNIQUE KEY uk_code (code)) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT薪资项目字典;### 5. 薪资结构模板sqlCREATE TABLE salary_structure (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,name VARCHAR(100) NOT NULL COMMENT 模板名称,job_level VARCHAR(50) DEFAULT NULL COMMENT 适用职级,status TINYINT NOT NULL DEFAULT 1,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (id)) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT薪资结构模板;CREATE TABLE salary_structure_item (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,structure_id BIGINT UNSIGNED NOT NULL,item_id BIGINT UNSIGNED NOT NULL COMMENT salary_item.id,amount DECIMAL(14,2) NOT NULL DEFAULT 0 COMMENT 固定金额,ratio DECIMAL(8,4) DEFAULT NULL COMMENT 比例(如绩效系数),sort_no INT NOT NULL DEFAULT 0,PRIMARY KEY (id),KEY idx_struct (structure_id)) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT薪资结构明细;### 6. 员工定薪sqlCREATE TABLE employee_salary (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,employee_id BIGINT UNSIGNED NOT NULL,structure_id BIGINT UNSIGNED DEFAULT NULL,effective_date DATE NOT NULL COMMENT 生效日期,base_salary DECIMAL(14,2) NOT NULL DEFAULT 0 COMMENT 基本工资,post_salary DECIMAL(14,2) NOT NULL DEFAULT 0 COMMENT 岗位工资,performance_salary DECIMAL(14,2) NOT NULL DEFAULT 0 COMMENT 绩效工资,allowance DECIMAL(14,2) NOT NULL DEFAULT 0 COMMENT 津贴合计,status TINYINT NOT NULL DEFAULT 1 COMMENT 1生效 0历史,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (id),KEY idx_emp_date (employee_id, effective_date)) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT员工定薪;### 7. 考勤汇总sqlCREATE TABLE attendance (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,employee_id BIGINT UNSIGNED NOT NULL,year_month CHAR(7) NOT NULL COMMENT YYYY-MM,work_days DECIMAL(5,2) NOT NULL DEFAULT 0 COMMENT 应出勤天数,actual_days DECIMAL(5,2) NOT NULL DEFAULT 0 COMMENT 实际出勤,leave_days DECIMAL(5,2) NOT NULL DEFAULT 0 COMMENT 事假,sick_days DECIMAL(5,2) NOT NULL DEFAULT 0 COMMENT 病假,annual_days DECIMAL(5,2) NOT NULL DEFAULT 0 COMMENT 年假,absent_days DECIMAL(5,2) NOT NULL DEFAULT 0 COMMENT 旷工,late_count INT NOT NULL DEFAULT 0,overtime_hours DECIMAL(8,2) NOT NULL DEFAULT 0,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (id),UNIQUE KEY uk_emp_month (employee_id, year_month)) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT月度考勤汇总;### 8. 社保公积金配置sqlCREATE TABLE social_insurance_config (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,city VARCHAR(50) NOT NULL COMMENT 城市,insurance_type VARCHAR(30) NOT NULL COMMENT pension/medical/unemployment/injury/maternity/housing,base_min DECIMAL(14,2) NOT NULL COMMENT 基数下限,base_max DECIMAL(14,2) NOT NULL COMMENT 基数上限,company_ratio DECIMAL(8,4) NOT NULL COMMENT 公司比例,personal_ratio DECIMAL(8,4) NOT NULL COMMENT 个人比例,effective_date DATE NOT NULL,status TINYINT NOT NULL DEFAULT 1,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (id),KEY idx_city_type (city, insurance_type, effective_date)) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT社保公积金配置;### 9. 员工社保公积金月度明细sqlCREATE TABLE insurance_fund (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,employee_id BIGINT UNSIGNED NOT NULL,year_month CHAR(7) NOT NULL,insurance_base DECIMAL(14,2) NOT NULL DEFAULT 0 COMMENT 社保基数,fund_base DECIMAL(14,2) NOT NULL DEFAULT 0 COMMENT 公积金基数,pension_personal DECIMAL(14,2) NOT NULL DEFAULT 0,medical_personal DECIMAL(14,2) NOT NULL DEFAULT 0,unemployment_personal DECIMAL(14,2) NOT NULL DEFAULT 0,fund_personal DECIMAL(14,2) NOT NULL DEFAULT 0,pension_company DECIMAL(14,2) NOT NULL DEFAULT 0,medical_company DECIMAL(14,2) NOT NULL DEFAULT 0,unemployment_company DECIMAL(14,2) NOT NULL DEFAULT 0,injury_company DECIMAL(14,2) NOT NULL DEFAULT 0,maternity_company DECIMAL(14,2) NOT NULL DEFAULT 0,fund_company DECIMAL(14,2) NOT NULL DEFAULT 0,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (id),UNIQUE KEY uk_emp_month (employee_id, year_month)) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT员工社保公积金月度明细;### 10. 个税税率表累计预扣sqlCREATE TABLE tax_config (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,level INT NOT NULL COMMENT 级数,threshold_min DECIMAL(14,2) NOT NULL COMMENT 累计应纳税所得额下限,threshold_max DECIMAL(14,2) DEFAULT NULL COMMENT 上限, NULL表示无上限,rate DECIMAL(8,4) NOT NULL COMMENT 税率,quick_deduction DECIMAL(14,2) NOT NULL COMMENT 速算扣除数,effective_year YEAR NOT NULL,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (id),KEY idx_year_level (effective_year, level)) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT个税税率表;### 11. 工资单主表sqlCREATE TABLE salary_sheet (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,employee_id BIGINT UNSIGNED NOT NULL,year_month CHAR(7) NOT NULL COMMENT YYYY-MM,gross_pay DECIMAL(14,2) NOT NULL DEFAULT 0 COMMENT 应发合计,deduction_total DECIMAL(14,2) NOT NULL DEFAULT 0 COMMENT 扣款合计(含社保公积金个人个税),net_pay DECIMAL(14,2) NOT NULL DEFAULT 0 COMMENT 实发合计,tax DECIMAL(14,2) NOT NULL DEFAULT 0 COMMENT 个税,insurance_personal DECIMAL(14,2) NOT NULL DEFAULT 0 COMMENT 社保个人合计,fund_personal DECIMAL(14,2) NOT NULL DEFAULT 0 COMMENT 公积金个人,company_cost DECIMAL(14,2) NOT NULL DEFAULT 0 COMMENT 公司总成本,status TINYINT NOT NULL DEFAULT 0 COMMENT 0草稿 1已计算 2已确认 3已发放 4已作废,calc_time DATETIME DEFAULT NULL,confirm_time DATETIME DEFAULT NULL,remark VARCHAR(500) DEFAULT NULL,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (id),UNIQUE KEY uk_emp_month (employee_id, year_month),KEY idx_month_status (year_month, status)) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT工资单主表;### 12. 工资单明细sqlCREATE TABLE salary_sheet_item (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,sheet_id BIGINT UNSIGNED NOT NULL COMMENT salary_sheet.id,item_id BIGINT UNSIGNED NOT NULL COMMENT salary_item.id,item_code VARCHAR(50) NOT NULL COMMENT 冗余,防字典变动,item_name VARCHAR(100) NOT NULL,item_type TINYINT NOT NULL COMMENT 同 salary_item.type,amount DECIMAL(14,2) NOT NULL DEFAULT 0,remark VARCHAR(255) DEFAULT NULL,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (id),KEY idx_sheet (sheet_id),KEY idx_item (item_id)) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT工资单明细;### 13. 发放记录sqlCREATE TABLE salary_payment (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,sheet_id BIGINT UNSIGNED NOT NULL,employee_id BIGINT UNSIGNED NOT NULL,bank_account VARCHAR(64) NOT NULL COMMENT 发放卡号(快照),amount DECIMAL(14,2) NOT NULL COMMENT 实发金额,pay_date DATE DEFAULT NULL,status TINYINT NOT NULL DEFAULT 0 COMMENT 0待发放 1发放中 2成功 3失败,fail_reason VARCHAR(255) DEFAULT NULL,bank_serial VARCHAR(100) DEFAULT NULL COMMENT 银行流水号,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (id),UNIQUE KEY uk_sheet (sheet_id),KEY idx_emp (employee_id),KEY idx_status (status)) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT工资发放记录;### 14. 调薪记录sqlCREATE TABLE salary_adjust_log (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,employee_id BIGINT UNSIGNED NOT NULL,old_base DECIMAL(14,2) NOT NULL DEFAULT 0,new_base DECIMAL(14,2) NOT NULL DEFAULT 0,old_total DECIMAL(14,2) NOT NULL DEFAULT 0,new_total DECIMAL(14,2) NOT NULL DEFAULT 0,reason VARCHAR(255) DEFAULT NULL COMMENT 调薪原因,effective_date DATE NOT NULL,operator_id BIGINT UNSIGNED DEFAULT NULL,created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (id),KEY idx_emp (employee_id)) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT调薪记录;## 三、关键设计说明**1. 金额统一用 DECIMAL(14,2)**工资、社保、个税都是钱**绝不能用 float/double**否则累加会丢精度。DECIMAL(14,2) 支持到百亿级足够。**2. 工资单「主表 明细」拆分**salle_sheet 存汇总应发/扣款/实发/个税/状态salary_sheet_item 存每个薪资项。好处- 薪资项可动态扩展不用改表结构- 明细里冗余 item_code/item_name/item_type防止字典表被改后历史工资单对不上**3. 唯一约束防重**- salary_sheet 的 uk_emp_month一个员工一个月只能有一张工资单重算要走「作废 新建」或更新状态- attendance、insurance_fund 同理**4. 状态机**工资单状态草稿 → 已计算 → 已确认 → 已发放确认后禁止修改明细只能作废重来。这是审计要求。**5. 社保公积金单独表**insurance_fund 把个人和公司部分都存下来方便- 算工资单的扣款- 算公司总成本company_cost- 生成社保申报表**6. 个税用累计预扣法**tax_config 按 level effective_year 存税率区间和速算扣除数。实际计算需结合「累计收入 - 累计专项扣除 - 累计减除费用」查表这属于业务逻辑不适合放表里。**7. 敏感字段加密**id_card、account_no 建议应用层加密如 AES后再存或至少做脱敏展示。数据库层面可考虑 TDE。**8. 索引设计**高频查询是「按月份 状态」和「按员工 月份」所以- salary_sheet(year_month, status)、(employee_id, year_month)- attendance/insurance_fund(employee_id, year_month)## 四、可选扩展按需增加不一定要全上- salary_sheet_approval审批流多级审批、审批人、意见- bonus_plan / bonus_detail年终奖、项目奖金- salary_advance预支工资- loan / loan_repayment员工借款与还款- cost_center成本中心用于分摊公司成本到项目/部门- exchange_rate多币种发薪## 五、一个计算流程示例1. 读取 employee在职 employee_salary当前生效定薪2. 读取 attendance当月考勤→ 算缺勤扣款、加班费3. 读取 insurance_fund当月社保公积金→ 取个人扣款部分4. 按 salary_item 逐项计算应发、扣款5. 累计预扣法算个税6. 写入 salary_sheet salary_sheet_item状态已计算7. 财务确认状态已确认8. 生成 salary_payment对接银行代发状态已发放9. 回盘更新 salary_payment.status 成功/失败如果你告诉我具体数据库版本MySQL 5.7 / 8.0、是否有多个发薪主体、是否需要多币种我可以再细化分区、字符集或增加对应表。
返回列表