我想使用Flask SQLAlchemy构建一个多租户应用程序。官方SQLAlchemy文档建议,要使用多租户,表应该分布在每个租户的1个方案中,并在引擎级别处理不同的租户。
对我来说,维护多个方案似乎有点臃肿,我想知道,如果设计正确,使用相同表格的方法对所有租户是否可行,如果没有,为什么不可行:
tenant_id
,该列指示哪一个租户“拥有”该行
我几乎找不到关于这种方法的任何信息(除了这个名为“多重炼金术”的软件包,它的工作原理似乎与我的描述类似,但已经存档了7年,没有更新)。我的直觉告诉我,这是有原因的。
tl;dr:为什么不在SQLAlchemy中使用多租户共享方案?
如果您使用多个模式来分离不同租户的数据,您基本上正在改进:
>
安全性,因为单独的模式允许为每个租户拥有单独的数据库用户。如果在数据库级别上已经无法访问不同租户的数据,则不必依赖使用数据库的软件来仅访问租户应有权访问的数据。这大大降低了程序员可能忘记WHERE子句/SQLAlChemy过滤器的错误的可能性,该过滤器限制了对当前租户数据的访问。
可伸缩性,因为您可以轻松地将已经分离的模式分布在多个服务器上,而不是单个表上。因此,如果您为单独的租户使用单独的模式,您已经为未来的增长做了准备。
如果仅使用专用外键列对多个租户和数据所有权进行建模,则不会给出这两个方面。
这是多租户的两种不同方法:
我认为这主要取决于租户数量和数据大小。一些租户,但有很多数据,那么第一种方法肯定更好。动态租户数量,则第二种方法更好。
我以前没有见过第二种方法的一般实现,比如多重炼金术,我个人会尝试一下。
正如您可能已经发现的那样(包括问题的其他答案),有多种实现多租户的方法,它们有优点和缺点,但没有明确的赢家。什么是多租户架构只是另一个,但是对几个选项的很好的概述,我不会照搬,因为阅读整篇文章是有意义的。
考虑到所有方法的利弊,这取决于团队的个人偏好和经验。
就我个人而言,我非常希望对sqlalchemy
进行扩展,以实现单一的共享数据库模式多租户,即多alchemy。目前尚不清楚为什么要归档该项目,但我有兴趣创建一个新项目来支持此功能,基于:
我正在开发一个多租户反应式应用程序,使用带有r2dbc驱动程序的Spring-Webflow Spring-data-r2dbc连接到Postgresql数据库。多租户部分是基于模式的:每个租户一个模式。因此,根据上下文(例如登录的用户),请求将访问数据库的特定模式。 我正在努力研究如何在r2dbc中实现这一点。理想情况下,这将是Hibernate处理MultiTenantConnectionPr
如何使用django租户模式将数据从共享模式迁移到多租户模式? 我们有一个saas,最初没有使用django租户模式,而是使用共享数据库、共享模式的方法。我们现在发现了django租户模式,并认为这是正确的选择。 现在的问题是如何将数据从单一的模式迁移到独立的租户模式。 文档说明如下: 注意:如果这是您第一次运行此命令,您的数据库应该是空的。 在我现有的应用程序中,我有一个租户表,所有其他模型都有
情景: 我们有一个多租户应用程序,其中每个租户都有自己的模式。有一个公共模式,其中存在一个包含每个租户记录的表。因此,有一个超级管理员可以创建租户,并将管理员分配给新创建的租户。 为了实现RBAC(基于角色的访问控制),我计划将每个角色表放入租户模式,并实现一些中间件来检查授权。在孤立的模式环境中,这是一个好的体系结构吗?
我正在使用Spring 2. x、Hibernate 5. x、Spring Data REST、Mysql 5.7构建一个多租户REST服务器应用程序。Spring 2. x使用Hikari进行连池。 我将使用每个租户数据库的方法,这样每个租户都有自己的数据库。 我以这种方式创建了我的MultiTenantConnectionProvider: 在我的实现中,我阅读了tenantId,并从中央管
我正在构建一个应用程序,它应该服务于多个租户,并存储他们非常敏感的数据。每个租户都有多个用户。我的后端堆栈是用spring boot Hibernate5构建的。我希望hibernate处理多租户问题,所以我有两个问题要问专家: 如果我使用的是每租户模式范式,如何在登录时将用户名与租户关联?每个租户都有自己的用户表,那么我如何知道用户名属于哪个租户呢? 在注册时,什么是正确的方法来动态创建新模式?
我有以下功能,由多个进程同时使用。但是我有时会在插入操作中遇到重复错误。我认为这是锁的问题,所以我改成了 ACCESS EXCLUSIVE 锁,但这不好,因为它锁定了整个桌子。使用共享行独占模式似乎可以正常工作,但我对性能和访问有一些疑问。其他进程将能够访问该表?与前一个锁相比,此锁更慢(行独占)?