멀티 테넌트 앱을 처리하는 데는 여러 가지 옵션이 있습니다.
먼저 차트에 범위를 추가 할 수 있습니다 (Chad Birch가 제안한 것처럼 company_id 사용). 대부분의 유스 케이스에서 이것은 괜찮습니다. 보안 정보/개인 정보 (예 : 회계 정보)를 처리하는 경우 데이터를 비공개로 유지하기 위해 테스트에 매우주의해야합니다.
여러 데이터베이스를 사용하여 시스템을 실행할 수 있습니다. 각 클라이언트에 대해 데이터베이스를 사용하는 단일 앱을 보유하거나 실제로 각 클라이언트에 대해 별도의 앱을 보유 할 수 있습니다. 각 클라이언트에 대한 데이터베이스를 실행하면 레일에있는 그레인에 대해 약간의 문제는 없지만 수행 할 수 있습니다. 보유한 클라이언트의 수와 기대치에 따라 개별 앱을 실행하는 것이 좋습니다. 배포 설정 (카피 스트라 노, 요리사, 인형 등)에 대한 일부 작업을 통해이 과정을 매우 간소화 할 수 있습니다. 각 클라이언트는 완전히 고유 한 환경에서 실행되며, 특정 클라이언트의로드가 크면 자체 서버로 스핀 할 수 있습니다.
PostgreSQL을 사용하는 경우 스키마를 사용하여 비슷한 작업을 수행 할 수 있습니다. PostgresQL schemas은 다른 클라이언트의 데이터를 islolating하는 매우 편리한 방법을 제공합니다. 데이터베이스는 하나 이상의 명명 된 스키마를 포함하며, 차례로 테이블을 포함합니다. 마이그레이션과 배포에 약간의 지능을 추가해야하지만 실제로 잘 작동합니다.
Rails 애플리케이션에서 현재 사용자의 스키마를 켜거나 끄는 요청에 필터를 첨부합니다. 같은
뭔가 : 그들은 여러 데이터베이스와 필요성이나 경험이없는 사람에서 올 때 여러 데이터베이스에 대한 답변
before_filter :set_app
def set_app
current_app = App.find_by_subdomain(...)
schema = current_app.schema
set_schema_path(schema)
end
def set_schema_path(schema)
connection = ActiveRecord::Base.connection
connection.execute("SET search_path TO #{schema}, #{connection.schema_search_path}")
end
def reset_schema_path
connection = ActiveRecord::Base.connection
connection.execute("SET search_path TO #{connection.schema_search_path}")
end
왜 여러 데이터베이스를 사용하는 것이 좋지 않습니까? –
데이터 무결성과 보안을 제공하는 것은 매우 일반적인 전략입니다. –
@ 차드 (Chad) : 누군가 특정하지 않고 자신을 교육하도록 누군가에게 말하면, 매우 까다 롭지는 않습니다. 적어도 링크가 도움이 될 것입니다. 그런데, 마지막 단락은 질문의 세부 사항이 부족하다는 점을 감안할 때 합리적인 것처럼 보입니다. 그러나 전반적으로 이것은 꽤 도움이되지 않는 대답입니다. – aaaidan