3. 合规边界定义:GDPR、HIPAA、PCI-DSS 对后端数据建模的影响

在领域驱动设计(DDD)中,合规边界是限界上下文(Bounded Context)的一种特殊形式。它要求数据模型不仅满足业务逻辑,还必须满足法律与行业监管的强制性约束。本章聚焦三大主流合规框架——GDPR(欧盟通用数据保护条例)、HIPAA(美国健康保险携带和责任法案)和 PCI-DSS(支付卡行业数据安全标准),分析它们如何影响实体设计、值对象定义、聚合边界以及数据持久化策略。

核心原则:合规不是后置的“补丁”,而是领域建模的第一性约束。在战术建模阶段(实体、值对象、聚合、仓储)就必须将合规规则内化。

3.1 三大合规框架的核心数据约束对比

下表从数据分类、存储限制、访问控制和删除/匿名化四个维度,对比 GDPR、HIPAA、PCI-DSS 对后端数据建模的直接影响。

维度 GDPR HIPAA PCI-DSS
数据分类 个人数据(PII)、特殊类别数据(敏感数据) 受保护健康信息(PHI) 持卡人数据(CHD)、敏感认证数据(SAD)
存储限制 目的达成后必须删除或匿名化;存储最小化 保留期由法律或机构政策规定;过期必须销毁 禁止存储 CVV/CVC、完整磁条数据;PAN 必须加密或令牌化
访问控制 数据最小化原则;角色与同意双重控制 最小必要原则;需记录访问日志(审计追踪) 严格限制访问权限;需要唯一用户 ID 和强认证
删除/匿名化 “被遗忘权”要求彻底删除或不可逆匿名化 销毁需符合 NIST 标准;电子与纸质同步 过期数据必须安全删除;禁止逻辑删除
建模启示:GDPR 要求实体中敏感字段必须作为独立值对象封装,并附带“同意”上下文;HIPAA 要求审计日志成为聚合的一部分;PCI-DSS 要求PAN 字段在实体中只能存储令牌(Token),原始值必须隔离在安全边界之外。

3.2 GDPR:数据最小化与“被遗忘权”的建模策略

GDPR 对领域模型最深远的影响是数据最小化和可删除性。在 DDD 中,这意味着:

  • 实体设计:只保留业务必需的属性。例如,用户实体不应包含“IP 地址”或“设备指纹”等非核心字段,除非有明确的法律依据。
  • 值对象封装:将敏感数据(如身份证号、生物特征)封装为独立值对象,并附加“处理目的”和“同意 ID”元数据。
  • 聚合边界:将“同意记录”作为独立的聚合根,与用户实体通过 ID 关联,而非直接嵌入用户聚合。
// 示例:GDPR 合规的用户聚合设计(伪代码)
public class User : AggregateRoot {
    public UserId Id { get; private set; }
    public Email Email { get; private set; }          // 值对象
    public HashedPassword Password { get; private set; } // 值对象
    // 不直接存储 IP、设备指纹等非必要字段
}

public class Consent : AggregateRoot {
    public ConsentId Id { get; private set; }
    public UserId UserId { get; private set; }
    public ProcessingPurpose Purpose { get; private set; } // 值对象
    public DateTime GrantedAt { get; private set; }
    public DateTime? RevokedAt { get; private set; }
    // 撤销时触发删除关联数据
}
常见陷阱:不要将“同意”作为用户实体的一个布尔字段。这会导致无法追踪历史变更,也无法支持“部分撤销”场景。必须建模为独立的聚合。

3.3 HIPAA:PHI 保护与审计追踪的聚合设计

HIPAA 要求对受保护健康信息(PHI)实施最小必要访问,并记录所有访问行为。在领域模型中,这体现为:

  • PHI 值对象:所有 PHI 字段(如诊断代码、检查结果)必须封装为值对象,且序列化时自动加密。
  • 审计日志聚合:每次对 PHI 的读取或修改,都必须在同一个事务中生成审计记录。审计日志应作为领域事件的副产品,而非事后追加。
  • 聚合拆分:将“患者基本信息”与“临床 PHI 数据”拆分为不同聚合,通过患者 ID 关联,以限制非授权上下文的访问范围。
// 示例:HIPAA 合规的审计日志生成(领域事件驱动)
public class MedicalRecord : AggregateRoot {
    public RecordId Id { get; private set; }
    public PatientId PatientId { get; private set; }
    public PhiValueObject Diagnosis { get; private set; } // 加密存储

    public void UpdateDiagnosis(PhiValueObject newDiagnosis, string userId) {
        var oldDiagnosis = this.Diagnosis;
        this.Diagnosis = newDiagnosis;
        // 触发领域事件,由事件处理器生成审计日志
        AddDomainEvent(new DiagnosisUpdatedEvent(this.Id, oldDiagnosis, newDiagnosis, userId, DateTime.UtcNow));
    }
}
建模建议:审计日志不应作为 MedicalRecord 聚合的一部分,而应作为独立的审计日志聚合。通过领域事件异步写入,避免主聚合过于臃肿。

3.4 PCI-DSS:持卡人数据的令牌化与隔离边界

PCI-DSS 对后端建模最严格的约束是:禁止存储敏感认证数据(SAD),且主账号(PAN)必须加密或令牌化。在 DDD 中,这要求:

  • 令牌化值对象:PAN 字段在领域模型中只能以令牌(Token)形式存在。原始 PAN 必须由外部令牌服务(如 Vault)管理。
  • 严格限界上下文:支付相关数据必须隔离在独立的“支付上下文”中,禁止与用户上下文、订单上下文共享数据库。
  • 禁止存储字段:CVV/CVC、完整磁条数据、PIN 码等字段,在领域模型中根本不应出现。如果业务需要验证,应通过外部服务实时校验。
// 示例:PCI-DSS 合规的支付聚合设计
public class Payment : AggregateRoot {
    public PaymentId Id { get; private set; }
    public OrderId OrderId { get; private set; }
    public TokenizedPan CardToken { get; private set; } // 令牌值对象
    public Money Amount { get; private set; }
    // 没有 CVV、没有原始 PAN、没有磁条数据
}

// 令牌值对象:只存储引用,不存储原始值
public class TokenizedPan : ValueObject {
    public string Token { get; }
    public string LastFourDigits { get; } // 仅用于展示
    // 构造函数确保 Token 不为空
}
关键决策:令牌化必须在应用层或基础设施层完成,领域层只处理令牌。这符合 DDD 的“持久化无关”原则,同时满足 PCI-DSS 的“数据隔离”要求。

3.5 合规边界对数据建模的综合影响(SVG 架构图)

下图展示了一个多合规框架共存的后端领域模型架构。左侧是业务限界上下文,右侧是合规约束层,中间通过合规适配器进行数据转换与隔离。

合规边界对领域建模的影响架构图 多合规框架下的领域模型架构 业务限界上下文 用户上下文 实体:User, Consent 医疗上下文 实体:MedicalRecord, AuditLog 支付上下文 实体:Payment, TokenizedPan 订单上下文 实体:Order, LineItem 合规适配器层 GDPR 适配器 数据最小化 / 匿名化 HIPAA 适配器 PHI 加密 / 审计日志 PCI-DSS 适配器 令牌化 / 数据隔离 合规策略引擎 规则评估 / 同意检查 合规约束层 GDPR 规则 存储最小化 / 被遗忘权 HIPAA 规则 最小必要 / 审计追踪 PCI-DSS 规则 禁止存储 SAD / 令牌化 数据保留策略 自动过期 / 安全删除 说明:业务上下文通过合规适配器层与合规约束层交互,适配器负责数据转换、加密、令牌化与策略评估

3.6 合规边界建模的常见陷阱与最佳实践

陷阱 问题描述 最佳实践
过度嵌入合规逻辑 将加密、审计、同意检查直接写在实体方法中,导致领域模型臃肿 使用领域服务或规范模式封装合规规则,实体只关注业务状态变更
忽略数据生命周期 只建模“创建”和“读取”,未考虑“删除”和“匿名化” 为每个聚合定义生命周期策略,通过领域事件触发删除或匿名化流程
跨上下文共享敏感数据 用户上下文直接传递 PAN 或 PHI 给订单上下文 严格遵循限界上下文边界,敏感数据只在其所属上下文中存在,其他上下文通过 ID 或令牌引用
审计日志作为事后追加 在基础设施层通过 AOP 或拦截器记录日志,脱离领域语义 将审计日志建模为领域事件的消费者,确保日志内容与业务操作语义一致
总结:合规边界不是技术约束,而是领域约束。在 DDD 中,合规规则应被建模为值对象的不变量、聚合的边界条件或领域服务的策略。只有这样,后端系统才能在满足业务需求的同时,天然地符合 GDPR、HIPAA、PCI-DSS 等法规要求。