多租户DB是否具有多个数据库或共享表?


24

是一个多租户数据库:

  • 一个DB服务器对每个客户/租户有不同的(相同的)数据库/架构?要么
  • 具有数据库/架构的DB服务器,客户/租户在其中共享同一表内的记录?

例如,在上面的选项1下,我可能在处有一个MySQL服务器mydb01.example.com,并且其中可能有一个customer1数据库。该customer1数据库可能有10个表,这些表可以为该特定客户(客户1)提供我的应用程序。它也可能有一个customer2数据库,其中有完全相同的10个表,但是只包含Customer#2的数据。它可能有一个customer3数据库,一个customer4数据库等等。

在上面的选项2中,将只有一个数据库/架构,例如myapp_db,又有10个表(与上面的表相同)。但是在这里,所有客户的数据都存在于这10个表中,因此他们“共享”了这些表。在应用程序层,逻辑和安全性控制着哪些客户可以访问这10个表中的哪些记录,并格外小心以确保客户#1永远不会登录到应用程序并看到客户#3的数据,等等。

这些范例中的哪一个构成了传统的“多租户” DB?如果两者都不是,那么有人可以提供一个多租户数据库示例吗(使用上述场景)?


“多租户”意味着强大的安全性-在某处实现-这样一个租户就看不到其他人的数据,无法对其进行修改,无法拒绝对其进行访问等。这种安全性必须以某种方式实现。OP的选项#1和#2都可以工作,但是安全性分析和实现安全性所需的工作是不同的。值得一提的是,我在一家通过选项#2实现多租户的初创公司工作,该表中的表-属于多个租户的行-被所有最终用户隐藏(通过权限),并且安全性完全在存储过程中实现。
davidbak


1
如果最终以重复形式关闭,我认为我们应该标记为将其与欺骗对象合并,因为这两个问题都有一些非常好的答案。

Answers:


29

这些范例中的哪一个构成了传统的“多租户” DB

这两个概念都称为多租户,因为它只是一个逻辑概念,“在单个服务器上运行一个软件实例并为多个租户提供服务”(来自Wikipedia)。但是如何“物理地”实现这个概念取决于您。

当然,该应用程序需要一个数据库概念,该概念允许分隔不同租户的数据,而多租户的想法是共享一些服务器资源(至少是硬件),以更好地利用资源并简化管理。因此,“多租户数据库”是直接支持此功能的数据库,其中一部分数据库模型或表是共享的。

确切地说,可以使用非多租户数据库构建多租户应用程序,从而为每个客户端提供一个单独的数据库实例。但是,这排除了在租户之间直接共享任何数据库资源的可能性,并且应用程序层必须确保将正确的租户连接到正确的数据库。


感谢@Doc Brown(+1),但是,您怎么可能拥有一个不是多租户的数据库?
smeeb '17

4
@smeeb:多租户是不同租户使用的应用程序的属性,而不是应用程序“背后”的数据库的属性。当然,数据库概念需要支持多租户才能实现这一点。
布朗

4
@smeeb:好吧,假设您有一个User表,并且用户名是唯一的,现在,某个租户的雇员不能再使用用户名了,因为另一个在另一个租户中工作的人已经在使用它了。
RemcoGerlich

5
@smeeb:如果为两个租户提供服务的唯一方法是在两个不同的服务器上使用两个单独的数据库在两个不同的服务器上安装和运行一次应用程序两次,我想一个人就不会称之为多租户。
布朗

1
不久前,我参加了一次有关Azure的演示,当时我说MYOB在Azure上运行他们的云解决方案,并且每个租户都拥有自己的数据库(大概还有Web服务器)。他们只是拥有一些出色的自动化工具来管理数百个必需的数据库实例。另一方面,我目前工作的组织在一个数据库中运行了数百个客户,因此该软件中执行了相当多的工作来强制隔离客户数据。我们还考虑了混合模式,最大的客户将拥有自己的数据库,而其他客户则共享原始数据库。
David Keaveny

36

根据Microsoft的说法,该术语具有3个潜在含义(所有租户都有一个数据库,每个租户有一个数据库管理员)。

以您的示例为例,每个客户都是它自己的租户。

  1. 每个租户(客户)的数据库

    • 每个租户都是彼此隔离的(不会意外访问其他租户的数据)
    • 隔离还使管理数据还原以及根据租户需求定制存储需求变得更加容易。
  2. 共享数据库,独立的架构。

    • 每个租户都有自己的架构,其数据位于各自的表中。
    • 还原可能会更加耗时,因为每个人都在同一个数据库中,所以您不能仅将数据库还原到较早的备份(它将回滚每个租户的数据)。一种选择是还原到新数据库,然后仅合并/复制1个租户的数据。
  3. 共享数据库,共享架构。

    • 每个租户的数据都在同一表中。例如,如果您跟踪订单,则每个租户的订单都将位于“ dbo.Orders”中。
    • 租户的数据由每个表中的一列分隔(可以是TenantId),该列显示该行的所有者。

每种都有优点和缺点,在本文中有很好的解释:https : //msdn.microsoft.com/zh-cn/library/aa479086.aspx

奖励:您可以将其视为居住区(已大大简化)。

  1. 每个房客都有自己的房子。他们可以做他们想做的任何事情,而且如果它烧毁了,它并不会真正影响其他任何人。

  2. 每个租户都在同一栋大楼中,但是拥有自己的公寓。

  3. 每个人都住在同一个公寓里,所有东西都用便签标记,以显示谁拥有它。


2
谢谢您的回答。您能否详细说明一下答案。那会创造一个更好的答案。
Thomas Junk

1
您的奖金示例很棒@ imms90
Aravin

3
Microsoft已删除您从MSDN链接的页面。该Wayback机器仍然有一个副本。
Mike Sherrill'Cat Recall'17

1
从MS类似文章(也许同样已移动):docs.microsoft.com/en-us/azure/sql-database/...
皮埃尔·亨利·
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.