最新新闻,最快送达

数据库多租户最终指南

  • 发布时间:2020-09-14
  • 来源:中培教育网

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

  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。就个人而言,我分别使用命名空间App\Models\Main和App\Models\Tenant。

  9.路线

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

  10.总结

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

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

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

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

  11.租户中间件

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

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

近期开班

phone
全国报名服务热线: 400-626-7377
合作伙伴
  • 国际APMG组织
  • 思科(Cisco)
  • 国际OPEN GROUP组织
  • 国家外专局培训中心
  • 上海银行
  • 中国石油管道局工程有限公司
  • 朗新科技
  • 中国国家博物馆
金牌客户
  • 中国石油天然气集团公司
  • 中国农业银行
  • 中国建设银行
  • 波司登集团
  • 浙江移动
合作机构
  • 美国项目管理协会
  • 人力资源和社会保障部
  • 中华人民共和国工业和信息化部
  • 中国计算机技术职业资格网
  • CITIF中国电子信息行业联合会
  • PEOPLECERT
微信公众号
公众号

微信号:zpitedu

  • 中培教育 Copyright © 2006-2020 北京中培伟业管理咨询有限公司 .All Rights Reserved
  • 京ICP备13024721号  gonganimg  京公网安备11010602007294号  增值电信业务经营许可证:京B2-20201348  全国统一报名专线:400-626-7377