Ruby on rails 多租户rails应用程序:不同技术的优缺点是什么?

Ruby on rails 多租户rails应用程序:不同技术的优缺点是什么?,ruby-on-rails,ruby-on-rails-3,database-design,postgresql,multi-tenant,Ruby On Rails,Ruby On Rails 3,Database Design,Postgresql,Multi Tenant,我最初是为一个客户机编写RubyonRails应用程序的。现在,我正在更改它,以便它可以用于不同的客户端。我的最终目标是,一些用户(不是我)可以单击一个按钮并创建一个新项目。然后生成所有必要的更改(新模式、新表、代码处理),而无需我编辑database.yml文件或添加新模式定义。我目前正在使用作用域访问。所以我有一个项目模型,其他相关模型有一个项目id列 我看过其他关于Rails中多租户应用程序的帖子。许多人似乎建议为Postgres中的每个新客户创建不同的模式。然而,对我来说,对于一个新客户

我最初是为一个客户机编写RubyonRails应用程序的。现在,我正在更改它,以便它可以用于不同的客户端。我的最终目标是,一些用户(不是我)可以单击一个按钮并创建一个新项目。然后生成所有必要的更改(新模式、新表、代码处理),而无需我编辑database.yml文件或添加新模式定义。我目前正在使用作用域访问。所以我有一个项目模型,其他相关模型有一个项目id列

我看过其他关于Rails中多租户应用程序的帖子。许多人似乎建议为Postgres中的每个新客户创建不同的模式。然而,对我来说,对于一个新客户机来说,在数据模型方面使用不同的模式并没有多大用处。每个客户机都有相同的表、行、列等

我对每个客户的设想是,我的生产数据库首先有一个包含不同项目/客户的表。这些表中的每一个都链接到一组数据几乎相同的表。换句话说,就是一张桌子的桌子。或者换句话说,对于具有相同结构的每个客户机,第一个表将映射到不同的数据集

我解释我的愿景的方式是否与Postgres实现不同“模式”的方式类似?它看起来像嵌套表吗?还是Postgres必须查询数据库中的所有信息?我目前不使用Postgres,但我愿意了解它是否符合设计。如果你知道的数据库软件,与Rails,适合我的需要,请让我知道

现在,我正在使用作用域来实现多租户应用程序,但它感觉不到可伸缩性或干净性。不过,如果我给非技术用户提供可填写的信息,那么他们就可以很容易地创建一个新项目。您知道多模式Postgres定义是否可以在用户单击按钮后自动工作?如果可能的话,我更希望由Rails而不是外部脚本来处理这个问题?(请务必向任何一方提出建议)

最重要的是,您是否推荐任何插件,或者我是否应该采用不同的框架来完成此任务?我发现Rails在上述一些抽象情况下受到限制,这是我第一次遇到Rails伸缩问题

欢迎提供有关多租户应用程序或我的情况的任何建议。欢迎提出任何澄清问题或其他建议

谢谢,
--Dave

别忘了使用默认作用域,在以现在的方式创建命名作用域时,确实感觉可以做得更好。几个月前,我遇到了Samuel Kadolph关于这个问题的问题,看起来它可以很好地适应您的情况,并且有助于使您的应用程序不具有某些仅PgSQL的功能

基本上,他描述的设置应用程序的方式包括将Tennant的概念添加到应用程序中,然后使用它在查询时使用数据库来确定数据的范围。

MSDN有一个很好的方法

在范围的一端,每个租户有一个数据库(“不共享”)。“不共享”使灾难恢复变得非常简单,租户之间的隔离程度最高。但它的每个租户的平均成本也最高,并且支持每个服务器最少的租户

在频谱的另一端,在每个共享表的每一行中存储租户id号(“共享所有内容”)。“共享所有内容”使灾难恢复变得困难--对于单个租户,您只需恢复每个共享表中的一些行--并且它的隔离度最低。(格式错误的查询可能会暴露私有数据。)但它的每个租户成本最低,并且支持每个服务器最多的租户数量

我对每个客户的设想是,我的生产数据库首先有一个 不同项目/客户的表格。每一张桌子 指向一组表的链接,这些表在不同的情况下几乎相同 数据。换句话说,就是一张桌子的桌子。或者换句话说,第一个 表将映射到具有 同样的结构


这听起来像是说每个租户有一个模式。请密切注意权限(SQL和statements.and.)

在多租户上有两个RailsCast,它们使用另一个来帮助处理

还有一种方法可以帮助处理范围和多个模式


这里还有一个很好的演示。

非常干净!这将使代码更简单。但是,您知道这会如何影响性能吗。它是否对每个租户的每个表中的数据进行分区?或者它是按主键存储和组织的,并且需要一个完整的迭代来获取特定租户的数据吗?tennant应该是主键,因为它与任何Rails关系一样。这将和SQL或您使用的任何数据库中的任何其他索引主键查找一样慢。谢谢。这本指南真的很有帮助。单独的模式选项对我很有吸引力。你知道这在rails中是否有任何支持,或者我基本上会违背规则吗?如果你搜索这个页面,你会发现有一些模式支持。我已经做了几十年了;我倾向于对任何有文件证明的支持持悲观态度。(还记得MySQL对外键约束的“支持”吗?它通过解析它们来支持FK约束,然后忽略它们。)如果我是你,我会设计一个一个或两个表设计并测试它。