我正在开发一个SaaS产品,尝试为我的场景设计最佳的数据库结构,我认为这个场景非常标准。
我应该注意到我没有设计过这样的数据库。
我在网上进行了研究,但实际上我找不到任何有关实现的信息。虽然有很多比较不同的多租户架构。
对于多租户方法,我决定采用单一数据库 - 似乎是最适合的。
以下是基本支持的列表:
- 多个客户端,全部分离,在它们之间不共享数据。 - 每个客户端都有自己的用户群(员工)。 - 客户的员工成员可以访问系统的不同区域,并能执行某些操作。 - 每个客户都有自己的客户。
我可以理解将tenant_id放在属于那个租户的任何表格上的基本概念。我想我的问题更多地是如何与每个客户端的员工成员的不同访问级别相结合。
你会怎么做呢?是否有相关的数据库实现参考?
谢谢!
更新
在得到@dmfy的答案后,我思考了一下并想出了这个解决方案:
我会解释一下 -
在成功登录后,会创建一个
一旦我有了访问列表,我就可以检查请求并查看用户是否被允许执行操作。
注释:
-
问题:
- 首先,您对设计的整体看法如何?您是否看到任何缺陷? - 在
我应该注意到我没有设计过这样的数据库。
我在网上进行了研究,但实际上我找不到任何有关实现的信息。虽然有很多比较不同的多租户架构。
对于多租户方法,我决定采用单一数据库 - 似乎是最适合的。
以下是基本支持的列表:
- 多个客户端,全部分离,在它们之间不共享数据。 - 每个客户端都有自己的用户群(员工)。 - 客户的员工成员可以访问系统的不同区域,并能执行某些操作。 - 每个客户都有自己的客户。
我可以理解将tenant_id放在属于那个租户的任何表格上的基本概念。我想我的问题更多地是如何与每个客户端的员工成员的不同访问级别相结合。
你会怎么做呢?是否有相关的数据库实现参考?
谢谢!
更新
在得到@dmfy的答案后,我思考了一下并想出了这个解决方案:
account
-id
-name
user
-id
-account_id
-username
-password
role
-id
-account_id
-name
user_role
-user_id
-role_id
access
-id
-role_id
-name
role_access
-role_id
-access_id
session
-account_id
-user_id
-token
我会解释一下 -
role
表实际上是与权限/访问级别列表相关联的用户组。
access
表表示单个权限。平台的某个区域,可以(或不能)执行的操作。在成功登录后,会创建一个
session
表中的行。每次调用服务器时,如果已对令牌进行了验证,则会查找该用户的角色(使用user_roles
上的session.user_id
)并收集其访问列表(使用role_access.role_id
上的role.id
)。一旦我有了访问列表,我就可以检查请求并查看用户是否被允许执行操作。
注释:
-
role
可以为每个租户/帐户定制(例如,一个租户可以拥有“管理”和“员工”,另一个租户可以拥有“管理”,“支持”和“销售”),因此与account
关联。
- 另一方面,access
是平台范围内的。该平台在所有租户中都具有相同的区域和操作集。因此,没有必要将其与特定帐户相关联。
- 对于access
查找的改进可能是在登录时将访问列表存储到会话中,以消除双重连接(获取所有用户的角色,获取所有角色的访问列表)。问题:
- 首先,您对设计的整体看法如何?您是否看到任何缺陷? - 在
session
中保存account_id
是否真的需要/是一个好主意?
- 服务器检查用户是否有权访问某个资源是否是标准方法?是否有一种方式可以将其作为查询本身的一部分来完成(例如从数据库本身获得错误)?