【问题标题】:Hierarchical multi-tenant architecture with Django and Postgresql using separate schemas使用不同模式的 Django 和 Postgresql 的分层多租户架构
【发布时间】:2019-04-11 21:49:18
【问题描述】:

我有一个 django 应用程序,它有客户端和链接到这些客户端的多个用户,我想将系统迁移到分层多租户架构。

分层部分

客户端可以递归地包含其他客户端。例如,Client A 包括 Client BClient C。如果用户Client A 登录系统,用户将看到Client BClient C 的数据。如果Client B的用户登录系统,用户将只能看到Client B的数据。

多租户部分

我想将所有客户的数据存储在单独的架构中。但是有些数据与客户无关,所以我想将这些数据存储在“公共”模式中。

在研究Building Multi Tenant Applications with Django的时候,看到了这个部分:

def set_tenant_schema_for_request(request):
    schema = tenant_schema_from_request(request)
    with connection.cursor() as cursor:
        cursor.execute(f"SET search_path to {schema}")

但是,要应用我上面提到的分层示例,我必须同时访问多个模式。我可以这样做还是有其他方法可以实现我的架构?

【问题讨论】:

    标签: django postgresql database-design architecture multi-tenant


    【解决方案1】:

    您可以在 PostgreSQL 搜索路径中列出多个模式。如果同一个表出现在多个模式中,则只会返回搜索路径中第一个模式中的行。不同模式中的表中的行不会自动组合。所以这可能不是你想要的。

    您可以重新架构您的应用程序,以便每个查询都从不同模式的表中选择数据,然后使用联合子句将这些结果连接在一起。虽然这提供正确的结果,但应该清楚的是,以这种方式构建所有查询会使应用程序变得非常复杂,并且也不是一个好的计划。

    如果您希望能够同时查看来自多个客户端的数据,那么具有隔离架构的多租户架构并不是正确的选择。消除了替代方案后,我认为只剩下一种方法。您必须在同一个表中对来自不同客户端的行使用共享模式多租户。

    拥有共享架构意味着来自不同客户端的数据分离更少,但它提供了一种简单的方法来在需要时同时显示来自多个客户端的数据。通常的实现方法是在查询的 where 子句中添加术语,以确保只返回登录用户应该可见的数据。

    您可能会考虑的另一种可能性是在数据库中使用行级安全性。使用这种方法,每个客户端都将拥有自己的 Postgres 用户帐户,其策略限制仅访问适用于它们的行。这将确保从应用程序层到数据库层的正确安全性承担了一些责任,这有利有弊。一个好处是只需要在数据库中实施一次安全性,而不是在整个应用程序的数据访问部分中实施。一个可能的缺点是数据库要做的工作可能更多。

    https://www.postgresql.org/docs/11/ddl-rowsecurity.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      • 1970-01-01
      • 2017-07-18
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      相关资源
      最近更新 更多