【问题标题】:Multiple application instances on the same database同一数据库上的多个应用程序实例
【发布时间】:2011-10-30 22:30:39
【问题描述】:

我正在编写一个应用程序,我将其作为服务和独立应用程序提供。 它是用 Zend Framework 编写并使用 MySQL。

在将其作为服务提供时,我希望用户在我的网站上注册并拥有 customer1.mysite.com、customer2.mysite.com 等子域。

我希望将所有内容都放在一个数据库中,而不是为每个用户创建新数据库。

但现在我想知道如何做得更好。 我想出了两个解决方案: 1. 在每个表中都有用户 ID,只需将其添加到每个数据库请求的 WHERE 子句中。 2. 重新创建具有唯一前缀的表,例如“customer1_tablename”、“customer2_tablename”。

哪种方法更好?优点和缺点? 是否有其他方法可以将同一数据库中的用户分开?

莱昂蒂

【问题讨论】:

  • 非常有趣的问题!我正在做一个类似的项目,我对这里的意见非常好奇! @莱昂蒂;您是在租用服务器并为每个用户提供自己的托管环境吗?还是您只是根据客户 ID 或其他任何方式将所有文件存储在一个目录中?您如何看待每个客户的电子邮件地址?
  • 我要做的只是一个在主机和动态子域上使用 mod_rewrite 的应用程序。因此,当用户访问 customer1.mysite.com 时,应用程序会在数据库中查找 customer1 的 ID,然后采取相应措施。这样,当我更新应用程序时,它会同时为所有用户更新。我的申请中不需要电子邮件地址,所以我没有考虑过。

标签: php mysql zend-framework multi-tenant


【解决方案1】:

我会坚持将所有表放在一起,否则使用单个数据库几乎没有任何意义。这也意味着您可以切实可行地允许某种跨站点交互。只要确保将索引放在区分字段(customer_number 或其他)上,就可以了。

如果表变得非常大而且速度很慢,请查看table partitioning

【讨论】:

  • 如果你选择MyISAM,注意它有表级锁。例如。一个客户端正在对他们的表行进行更新,所有其他客户端都必须等到它完成。 InnoDB 没有这个问题。
  • 我想这就是我要做的。由于我的应用程序将不断发展,因此很难为每个客户更改所有表。
  • Piskvor,谢谢你的来信——不知道。它为我在未来节省了很多头发:)
【解决方案2】:

这取决于您打算如何处理数据。如果客户不共享数据,按客户细分可能会更好;此外,您可能会获得更好的性能。

另一方面,当您想要更改结构时,拥有许多具有相同结构的表可能是一场噩梦。

【讨论】:

    【解决方案3】:

    我建议为每个用户使用单独的数据库。这使您的应用程序更易于编写代码,并使 MySQL 维护(单个帐户的迁移、帐户删除等)。

    此规则的唯一例外是您需要跨帐户访问数据或共享数据。

    【讨论】:

      【解决方案4】:

      这称为多租户应用程序,很多人运行它们;见

      multi tenant tag

      对于一些其他人的问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-01
        相关资源
        最近更新 更多