多个MySQL数据库都使用相同的模式

时间:2013-08-05 16:52:21

标签: mysql data-modeling

编辑:在整篇文章中澄清:当我说“架构”时,我指的是“数据模型”,这是我头脑中的同义词。 :)

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

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

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

  1. 当这些基于事务的表被淹没时会发生什么?我的1位客户现在已经记录了过去一个月的16k交易。
  2. 我必须将where company_id =添加到数百个SQL查询/更新/插入(yes, Jeff Atwood, they're Parametrized SQL calls)中,这会对我只能假设的性能产生严重影响。
  3. 某些表存储元数据,即在某些情况下属于公司特定的下拉菜单项,而在其他情况下则是应用程序通用的。 where company_id =会增加一个不幸的复杂层。
  4. 对我来说,为每个新客户创建(a)新数据库并将其软件客户端指向他们的数据库似乎是合乎逻辑的。但是,这将是一个令人头痛的问题,所以我希望减少这种潜在的头痛。

2 个答案:

答案 0 :(得分:1)

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

如果您的软件包起飞,那么比为所有客户维护单个数据库更好。

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

答案 1 :(得分:1)

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

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

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

  3. 使用Tenant Per Schema,这样每个表中都没有company_ids。

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