同一数据库中的多家公司

时间:2013-05-22 22:34:52

标签: database database-design architecture multi-tenant

我正在开发一个系统,该系统认为每个“公司”都有自己的“用户”和他们自己的“账单”,我怀疑是因为知道场景在性能和管理方面更好。处理同一数据库中的所有公司并将所有内容链接到idempresa? o每个客户的数据库?。

我想知道你对此的看法,非常感谢

4 个答案:

答案 0 :(得分:8)

这称为多租户架构,每个客户都是租户。有各种策略来处理它,每一个都可能带来潜在的问题。

为每个租户提供一个单独的数据库是一个提供数据分离的选项,不需要添加列来标识表和查询中的每个租户,但也有缺点使多个数据库保持最新。< / p>

在单个数据库的每个表中都有一个列来标识您的租户也是一个很好的策略,但是在为不同客户扩展和管理不同功能时会带来问题。

您需要研究所有可用的策略,并根据您的要求和难点决定哪一个最佳。

答案 1 :(得分:3)

将租户数据放在单独的数据库中是一种直接的方法,而且不那么痛苦,但从长远来看,当您的产品取得巨大成功时,维护此数据库将成为一场噩梦。

另一方面,将所有租户数据保存在单个数据库中也可能使您的应用程序不可扩展且性能较差。更好的方法是两者的结合,在这两者之间做出选择的决定完全基于客户的类型,用途和规模。

在某些情况下,您可能需要为应用程序的特定模块或功能部署单独的数据库,以确保安全性或单独隔离特定数据。我写了一篇关于这些方面的文章;请看http://blog.techcello.com/2012/07/database-sharding-scaling-data-in-a-multi-tenant-environment/

答案 2 :(得分:0)

我认为可以通过预先适当的规划来解决单个数据库中多租户的扩展问题。计划轻松地将租户及其数据迁移到另一个足以证明其合理性的数据库。

如果您可以根据租户ID在每个表中自动执行此迁移,则它应该简单安全。我会确保在开发新功能时经常进行测试。

您可以减轻一个数据库上多租户的风险。当有多个数据库时,您实际上不能做太多事情。您只能勤勉守纪,以确保所有数据库保持同步。

祝你好运!

答案 3 :(得分:0)

这是一个古老的话题,但是对于有这个问题的其他人来说值得一提,将来他们可能会遇到此帖子。

过去,我通过使用PostgreSQL并将全局表置于“公共”模式(例如用户,组等)中,并在每个租户各自独立的同一组表中取得了巨大的成功模式。

例如:

对于添加到系统中的每个租户,将使用应用程序的标准表集创建一个新模式:

CREATE SCHEMA tenant1;
CREATE TABLE tenant1.products (...);
CREATE TABLE tenant1.orders (...);
etc.

每个租户的模式在数据库中都有自己的隔离部分,具有与其他租户相同的表集,但表中填充了自己的数据。

在默认的“公共”模式中,您将具有全局的“用户”和“租户”表(以及用于组和访问控制列表之类的表)。每个用户仅属于一个租户。登录后,将查找该用户的租户,并且从该点开始,无论何时连接到数据库,都将其设置为使用该租户的模式:

SET search_path TO tenant1, public;

一旦设置了模式search_path,就可以编写所有SQL查询,就好像您正在使用具有名为“ products”,“ orders”等(以及“ public”中的表)的单个数据库一样”)。因此,您只需使用“ SELECT * FROM products”之类的东西,它将获得属于该用户租户的产品。