在坚持之前在业务逻辑中进行验证是否足够,或者我应该在重要数据之上使用触发器?

Is it enough to validate in the business logic before persisting or should i use triggers on top of that for important data?

我有以下 class 型号:

必须确保一名员工只有一个属于项目的角色。因此,如果项目 A 具有角色 roleA 和 roleB,则员工只能拥有其中一个(但他显然可以拥有另一个项目的角色,但同样,只能拥有一个)。

我确保在我的业务逻辑中始终如此。因此,在我向员工添加角色之前,我会检查员工是否已经拥有属于他要添加的角色的项目的角色,等等。所以使用我的 API/business 逻辑,我能够确保必须 条件已满足。

但是我应该在数据库级别添加额外的安全层吗?我可以添加检查上述标准的触发器。这样一来,就绝对不可能将任何违反我的标准的数据添加到数据库中。是否需要数据库级别的额外安全层,或者如果我在我的业务逻辑中进行验证就足够了吗?触发器是正确的最佳方法吗?

编辑:

我按照以下方式执行评论建议的内容:

我的 IdClass 实现:

@Data
public class TestId implements Serializable {
  private Project project;

  private Employee employee;
}

class实现三元关联,使员工和项目对唯一:

@Entity
@Data
@IdClass(TestId.class)
public class Test {

  @Id
  @ManyToOne
  private Project project;

  @Id
  @ManyToOne
  private Employee employee;

  @ManyToOne
  private ProjectEmployeeRole projectEmployeeRole;
}

一题有两道题。

数据库:如果你想让数据库强制执行这个规则,你不需要任何触发器。只需使用关联 table 实现 EmployeeProject 之间的多对多关系,主键由 EmployeeIdProjectId 组成:组合必须是唯一的。在关联 table 中,您还将存储该员工在该特定项目中的唯一角色。

UML class图:你的图有误导性,因为有很多多对多关联,但不幸的是,你说的是一个特定的角色只能出现在一个项目中。在 UML 中表示这一点的更清晰的方法是表示三元关联(我提到的数据库关联 table 实际上会推动这种三元关联)。另一种变体是使用 UML 关联 class 并且此关联 class 本身可以与角色关联。