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