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

多个MySQL数据库都使用相同的模式,mysql,data-modeling,Mysql,Data Modeling,编辑:通篇澄清:当我说“模式”时,我指的是“数据模型”,这在我的脑海中是同义词 我的问题与这个问题()非常相似,但我的问题与MySQL有关 重申这个问题:我正在开发一个新的。用户将获得一个选项,在启动时连接到哪个数据库。大多数客户将获得两个数据库:一个生产数据库和一个测试数据库,这意味着我的每个客户都将拥有1-2个数据库。因此,如果我有10个客户端,我将有大约20个数据库需要维护。每当程序(和数据模型)需要更新时,这将很困难 我的问题是:有没有一种方法可以为多个数据库提供一个数据模型?对于我上面

编辑:通篇澄清:当我说“模式”时,我指的是“数据模型”,这在我的脑海中是同义词

我的问题与这个问题()非常相似,但我的问题与MySQL有关

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

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

  • 当这些基于事务的表被淹没时会发生什么?我的1号客户在过去一个月已经记录了1.6万笔交易
  • 我必须将
    where company\u id=
    添加到数百个SQL查询/更新/插入(),这将对性能产生严重影响,我只能假设
  • 有些表存储元数据,即下拉菜单项,在某些情况下是公司特有的,在其他情况下是应用程序通用的<代码>公司id=将增加一层不幸的复杂性

  • 在我看来,为每个新客户创建一个新的数据库并将他们的软件客户端指向他们的数据库是合乎逻辑的。但是,这将是一个需要维护的难题,因此我希望减少这一潜在的难题。

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

    如果您的软件包启动,那么这比为所有客户维护单一数据库要好得多

    仅供参考:我目前所在的公司拥有约4000个客户端,所有客户端都运行同一数据库的独立实例(非常相似,取决于它们所在的修补程序版本等),运行相同的软件包。很多客户每秒的交易量都在20-25k之间

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

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

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

  • 使用每个模式的租户,这样您就不会在每个表中都有公司ID

  • 您的数据库模式应该由ORM生成,或者应该在sql文件的源代码管理中,并且您应该有一个自动构建/修补数据库的脚本。更改此脚本以便为每个租户构建一个模式是很简单的


  • 每秒2.5万笔交易?是的,这正是我现在的做法。如果你能详细说明你是如何做到的,那就太棒了,我们很多人都在为这个想法而挣扎;主要(我认为)是因为mysql不支持postgreSQL的“创建类似数据库的数据库”语句。谢谢。是的,我忘记了本地语言和DMBS vocab中
    数据库
    模式
    之间的区别。为了澄清,当我说“模式”时,我实际上指的是“数据模型”。我想我将编辑这篇文章来澄清这一点。在我看来,“schema”接近于“schema”,所以我认为“schema”=“数据模型”?为什么不在同一台机器上进行测试和生产?生产和备份,我理解。但是为什么测试数据库不能位于生产数据库的旁边呢#是的,那正是我的想法#4,是的,目前我只保留了一个“to-do.sql”文件,我在DB上测试它,然后在部署新版本之前在prod/test DBs上执行它。我只是觉得可能有一种更简单的方法。在测试数据库上运行测试的人可能会导致整个服务器停机。或者他们可能想对数据库进行压力测试,这会使它对其他人不可用。在这种情况下,“测试”有点用词不当。“测试”数据库用于客户测试程序的功能,用于培训等目的。也就是说,我当前的客户喜欢在实时生产数据库上创建许多实体,并将其标记为“测试垃圾”。我不鼓励这种行为,而是支持在测试数据库上执行此类操作,该数据库定期擦除并加载实时数据。与开发相关的压力测试将在一个单独的“dev test”数据库上进行,是的,在另一台服务器上进行。:)这就是为什么每个客户机需要两个数据库。一个实时数据库和“测试”数据库,所以他们不会在实时数据上做任何“测试垃圾”的把戏。