Frage

Ich bin über eine Anwendung mit Ruby on Rails zu erstellen, und ich möchte mehrere Datenbanken verwenden, ist im Grunde eine Buchhaltung Anwendung, die mehrere Unternehmen für jeden Benutzer haben wird. Ich möchte eine Datenbank für jedes Unternehmen erstellen

Ich fand diesen Beitrag http://programmerassist.com/article/302 Aber ich möchte mehr Gedanken über dieses Thema lesen. Ich habe zu entscheiden, zwischen MySQL und PosgreSQL, die Datenbank besser passen könnte mein Problem.

War es hilfreich?

Lösung

Es gibt mehrere Optionen für den Umgang mit einem Multi-Tenant-App.

Zum einen können Sie einen Bereich auf Ihre Tabellen hinzufügen (wie von Chad Birch vorgeschlagen - mit einem company_id). Für die meisten Anwendungsfälle ist dies in Ordnung. Wenn Sie Daten der Handhabung sicherer / privat (wie Abrechnungsinformationen) Sie sehr vorsichtig sein müssen, um Ihre Testdaten, um sicherzustellen, privat bleiben.

Sie können Ihr System über mehrere Datenbanken hinweg ausführen. Sie können eine einzelne App haben, die eine Datenbank für jeden Client verwendet, oder Sie können tatsächlich eine separate App für jeden Kunden haben müssen. eine Datenbank für jeden Client ausgeführt schneidet ein wenig gegen den Strich in Schienen, aber es ist machbar. In Abhängigkeit von der Anzahl der Clients, die Sie haben, und die Last Erwartungen, würde ich vorschlagen, tatsächlich zu laufen einzelne Apps, einen Blick. Mit etwas Arbeit an der Bereitstellung Setup (Capistrano, Koch, Puppe, etc.) können Sie dies ein sehr optimierten Prozess machen. Jeder Client läuft in einer völlig einzigartigen Umgebung, und wenn ein bestimmte Client hohe Lasten hat, können Sie sie drehen, um ihre eigenen Server.

PostgreSQL Wenn verwenden, können Sie etwas ähnliches mit Schemata tun. PostgresQL Schemata eine sehr praktische Art und Weise geben Sie Ihre Daten aus verschiedenen von islolating Kunden. Eine Datenbank enthält ein oder mehr benannte Schemata, die wiederum Tabellen enthalten. Sie müssen einige Smarts zu Migrationen und Implementierungen hinzuzufügen, aber es funktioniert wirklich gut.

Innerhalb Ihrer Rails-Anwendung, fügen Sie Filter auf die Anforderung, die den aktuellen Benutzers Schema ein- oder ausschalten.

So etwas wie:

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

Andere Tipps

Das Problem mit Antworten über mehrere Datenbanken ist, wenn sie von Leuten kommen, die nicht benötigen, oder Erfahrung mit mehreren Datenbanken haben. Das zweite Problem ist, dass einige Datenbanken nur erlauben keine zwischen mehreren Datenbanken wechseln, einschließlich so dass Anwender ihre eigenen Backup und Recovery tun und einschließlich Skalierung einige Benutzer auf einen anderen Datenserver zu verweisen. Hier ist ein Link zu einem nützlichen Video http : //aac2009.confreaks.com/06-feb-2009-14-30-writing-multi-tenant-applications-in-rails-guy-naor.html

Dieser Link wird mit Ruby on Rails mit Postgresql helfen.

Im Moment habe ich einen Multi-Tenant, Multi-Datenbank, Multi-User (viele Anmeldungen zum gleichen Mieter mit unterschiedlichen Zugriffsebenen) und eine Online-SaaS-Anwendung zu sein. Es gibt eigentlich zwei Anwendungen ist in der Buchhaltung Kategorie und die anderen Banking. Beide Apps sind auf der gleichen Struktur und Methoden gebaut. Ein Client-Benutzer (Mieter) können Datenbanken wechseln unter diesem Benutzeranmeldung. Ein Agent-Benutzer wie zum Beispiel ein Steuerberater kann nur zwischen Datenbanken für seine Kunden wechseln. Ein Super-User kann auf jede Datenbank wechseln. Es gibt ein Datenverzeichnis heißt nur ein Ort, an dem Tabellen und Spalten definiert sind. Es gibt globale Daten und lokale Daten. Globale Daten wie ein Master-Chart-of-Konten, die für jedermann zugänglich ist (nur lesen). Lokale Daten ist die Datenbank des Benutzers. Ein neuer Benutzer kann einen Klon einer Master-Datenbank erhalten. Es gibt mehrere Klone zur Auswahl. Ein Super-User können die Klon-Datenbanken beibehalten.

Das Problem ist, dass es in COBOL ist und verwendet ISAM-Dateien und verwendet die CGI-Methode. Das Problem dabei ist a) besteht die Auffassung, dass COBOL veraltet ist, b) ausgebildete Menschen bekommen, c) Preis und d) Online-Hilfe. Ansonsten funktioniert es und ich bin glücklich mit ihm.

Also ich forsche, was es zu ersetzen und was für ein Minenfeld, das ist.

Es vergangene Zeit hat und die decission hierfür war PostgreSQL-Schemata zu verwenden, Multi-Tenant-Anwendungen zu machen, ich habe ein Schema gemeinsam aufgerufen wenn im Zusammenhang stehende Daten gespeichert werden.

# app/models/organisation.rb
class Organisation < ActiveRecord::Base
  self.table_name = 'common.organisations'
  # set relationships as usual
end

# app/models/user.rb    
class User < ActiveRecord::Base
  self.table_name = 'common.users'
  # set relationships as usual
end

Dann für Migrationen Ich habe, dass mit diesen ausgezeichneten Tutorial getan. http: // timnew. github.com/blog/2012/07/17/use-postgres-multiple-schema-database-in-rails/ diese verwendet , das ist viel besser als das, was ich an anderen Orten sah sogar die Art und Weise Ryan Bates tat auf Railscasts.

Wenn eine neue Organisation erstellt wird, wird ein neues Schema mit dem Namen der Sub-Domain der Organisation erstellt. Ich habe in der Vergangenheit gelesen, dass es keine gute Idee ist, verschiedene Schemata zu verwenden, aber es hängt von der Arbeit, die Sie tun, ist diese App fast keine soccial Komponente hat, so dass es eine gute Passform ist.

Nein, Sie sollten nicht mehrere Datenbanken verwenden.

Ich bin nicht wirklich sicher, welchen Rat Sie aber zu geben, scheint es, wie Sie einige sehr grundlegende Missverständnisse über Datenbank-Design haben, können Sie sich auf die Grundlagen von Datenbanken erziehen wollen zuerst, bevor weiter zu gehen.

Sie höchstwahrscheinlich wollen einfach nur eine „Firma id“ Typ Spalte Tabellen hinzufügen, um festzustellen, welche Unternehmen ein bestimmte Datensatz gehört.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top