当前位置: 首页 > 知识库问答 >
问题:

使用共享模式的SQLAlchemy中基于行/列的多租户

尉迟卓
2023-03-14

我想使用Flask SQLAlchemy构建一个多租户应用程序。官方SQLAlchemy文档建议,要使用多租户,表应该分布在每个租户的1个方案中,并在引擎级别处理不同的租户。

对我来说,维护多个方案似乎有点臃肿,我想知道,如果设计正确,使用相同表格的方法对所有租户是否可行,如果没有,为什么不可行:

  • 那些包含租户所有记录的表有一个不可为空的列tenant_id,该列指示哪一个租户“拥有”该行

我几乎找不到关于这种方法的任何信息(除了这个名为“多重炼金术”的软件包,它的工作原理似乎与我的描述类似,但已经存档了7年,没有更新)。我的直觉告诉我,这是有原因的。

tl;dr:为什么不在SQLAlchemy中使用多租户共享方案?

共有3个答案

王辉
2023-03-14

如果您使用多个模式来分离不同租户的数据,您基本上正在改进:

>

  • 安全性,因为单独的模式允许为每个租户拥有单独的数据库用户。如果在数据库级别上已经无法访问不同租户的数据,则不必依赖使用数据库的软件来仅访问租户应有权访问的数据。这大大降低了程序员可能忘记WHERE子句/SQLAlChemy过滤器的错误的可能性,该过滤器限制了对当前租户数据的访问。

    可伸缩性,因为您可以轻松地将已经分离的模式分布在多个服务器上,而不是单个表上。因此,如果您为单独的租户使用单独的模式,您已经为未来的增长做了准备。

    如果仅使用专用外键列对多个租户和数据所有权进行建模,则不会给出这两个方面。

  • 宗政兴发
    2023-03-14

    这是多租户的两种不同方法:

    • 每个租户1个方案看起来像是公共的。公司,公司a.用户,公司a.帖子,公司b.用户,公司b.帖子 在这些表中,不会引用实际租户(公司)
    • 添加/删除租户是一个非常简单的过程
    • 单一模式需要更少的管理
    • 跨租户请求很简单
    • 这种方法很难在数据库之间扩展或分布

    我认为这主要取决于租户数量和数据大小。一些租户,但有很多数据,那么第一种方法肯定更好。动态租户数量,则第二种方法更好。

    我以前没有见过第二种方法的一般实现,比如多重炼金术,我个人会尝试一下。

    苏麒
    2023-03-14

    正如您可能已经发现的那样(包括问题的其他答案),有多种实现多租户的方法,它们有优点和缺点,但没有明确的赢家。什么是多租户架构只是另一个,但是对几个选项的很好的概述,我不会照搬,因为阅读整篇文章是有意义的。

    考虑到所有方法的利弊,这取决于团队的个人偏好和经验。

    就我个人而言,我非常希望对sqlalchemy进行扩展,以实现单一的共享数据库模式多租户,即多alchemy。目前尚不清楚为什么要归档该项目,但我有兴趣创建一个新项目来支持此功能,基于:

    • SQLAlChemy版本1.4,2.0只是为了不麻烦支持即将成为遗留版本
    • MultiAlChemy的想法
    • FilteredQuery配方中的想法
     类似资料:
    • 我正在开发一个多租户反应式应用程序,使用带有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 锁,但这不好,因为它锁定了整个桌子。使用共享行独占模式似乎可以正常工作,但我对性能和访问有一些疑问。其他进程将能够访问该表?与前一个锁相比,此锁更慢(行独占)?