如何在应用程序中处理多个用户数据?

时间:2016-01-22 16:25:56

标签: ruby-on-rails ruby

如何处理寻求成为软件即服务的应用程序的实例?我想制作一个可以处理医生病人的应用程序,患者可以轻松查询。

我的问题是如何与客户处理不同的医生,以便将来可以扩展应用程序,并且医生的客户不会与数据库中的其他医生客户混在一起。

有没有办法将应用程序的实例分开处理,医生可以使用单独的数据库进行处理?

我可以用ruby on rails实现这个目标吗?

这样做最好的方法是什么?我不知道,我觉得在这个问题上有点迷失。

干杯

2 个答案:

答案 0 :(得分:1)

第一步不用担心。合理的数据库配置允许您在需要考虑分片数据或应用程序之前使用包含数百万行的表。在你达到这一点之前,你会遇到许多限制你规模的瓶颈。首先花时间和精力(并与实际用户一起构建产品),避免过早优化以解决您没有的性能问题。

一旦你确实需要考虑分片,你绝对有Rails应用程序的选项(https://blog.engineyard.com/2009/a-quick-primer-on-sharding-for-ruby-on-rails是一个很好的介绍)。在设计应用程序和数据模式时记住分片也会有所帮助。留意可能会阻止您将用户群及其数据彼此隔离的依赖关系。当您确实拥有共享依赖关系时,寻找机会来提取可以独立于系统其他部分扩展的服务。

在数据库级别,我认为https://github.com/thiagopradi/octopus是分割Active Record模型的最常用方法之一,但肯定不是Rails应用程序的唯一选项。

答案 1 :(得分:0)

由于您的问题非常广泛,我将不得不相应地回答。

-

您要问的是"multi tenancy"

  

软件多租户是指一种软件体系结构,其中单个软件实例在服务器上运行并为多个租户提供服务。租户是一组用户,他们共享具有软件实例特定权限的公共访问权限。

这绝对是开发团队的领域;你需要几个组件来使它正常工作,而Rails并没有真正配备。

话虽如此,有一种流行的方法可以通过Apartment& PGSQL schemas

-

真正的多租户应该有独立的计算配置,拥有自己的资源和数据池; Rails只能在一台服务器上运行 - 没有大规模黑客攻击 - 只能运行一个数据库。

如果您想创建一个单独处理医生的系统,您需要查看确定您的数据。这就是PGSQL模式的作用:

#config/routes.rb
scope constraints: SubDomain do
   resources :patients
end

#lib/sub_domain.rb
module SubDomain
    def initializer(router)
        @router = router
    end

    def self.matches?(request)
        Doctor.exists? request.subdomain
    end
end

上面给出了subdomains(最基本的范围界定),这将允许您使用以下内容:

#app/models/doctor.rb
class Doctor < ActiveRecord::Base
   has_many :patients
end

#app/models/patient.rb
class Patient < ActiveRecord::Base
   belongs_to :doctor
end

#app/controllers/patients_controller.rb
class PatientsController < ApplicationController
   before_action :set_doctor

   def index
      @patients = @doctor.patients
   end

   def show
      @patient = @doctor.patients.find params[:id]
   end

   private

   def set_doctor
      @doctor = Doctor.find request.subdomain
   end
end 

以上将允许您访问http://1.doctor.com/patients以查看该医生的所有患者

#app/views/patients/index.html.erb
<% @patients.each do |patient| %>
   <%= patient.name %>
<% end %>

-

当然,以上是一个基本的例子,没有数据库或应用程序级别的安全性来维护data integrity

多租户(使用Rails)的主要挑战是尽可能创建防水系统。