数据库

数据库多租户最终指南

2020-09-14 16:22:19 | 来源:中培企业IT培训网

如今数据库对于这个时代的我们来说,并不陌生了吧。最近,一个新的数据库项目显示,经过身份验证的用户属于特定租户,应仅允许其从自己的数据库中提取数据。本文是实现数据库多租户这一目标的方法。本文将选择了以提供简单测试代码为起点的策略,并使它逐层工作。它提供了具有测试,迁移和特定于租户的小功能的完整解决方案。

  1.每个故事都始于测试:PostsTest

让测试驱动我的代码成为了我的激情。多租户不应有所不同。首先,我们确定我们希望测试的外观,然后使代码发生。

这是一个非常简单且公平的测试。为了使其工作,首要要求是TenantTestCase设置租户。但是在深入探讨之前,让我们快速编写我们的create助手。

  2.TenantTestCase

通过测试,我们可以预期TenantTestCase该类将负责创建一个新公司,一个新用户并对该用户进行身份验证。还应设置特定于数据库的连接。

通过使用RefreshDatabase,应该自动迁移主数据库。调用actingAs将建立身份验证。至于用户工厂,由于用户属于公司,因此应递归解决该依赖关系。

  3.工厂

该UserFactory会负责为我们创建新用户。Laravel的默认UserFactory几乎足够好,我们只需要向其中添加company_id字段即可。

一旦需要创建新用户,Laravel将尝试解析CompanyFactory。让我们接下来写。

这CompanyFactory是一家新公司通过我们的测试而生的时刻,因此我决定利用它来按期望的那样自动设置承租人数据库连接PostsTest。

最后一个工厂是PostFactory。出于组织目的,我决定将所有主要工厂迁入database/factories/main并为的租户工厂腾出空间database/factories/tenant。PostFactory非常简单。

  4. tenant_connect()和tenant_migrate()帮助器

顾名思义,tenant_connect()它将与租户数据库建立数据库连接。由于这是测试阶段,因此我们应确保租户数据库接收到它自己的迁移,例如posts表。

该文件可以放在下database/helpers.php。不要忘记将其添加到作曲家自动加载中。

“ autoload”:{

“ classmap”:[

“数据库/种子”,

“数据库/工厂”

],

“文件”:[

“ database / helpers.php”

],

“ psr .4”:{

“ App \”: “ app /”

}

}

这将我们带入下一个主题:迁移。

  5.主要迁移

默认的database / migrations文件夹将保存主要连接的数据库结构。我们需要创建“ 公司”迁移并调整“ 用户”以适应某个company_id字段。

使用名称手动创建公司迁移2014_10_12_000000_create_companies_table.php会将其放置在users迁移之前,这将防止任何外键冲突,因为要创建用户表的公司表应该已经存在。

  6.租户迁移

在第(3)项中,我们建立了一种tenant_migrate()方法,该方法将使用文件夹database/migrations_tenant作为承租人数据库结构的源。让我们create_posts_table在那里创建迁移。

至此,所有必要的迁移就结束了。接下来,我们需要处理应用程序数据库设置和模型的连接。

  7.应用程序数据库设置

对于数据库连接,让我们重用上一篇文章中应用的相同策略:a main和tenant数据库。特别注意指向的新默认连接main。另一个有趣的地方是DB_DRIVER变量,它将允许我们在测试和实时应用程序之间在SQLite和MySQL之间进行切换。

因为我们在谈论数据库设置,所以让我们花点时间设置phpunit.xml文件。该文件应包含这些变量

  <env name =“ DB_DRIVER” value =“ sqlite” /> 

  <env name =“ DB_CONNECTION” value =“ main” /> 

  <env name =“ DB_DATABASE” value =“:内存:” />

  8.模型

还需要在租户模型和主要模型之间划分模型。让我们在名称空间下创建MainModel和TenantModelApp/Models。

主连接上的表应该扩展MainModel,而“ Posts”表是特定于客户的数据库结构的一部分,并且应该扩展TenantModel。就个人而言,我分别使用命名空间AppModelsMain和AppModelsTenant。

  9.路线

由于本文的重点是谈论租期,所以我们不要浪费时间谈论路由。测试现在应该通过。

  10.总结

我们从创建帖子的测试开始,然后点击一个端点以查看是否返回。但是在执行测试之前,将调用setUpon方法TenantTestCase。

租户测试用例类将创建一个用户,该用户属于公司。在创建该公司的过程中,将建立一个新的数据库连接,并通过tenant_migrate()助手进行迁移。完成所有这些操作后,“承租人测试用例”类将拥有一个经过身份验证的用户。

一旦/posts端点被调用,已创建了一个用户数据库和已建立连接。通过使用Post具有默认连接的模型,该模型tenant将自动从连接的数据库中获取记录。

所有这些使我们成功实施了测试。但是实际应用呢?

  11.租户中间件

测试为绿色,但实际的应用程序无法正常工作。这样做的原因是因为测试正在建立租户连接,但应用程序却没有。我们可以通过实现租户中间件来解决这个问题。

上述就是关于数据库多租户最终指南的全部内容,想了解更多关于数据库的信息,请继续关注中培伟业。