Skip to content

Identify体系

吴达 edited this page Feb 22, 2021 · 1 revision

Identify体系

问题

假设有租户、部门、用户3种实体,如何表示用户所属的租户和部门呢?

tenant

列名 注释
tenant_id 租户ID

department

列名 注释
department_id 部门ID

user

列名 注释
user_id 用户ID

方案一

分别建立用户与租户和部门的关系,这时我们需要两个关联关系表

user_belongs_to_tenant

列名 注释
user_id 用户ID
tenant_id 租户ID

user_belongs_to_department

列名 注释
user_id 用户ID
department_id 部门ID

方案二

租户和部门都可以认为是一种【用户组】,使用【user_belongs_to_group】表记录用户与用户组之间的关系。在【user_belongs_to_group】表中,【group_id】可能是【tenant_id】,也可能是【department_id】,但是如何知道【group_id】列中记录的是【tenant_id】还是【department_id】呢?这时就需要【group_type】这个字段来标记,当【group_type】是【tenent】时,【group_id】就是【tenent_id】;当【group_type】是【department】时,【group_id】就是【department_id】。

user_belongs_to_group

列名 注释
user_id 用户ID
group_id 用户组,可以是租户,也可以是部门
group_type 用户组类型,可以是租户,也可以是部门

Identifier和IdentifierType

类似于【user_belongs_to_group】表中的【group_id】和【group_type】这种组合唯一定位一个实体,我们统称这个的组合为Identify体系,用更泛化的语言描述就是:一个实体可以通过唯一标记符定位,这个唯一标记符由值和类型组成。具体到代码中就是IdentifierIdentifierType类,这两个类的定义如下

public interface Identifier<T> {

    /**
     * 该identifier的值.
     *
     * @return value
     */
    T getValue();

    /**
     * 该identifier的类型.
     *
     * @return {@link IdentifierType}
     */
    IdentifierType getType();
}
public interface IdentifierType {

    /**
     * 获取code.
     *
     * @return code
     */
    int getCode();

    /**
     * 描述信息.
     *
     * @return 描述
     */
    String getDescription();


}

Identifier有两个方法,其中getValue()方法的返回值表示该唯一标记符的值,就好比是【group_id】;getType()方法的返回值表示该唯一标记符的类型,就好比是【group_type】。

IdentifierTypeRegistry

唯一标记符的类型IdentifierType,我们使用强类型定义,目的就是希望在全局能够被安全的使用,新定义的IdentifierType在使用之前,必须先注册到IdentifierTypeRegistry中,注册完成后就可以从该注册中心获取使用。

内置的IdentifierType

系统内置了多个IdentifierType,它们在BuiltinIdentifierType枚举类中,在定义新的IdentifierType之前,可以看下是否已经这个枚举中。