【发布时间】:2009-09-15 15:58:21
【问题描述】:
我们的应用目前为每个客户生成一个新数据库。我们开始怀疑是否应该考虑将其重构为多租户系统。
我们应该考虑哪些好处/权衡?在 Rails 中实现多租户应用的最佳实践是什么?
【问题讨论】:
标签: ruby-on-rails web-applications
我们的应用目前为每个客户生成一个新数据库。我们开始怀疑是否应该考虑将其重构为多租户系统。
我们应该考虑哪些好处/权衡?在 Rails 中实现多租户应用的最佳实践是什么?
【问题讨论】:
标签: ruby-on-rails web-applications
我一直在研究同样的事情,只是发现这个演示文稿提供了一个有趣的解决方案:使用 Postgre 的模式(有点像命名空间)在数据库级别分离数据,同时将所有租户保持在同一个数据库中并保持(主要是) 对轨道透明。
【讨论】:
多租户系统将为您带来一系列问题。我的快速想法如下
必须检查所有 SQL 并 重构为包含一个 ClientId 价值。
必须检查所有索引以 确定 ClientId 是否需要 包括
SQL 语句中的错误 生产中的开发人员/系统管理员将 影响您的所有客户。
数据库损坏/问题将 影响您的所有客户
您有一些数据隐私问题 由此糟糕的代码/实现可能 允许客户A查看属于的数据 给客户B
一位使用您的系统的客户 沉重/激进的方式可能会影响 其他客户对性能的看法
根据个人客户偏好定制静态数据变得更加复杂。
我确信还有许多其他问题,但这些是我最初的想法。
【讨论】:
这真的取决于你在做什么。
我们正在为印刷行业制定一个 MIS 程序,用于跟踪库存、员工、客户、设备,并进行一些认真的计算,以根据大量输入变量估算执行工作的成本。
我们预计每个客户都有非常大的数据库,目前我们有 170 个表。为几乎每个表添加另一列只是为了存储 client_id 伤害了我的大脑。
我们目前处于计划的测试阶段,以下是我们遇到的一些情况:
如果您对此有任何具体问题,我可以提供帮助。
【讨论】:
我个人对此没有任何经验,但在 2009 年 Ruby Hoedown 的闪电演讲中,Andrew Coleman 展示了他设计并用于带有子域的 rails 中的多租户数据库的插件。你可以check out the lightning talk slides,这里是acts_as_restricted_subdomain repository。
【讨论】:
你为什么要这样做?您是否在用户之间进行了大量聚合,或者您是否产生了太多的数据库?您是否考虑过为每个租户使用 SQLite 文件而不是共享数据库服务器(因为多租户应用程序通常是低配置的,不需要那么多并发性)?
【讨论】: