码表其实是“编码表”的简称。系统编码是一项重要的管理工作,会有大量的基础数据是基于编码表的。
码表(Code Table 或 Lookup Table)是一种用于存储和管理固定数据集合的数据结构。这些集合通常包含一系列预定义的值,这些值代表了系统中的某些状态、类别或其他固定的选项。
软件开发中码表很常见,例如下图中的数据,就可以改造为码表管理,实际上数据量远远不止这些:
推荐使用码表
使用码表在软件开发中有许多好处,尤其是在处理固定数据集和需要频繁更新的配置数据时。
- 码表统一:确保前后端使用相同的码值,避免了数据不一致的问题。前后端减少了数据转换的工作量。
- 可以确保在整个系统中使用一致的数据值,避免了数据冗余和不一致性的问题。
- 在不修改代码的情况下更改系统的某些行为或配置。当需要更新或调整码值时,只需更新码表即可,无需重新编译或部署代码。
- 将固定的值集中存储在一个地方,可以更容易地更新这些值。在多模块、大型复杂度高的系统中,码表管理简化了维护和升级的过程。
- 可通过缓存码表数据,提高系统的性能,减少了对数据库的查询次数。
- 可以动态满足不同的部署环境(如开发、测试、生产)的要求。
- 通过码表管理,可以更容易地为了解各种配置含义和用途。
- 通过版本控制码表数据,可以跟踪历史更改,审计和回滚。对于入职新人了解系统状态结构也比较友好。
码值管理模块设计(仅供参考)
表名 :code_tables
字段定义
- id (INT, 主键, 自增) - 唯一标识每个码表条目。
- code (VARCHAR) - 码表条目的唯一编码。
- name (VARCHAR) - 码表条目的名称。
- status (ENUM('ACTIVE', 'INACTIVE')) - 码表条目的状态。
- created_at (DATETIME) - 记录码表条目创建的时间戳。
- created_by (INT) - 创建人的用户ID。
- updated_at (DATETIME) - 记录码表条目最后更新的时间戳。
- updated_by (INT) - 最后更新人的用户ID。
- mnemonic (VARCHAR) - 助记码,用于快速记忆或查找。
- data_domain (VARCHAR) - 数据域,用于分类或分组码表条目。
- tenant_id (INT) - 租户ID,用于区分不同租户的数据。
- description (TEXT) - 描述或备注。
- start_date (DATE) - 码表条目生效的开始日期。
- end_date (DATE) - 码表条目失效的结束日期。
- scope (ENUM('GLOBAL', 'TENANT')) - 表示码表条目的作用范围,是全局还是租户级别的。
SQL 创建语句
CREATE TABLE code_tables (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '唯一标识',
code VARCHAR(255) NOT NULL COMMENT '码表条目的唯一编码',
name VARCHAR(255) NOT NULL COMMENT '码表条目的名称',
status ENUM('ACTIVE', 'INACTIVE') NOT NULL DEFAULT 'ACTIVE' COMMENT '码表条目的状态',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '记录码表条目创建的时间戳',
created_by INT NOT NULL COMMENT '创建人的用户ID',
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录码表条目最后更新的时间戳',
updated_by INT NOT NULL COMMENT '最后更新人的用户ID',
mnemonic VARCHAR(255) NOT NULL COMMENT '助记码,用于快速记忆或查找',
data_domain VARCHAR(255) NOT NULL COMMENT '数据域,用于分类或分组码表条目',
tenant_id INT NOT NULL COMMENT '租户ID,用于区分不同租户的数据',
description TEXT NOT NULL COMMENT '描述或备注',
start_date DATE NOT NULL COMMENT '码表条目生效的开始日期',
end_date DATE COMMENT '码表条目失效的结束日期',
scope ENUM('GLOBAL', 'TENANT') NOT NULL DEFAULT 'GLOBAL' COMMENT '表示码表条目的作用范围,是全局还是租户级别的',
UNIQUE (code, data_domain, tenant_id, scope)
) COMMENT='码表管理表';
全局码
INSERT INTO code_tables (code, name, status, created_by, updated_by, mnemonic, data_domain, tenant_id, description, start_date, scope)
VALUES ('COUNTRY_CODE', 'Country Codes', 'ACTIVE', 1, 1, 'CC', 'geography', 0, '国家编码', '2024-01-01', 'GLOBAL');
INSERT INTO code_tables (code, name, status, created_by, updated_by, mnemonic, data_domain, tenant_id, description, start_date, scope)
VALUES ('PRODUCT_CATEGORY', 'Product Categories', 'ACTIVE', 1, 1, 'PC', 'product', 0, '产品分类', '2024-01-01', 'GLOBAL');
租户自定义码
INSERT INTO code_tables
(code, name, status, created_by, updated_by, mnemonic, data_domain, tenant_id, description, start_date, scope)
VALUES ('ORDER_STATUS', 'Order Statuses for Tenant 1', 'ACTIVE', 1, 1, 'OS', 'order', 1, '租户1的订单状态', '2024-01-01', 'TENANT');
INSERT INTO code_tables (code, name, status, created_by, updated_by, mnemonic, data_domain, tenant_id, description, start_date, scope)
VALUES ('PAYMENT_METHOD', 'Payment Methods for Tenant 2', 'ACTIVE', 2, 2, 'PM', 'payment', 2, '租户2的支付方式', '2024-01-01', 'TENANT');
查询所有全局码
SELECT * FROM code_tables WHERE tenant_id = 0;
特定租户的码
SELECT * FROM code_tables WHERE tenant_id = 1;
特定状态的码
SELECT * FROM code_tables WHERE status = 'ACTIVE';
具体实践中
以上仅供参考,实际开发中根据自己的业务灵活调整。例如:码值到期时间,码值备注字段,码值扩展json值,拼音码等等。
有一些细节也是需要注意的
- 唯一性约束,使用复合唯一键来确保码表条目的唯一性。
- 对于敏感数据,考虑使用加密技术来保护数据安全。
- 引入版本管理机制,以便跟踪更改历史和回滚到之前的状态。记录每次变更的时间戳、变更内容及变更人,以便审计和恢复。
- 使用缓存来存储频繁访问的码表数据,减少数据库查询次数,码值通常不会频繁变动。
- 明确区分全局码表条目和租户自定义码表条目。
- 数据字典添加的时候要明确每个字段的意义、用途和数据类型,注释完整。
- 设计良好的码值管理服务,确保各个模块模块或其他系统组件之间的交互正常,码值统一。例如:提供 RESTful API 来支持前端和第三方系统与码表管理模块的交互。
其他暂时没想到,欢迎补充。