我正在开发一个系统,每个“公司”都有自己的“用户”和自己的“账单”。那个场景在性能和管理上更好?处理同一数据库中的所有公司并将所有内容链接到一个 idempresa 或每个客户的数据库?
4 回答
这称为多租户架构,每个客户都是租户。有多种策略来处理它,每种策略都可能带来潜在的问题。
为每个租户拥有一个单独的数据库是一种提供数据分离的选项,并且不需要您添加一列来标识表和查询中的每个租户,但也有一个缺点是要使多个数据库保持最新。
在单个数据库的每个表中都有一个列来标识您的租户也是一个很好的策略,但是当为不同的客户扩展和管理不同的功能时,它会带来问题。
您需要研究所有可用的策略,并根据您的要求和痛点决定哪一个是最好的。
将租户数据放在单独的数据库中是一种直接的方法,而且痛苦较少,但从长远来看,当您的产品取得巨大成功时,维护该数据库将成为一场噩梦。
另一方面,将所有租户数据保存在单个数据库中也可能使您的应用程序不可扩展且性能较差。更好的方法是两者的结合,在这两者之间做出选择的决定完全取决于客户的类型、用途和规模。
在某些情况下,您可能需要为应用程序的特定模块或功能提供单独的数据库,这可能是为了安全或单独隔离特定数据。我在这些方面写了一篇文章;请看看http://blog.techcello.com/2012/07/database-sharding-scaling-data-in-a-multi-tenant-environment/
我认为可以通过预先进行适当的规划来克服单个数据库中多租户的扩展问题。计划使租户及其数据迁移到另一个数据库变得容易,只要他们变得足够大以证明它是合理的。
如果您可以根据租户 ID 在每个表中自动执行此迁移,那么它应该既简单又安全。我只是确保我经常测试它,因为新功能的开发正在进行中。
您可以降低一个数据库上的多租户风险。当有多个数据库时,您实际上无法做太多事情。您只能勤奋和自律,以确保所有数据库保持同步。
祝你好运!!!
这是一个旧线程,但对于将来可能会遇到此帖子的其他有此问题的人来说,这是值得一提的。
过去,我通过使用 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”之类的东西,它会获得属于该用户租户的产品。