Rails网络应用:你是否为每个开设的账户创建一个单独的数据库?

时间:2011-09-02 21:25:58

标签: ruby-on-rails database account

我即将完成一个简单的基于订阅的支持票据Web应用程序。我正在设置授权。但是,由于这将是我将要部署的我自己的Web应用程序,我对此感到疑惑。

您是否为每个开设的帐户创建了一个单独的数据库?

假设您拥有此支持票据Web应用程序。您拥有一个且只有一个帐户所有者。帐户所有者可以设置可以响应支持服务单的代理。此外,还有客户角色可以打开支持服务单。

因此,您可以看到数据库将包含用户,支持票证等。

最好的方法是什么?

1)为整个应用程序创建一个数据库?这样,每当有人注册时,所有内容都会添加到同一个数据库中,其他票证和用户数据以及其他所有内容或...

2)每当有人注册时,每个帐户订阅都会创建一个单独的数据库。

我认为第2号选项可能是出于安全和数据完整性目的的最佳选择。如果是这样,你是如何处理这个问题的呢?

2 个答案:

答案 0 :(得分:6)

听起来你想要的是多租户:

  

多租户是指软件架构中的一个原则,其中a   该软件的单个实例在服务器上运行,服务多个   客户组织(租户)。多租户与a形成鲜明对比   多实例架构,其中包含单独的软件实例(或   为不同的客户组织设置硬件系统。同   多租户架构,软件应用程序旨在   虚拟地划分其数据和配置以及每个客户端   组织使用自定义的虚拟应用程序实例。    - Wikipedia article on Multitenancy

这篇文章虽然有点过时,但总体思路是如何去做。 Simple Rails Multi-Tenancy。它干净而高效,使您无需编写不需要的代码。

答案 1 :(得分:4)

你应该选择#1选项。 2号(几乎(有可能是好的情况,但目前我找不到))从来没有选择。

出于安全目的(从某种意义上说),你是正确的,但它也会产生许多其他问题,你必须要考虑这些问题。

  1. 为每个用户设置不同的数据库意味着对于每个请求(请记住,HTTP是无状态),您必须打开与数据库的新连接,执行任何需要完成的操作,然后关闭再次连接,而不是使用Rails中的连接池。这对性能影响很大。

  2. 管理将是您拥有的数据库越多的麻烦。此外,在服务器上拥有多个数据库确实需要的资源不仅仅是更大的数据库。

  3. 您必须绕过Rails中的整个连接处理,因为每个应用程序通常只有一个数据库。可以很容易地为特定模型更改数据库,但它会添加其他可能出错的地方。

  4. Rails确实具有良好的功能,可以在同一个数据库中分离和处理分离数据,只是针对您提到的那种用例。