在数据库设计中,同时使用自增主键(如 id)和业务唯一标识(如您表里的 zg_id),是一种非常经典且合理的做法。这主要是为了遵循“职责分离”的原则,让两者在不同的层面上各司其职。

下面这个表格清晰地展示了两者的核心区别。

特性维度自增主键 (id)业务唯一标识 (zg_id)
核心职责技术锚点:保证数据库内部数据存储和关联的效率与稳定。业务名片:保证业务层面逻辑的唯一性、可读性和安全性。
唯一性范围表内唯一。业务全局唯一(通常跨表、跨系统)。
是否暴露不暴露给用户,仅在内部系统、API间传递。可安全暴露给用户、用于前台界面或外部系统交互。
值的特点无业务含义,通常为自增整数。可包含业务含义(如日期、类型代码等),格式灵活(如字符串)。
是否可变不可变,与数据生命周期绑定。可能允许变更(如用户修改微信号),但需严格管控。

为何需要业务唯一ID

正是因为自增主键专注于解决技术问题,所以在面对复杂的业务场景时,我们需要 zg_id 这样的业务唯一标识来弥补其不足,具体体现在以下几个方面:

  1. 安全性与隐私保护
    直接向用户或外部系统暴露连续的自增主键是高风险行为。它很容易被猜测,从而可能被恶意利用来遍历数据(例如,通过递增ID批量获取用户信息),导致数据泄露。 而 zg_id 可以设计成无规律的、不透明的字符串(类似于UUID或雪花ID),有效隐藏内部数据规模和组织方式。

  2. 应对分库分表
    在分布式数据库架构中,数据会被拆分到不同的物理服务器上。如果仅靠每个表自身的自增ID,无法保证全局范围的唯一性(不同服务器上的表可能会有相同的自增ID)。而 zg_id 可以通过分布式算法(如雪花算法)或统一的服务来生成,确保其在整个系统内都是唯一的,这是分库分表的刚性需求。

  3. 承载业务语义
    业务ID可以包含有意义的信息。例如,一个订单号 zg_id 可以是 20251230100001,其中 20251230 代表日期,100001 是序列号。这对于运维排查问题、业务分类统计都非常直观友好。 自增ID则完全不具备这种可读性。

  4. 适应业务规则变化
    业务标识符有时可能需要修改。例如,微信允许用户在一定条件下修改微信号,或者公司重组导致原有的编码规则需要调整。如果使用业务字段作为外键关联到其他表,这种变更会引发复杂的连锁更新。而使用稳定的、与业务无关的 id 主键进行关联,zg_id 的变更就只会发生在一张表内,影响最小化。

总结与最佳实践

简单来说,id 和 zg_id 的关系可以类比于:

  • id (自增主键):像是公司在内部管理系统为每位员工分配的工号。它唯一、稳定、不对外公开,是HR、财务等部门进行内部管理的基石。
  • zg_id (业务唯一ID):像是员工对外的工作邮箱地址。它唯一、可读(通常是姓名缩写)、可以根据需要申请或变更,是员工与外界沟通的“业务名片”。

因此,在您的用户表设计中,id BIGINT 作为内部关联和索引的性能基石,而 zg_id VARCHAR 则作为面向业务和用户的唯一标识,两者相辅相成,共同构建了一个既高效又灵活的数据库模型。

希望这个解释能帮助您理解两者的关系和重要性。如果您对特定场景有进一步疑问,我们可以继续探讨。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐