javascript 基于外键和另一个值创建约束

e7arh2l6  于 2023-05-05  发布在  Java
关注(0)|答案(2)|浏览(88)

我有两个实体:Organization和OfficeLocation,其中一个Organization可以有多个OfficeLocation。
每个OfficeLocation都可以有自己的昵称,该昵称在组织内必须是唯一的。
这让我觉得应该有一个**@Unique约束,由nickNameorganization组成。
问题是:我如何在OfficeLocation实体中声明它?查看mikro-orm文档,我了解到可以在实体级或属性级定义
@Unique**约束。
如果我在属性级别声明,我将创建一个约束,该约束将阻止我包含来自另一个组织的办公室位置,该办公室位置与属于另一个组织的现有办公室位置具有相同的昵称,对吗?

@Unique()
public nickName!: string;

那么,声明这个约束的正确方法应该是这样的?

@Entity()
@Unique({ properties: ['nickName', 'organization'] })
export class OfficeLocation {
  @Property()
  @Unique()
  public nickName!: string;

// all the other fields...

  @ManyToOne(() => Organization)
  public organization!: Organization;
}
bvuwiixz

bvuwiixz1#

如果知道其中一个字段本身是唯一的,那么在两个字段上使用复合唯一约束的目的是什么?换句话说,如果nickName已经是唯一的,那么即使向该约束添加任何其他列,它也是唯一的。两者都对我来说没有多大意义。nick & orgid上的复合约束本身意味着两个位置可以具有相同的昵称。
因此,如果您希望具有唯一的昵称,请保持属性级别为1。如果您希望允许表级别上的重复,但不允许组织内部的重复,则应仅保留复合索引并删除属性级别1。

sbdsn5lh

sbdsn5lh2#

您只需从nickname中删除属性级@unique,并保留实体级@unique,就像您在示例中所做的那样。它能满足你的需求

相关问题