-
Notifications
You must be signed in to change notification settings - Fork 35
Identify体系
假设有租户、部门、用户3种实体,如何表示用户所属的租户和部门呢?
列名 | 注释 |
---|---|
tenant_id | 租户ID |
列名 | 注释 |
---|---|
department_id | 部门ID |
列名 | 注释 |
---|---|
user_id | 用户ID |
分别建立用户与租户和部门的关系,这时我们需要两个关联关系表
列名 | 注释 |
---|---|
user_id | 用户ID |
tenant_id | 租户ID |
列名 | 注释 |
---|---|
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_id | 用户ID |
group_id | 用户组,可以是租户,也可以是部门 |
group_type | 用户组类型,可以是租户,也可以是部门 |
类似于【user_belongs_to_group】表中的【group_id】和【group_type】这种组合唯一定位一个实体,我们统称这个的组合为Identify体系,用更泛化的语言描述就是:一个实体可以通过唯一标记符定位,这个唯一标记符由值和类型组成。具体到代码中就是Identifier和IdentifierType类,这两个类的定义如下
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】。
唯一标记符的类型IdentifierType,我们使用强类型定义,目的就是希望在全局能够被安全的使用,新定义的IdentifierType在使用之前,必须先注册到IdentifierTypeRegistry中,注册完成后就可以从该注册中心获取使用。
系统内置了多个IdentifierType,它们在BuiltinIdentifierType枚举类中,在定义新的IdentifierType之前,可以看下是否已经这个枚举中。
架构
数据库设计
约定
基础工具
DataType模块
Property模块
权限模块