0

我正在构建一个 saas 应用程序,其中包含一个用于所有事务的主数据库以及每个租户的用户群和单独的数据库。每个租户都有一个唯一的子域,并在此基础上将正确的数据库指向租户。Web 应用程序使用 php 构建,MySQL 用于数据存储。

我有几个问题,首先;

  1. 当用户访问租户主页(例如 Sub.abc.com)时,将提供登录功能。由于用户名密码和用户库位于主数据库中,我将如何验证用户身份?是通过主数据库的单独数据库连接还是通过 Web api?什么是最好的方法?

  2. 会有租户创建的角色。因此,假设通过调用 web api 检索特定租户的人员,并且角色与用户 ID 一起存储在租户数据库中。这是正确的前进方式吗,因为没有直接的外键映射,而且一旦检索到用户,我应该将其存储在租户数据库中还是仅将其保存在内存中?

  3. 如果企业主想要一份关于每个租户数据库特定内容的报告,那么从每个租户数据库中获取所有数据的最佳方法是什么?

  4. 我们如何在超级管理员中捕获每个租户的数据库使用情况、文件存储和显示?

4

2 回答 2

3

我将如何验证用户身份?是通过主数据库的单独数据库连接还是通过 Web api?什么是最好的方法?

小心“最佳方式”问题 - 这会使这个问题指向偏离主题的观点。

如果您的应用程序是完全封闭的源代码(我想它是),那么没关系。如果您愿意,您可以直接访问您的主数据库,因为您的所有客户端实现都将成为您整个软件包的一部分。

话虽如此,为了可扩展性和可维护性,构建身份验证 API 接口并使用它可能是一个更好的主意,因此您不需要管理客户端软件的数据库连接组件。

...角色与用户 ID 一起存储在租户数据库中。这是正确的前进方式吗,因为没有直接的外键映射,而且一旦检索到用户,我应该将其存储在租户数据库中还是仅将其保存在内存中?

这可以。用户对您的所有实现都是通用的,但角色对于每个客户端实现都是唯一的。这表明您接近它的方式是正确的,因为您首先进行身份验证,然后在登录后将客户端的角色分配给用户。您应该根据本地数据库(显然)检查这一点,然后将其分配给用户的会话,以便它在他们访问期间一直存在。

如果企业主想要一份关于每个租户数据库特定内容的报告,那么从每个租户数据库中获取所有数据的最佳方法是什么?

这太宽泛了,无法回答。您在这里也应该小心,因为客户的数据可能不是您要报告的!

我们如何在超级管理员中捕获每个租户的数据库使用情况、文件存储和显示?

同样,相当广泛,但我假设您可以通过查询 MySQL 服务器以获取每个客户端数据库的数据库统计信息来实现类似的目的,并通过查询托管客户端文件的服务器对文件存储执行相同的操作。


我希望这对您有所帮助,如果您需要更具体的帮助,请进一步缩小您的问题范围。

于 2016-03-03T01:56:04.760 回答
0

小心“最佳方式”问题 - 这会使这个问题指向偏离主题的观点。

如果您的应用程序是完全封闭的源代码(我想它是),那么没关系。如果您愿意,您可以直接访问您的主数据库,因为您的所有客户端实现都将成为您整个软件包的一部分。

话虽如此,为了可扩展性和可维护性,构建身份验证 API 接口并使用它可能是一个更好的主意,因此您不需要管理客户端软件的数据库连接组件。

同意。看到问题是对于这类场景很难找到答案,尤其是在多租户上。

闭源是什么意思?

如果我可以使用身份验证 API 从主数据库中检索数据,我将如何以仅在应用程序内授予访问权限而外部各方无法访问它的方式托管它?稍后我们还需要将服务暴露给外部用户。在这种情况下,是从现在开始公开它还是稍后在单独的服务上工作更好?除了 NuSOAP,你还知道哪些最好的简洁的 PHP Web 服务库?

这可以。用户对您的所有实现都是通用的,但角色对于每个客户端实现都是唯一的。这表明您接近它的方式是正确的,因为您首先进行身份验证,然后在登录后将客户端的角色分配给用户。您应该根据本地数据库(显然)检查这一点,然后将其分配给用户的会话,以便它在他们访问期间一直存在。

那是对的!用户对所有实现都是通用的,它存储在主数据库中,而不是单个租户数据库中。我的意思是,每个租户应用程序中的角色,租户可以在租户应用程序中创建角色,例如计费单位、帐户、前台等。所以这些user_id和role_id是存放在租户的数据库中的。这就是我问的原因,因为如果可以,user_id 没有直接映射到主数据库的用户表。

这太宽泛了,无法回答。您在这里也应该小心,因为客户的数据可能不是您要报告的!

现在让我们假设超级管理员想知道每个租户的角色。在这种情况下,我将如何从所有租户数据库中检索数据?我们是否为此使用视图,或者因为我们使用的是 mysql,我该如何实现这一点?

同样,相当广泛,但我假设您可以通过查询 MySQL 服务器以获取每个客户端数据库的数据库统计信息来实现类似的目的,并通过查询托管客户端文件的服务器对文件存储执行相同的操作。

对此感到非常抱歉。我们基本上想跟踪租户数据库的使用情况,看看它们是否超过了我们商定的数量。这就是为什么。我希望有办法实现这一目标。

此外,对于站点图像,将其存储在硬盘上还是作为 BLOB 存储在数据库中更好?一天结束时,我们需要考虑可扩展性以及以更少带宽消耗加载图像的方式?

于 2016-03-03T08:21:30.477 回答