【发布时间】:2018-07-02 16:47:02
【问题描述】:
我正在开发一个 SaaS 产品,并试图找出为我的场景设计数据库的最佳方法,我认为这是非常标准的。
我不应该说我没有设计这样一个数据库的经验。
我厌倦了在线研究,但我找不到任何关于实施的信息。有很多比较不同的多租户架构。
对于多租户方法,我决定使用单个数据库 - 这似乎是最合适的。
以下是应支持的基本列表:
- 多个客户端,全部分离,它们之间不共享数据。
- 每个客户都有自己的用户群(员工/员工)。
- 客户的工作人员对系统有不同的访问级别(接触不同的区域、执行某些操作的能力)
- 每个客户都有自己的客户。
我可以理解以下基本概念:任何桌子上的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.id 收集它的 access 列表role_access.role_id)。
获得访问列表后,我可以检查请求并查看是否允许用户执行操作。
- 注意事项
-
role可以为每个租户/帐户定制(例如,一个可以有“管理”和“员工”,另一个可以有“管理”、“支持”和“销售”),因此与account的关联。 -
另一方面,
access是平台范围的。该平台在所有租户中具有相同的区域和操作集。因此无需将其与特定帐户关联。 - 对
access查找的改进可能是在登录时将访问列表存储在会话中,以消除双重连接(获取所有用户的角色,获取所有角色的访问列表)。
-
问题
- 首先,您对设计的总体看法是什么。您发现任何缺陷吗?
- 将
account_id保存在session上真的需要/一个好主意吗? - 让服务器检查用户是否有权访问某个资源是执行此操作的标准方法吗?有没有办法将其作为自身查询的一部分(例如从数据库本身获取错误)?
【问题讨论】:
-
多个租户在同一个表是最糟糕的选择。你为什么默认它?
-
更容易维护单个数据库,更好地扩展,更具成本效益......你的反对票是什么?
-
有理由不这样做:一些行业法规可能要求更严格的数据隔离,升级/迁移无论如何都会影响所有租户,并且很难处理单个租户数据集。我给了talk 一个关于 2017 年最后一次管理的技术。
-
我明白了。这就是为什么我不认为不同的方法更好或更坏。更适合您想要实现的目标。就我而言,我没有任何这些规定或需求,因此单个数据库看起来最合适。
-
@yohairosen 将近 2 年之后,您对数据库结构感到满意吗?你还在用吗?回顾过去,你会改变什么吗?
标签: mysql sql database-design roles saas