1

编辑:在整个帖子中澄清:当我说“模式”时,我指的是“数据模型”,这是我脑海中的同义词。:)

我的问题与这个问题( Rails: Multiple databases, same schema )非常相似,但我的问题与 MySQL 有关。

重申这个问题:我正在开发一个SAAS。用户将获得在启动时连接到哪个数据库的选项。大多数客户将获得两个数据库:一个生产数据库和一个测试数据库,这意味着我的每个客户将拥有 1-2 个数据库。所以,如果我有 10 个客户,我将有大约 20 个数据库需要维护。每当需要更新程序(和数据模型)时,这都会很困难。

我的问题是:有没有办法为多个数据库提供一个数据模型?我上面发布的问题的公认答案是将所有内容组合到一个数据库中并使用 company_id 来分离数据,但这有几个可预见的问题:

  1. 当这些基于事务的表被淹没时会发生什么?我的 1 位客户现在在过去一个月中已经记录了 16k 笔交易。
  2. 我必须添加where company_id =数百个 SQL 查询/更新/插入(是的,Jeff Atwood,它们是参数化 SQL 调用),这将对性能产生严重影响,我只能假设。
  3. 一些表存储元数据,即下拉菜单项,在某些情况下是公司特定的,而在其他情况下是应用程序通用的。where company_id =会增加一层不幸的复杂性。

对我来说,为每个新客户创建(一个)新数据库并将他们的软件客户端指向他们的数据库似乎是合乎逻辑的。但是,这将是一个令人头疼的维护,所以我希望减少这种潜在的头痛。

4

2 回答 2

1
  1. MySQL 中的“数据库”被所有其他数据库供应商称为“模式”。MySQL 中没有单独的数据库,只有模式。

    仅供参考:(真实)数据库之间不能有外键,而模式可以。

  2. 您的测试和生产数据库绝对不应该在同一台机器上。

  3. 使用 Tenant Per Schema,这样您就不会在每个表中都有 company_ids。

  4. 您的数据库模式应该由您的 ORM 生成,或者它应该在 sql 文件中的源代码控制中,并且您应该有一个自动构建/修补数据库的脚本。更改此脚本以便为每个租户构建一个架构是微不足道的。

于 2013-08-05T20:35:48.817 回答
1

创建用于更改数据库模式的部署脚本,保留所有客户的内部数据库并保持更新,将其写入脚本以从中提取连接字符串。

如果您的软件包起飞,这比尝试为所有客户维护一个数据库要好得多。

仅供参考:我目前在一个拥有约 4000 个客户端的组织中,所有客户端都运行相同数据库的不同实例(非常相似,取决于它们所在的补丁版本等),运行相同的软件包。许多客户每秒处理超过 20-25k 的事务。

于 2013-08-05T18:27:38.953 回答