【问题标题】:Many Table Vs Many Dbs for a multi-site application多站点应用程序的多表与多数据库
【发布时间】:2014-03-21 17:56:14
【问题描述】:

我正在建立一个网站,不同的公司可以使用 Rails 或 Drupal 创建子网站。当每个用户创建一个帐户时,他或她立即获得完全独立的应用程序。

但是,对于 db,我有 2 个选择。我可以将所有内容放在一个数据库中,并使用前缀来命名表。例如,client1user 表将是client1_user,下一个将是client2_user 等等。

但我不知道,基于我应该做出的决定。它依赖于语言吗?还是技术? MyDb 可能是 MariaDb 或 MySql。

【问题讨论】:

标签: mysql ruby-on-rails database scalability mariadb


【解决方案1】:

正如 cmets 中所建议的,您需要的概念称为多租户。这通常不是通过为每个新租户创建新表来完成的,您宁愿拥有一个包含所有租户信息的表,然后在包含附加到租户的对象的其他表中引用租户 ID。

让见面给你举个例子来说明一下:

假设您要构建一个在线商店应用程序。您将创建一个包含所有商家的表。每个商家都可以用一个单独的子域来标识。还有其他表,例如订单和产品。这些表不是为每个商家创建新的订单/产品表,而是存储所有商家的订单和产品,但通过商家 ID 引用他们所属的商家。使用 Rails 关联,这可以很容易地在代码中完成。

在商家类中,您可以定义与产品的关系,例如 has_many :products,dependent: :destroy

在产品类中,您将添加 属于_to :商家

Rails 会检查产品表是否有一个 Mercer_id 列,然后您就可以开始了。

在控制器站点上,您必须确保每个商家只能看到自己的产品,但加载的产品就像 @merchant.products 而不是只显示所有这些。

这就是通常在 Rails 应用程序中实现多租户的方式。尽管数据在数据库级别组合在同一个表中,但 Rails 的模型层和控制器层负责分离数据并只允许访问附加到登录帐户的数据。无需为每个租户创建新表,这将导致大量开销。

你使用什么样的数据库,不管是 Postgres,MySQL 都不是很重要,因为无论如何做这些事情是 SQL 的核心。

【讨论】:

  • 为什么你认为为每个租户单独的数据库“通常不会完成”?
  • 我指的是 Rails 社区,这种模式不是很常见,而且我认为它比单表方法更复杂,所以需要有一个强有力的论据来支持它无论如何。
  • 你一直说table,但esafwan 说的是单独的databases。在一个重要的多租户架构中,每个租户都有自己的数据库是很常见的。这使得将租户移动到另一台服务器、在不同时间/间隔备份租户、恢复单个租户等变得更加容易。
  • 我应该指出,每个数据库通常都有相同的表结构。
  • 这肯定是一个可能且有效的概念。但是它不会与 Rails/ActiveRecord 配合得很好,另请参阅:stackoverflow.com/questions/5858946/…。如果你想这样做,为什么你可能会使用其他框架。
猜你喜欢
  • 1970-01-01
  • 2021-04-05
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多