Question

Je suis sur le point de créer une application avec Ruby on Rails et je voudrais utiliser plusieurs bases de données, est essentiellement une application comptable qui aura plusieurs entreprises pour chaque utilisateur. Je voudrais créer une base de données pour chaque entreprise

J'ai trouvé ce post http://programmerassist.com/article/302 Mais je voudrais savoir plus réflexions sur cette question. Je dois décider entre MySQL et PostgreSQL, la base de données qui pourrait s'adapter mieux mon problème.

Était-ce utile?

La solution

Il y a plusieurs options pour gérer une application multi-locataire.

Tout d'abord, vous pouvez ajouter un champ à vos tables (comme suggéré par le Tchad Birch - à l'aide d'un company_id). Pour la plupart des cas d'utilisation cela est bien beau. Si vous gérez des données est sécurisé / privé (telles que les informations comptables), vous devez être très prudent au sujet de votre test pour assurer que les données restent confidentielles.

Vous pouvez exécuter votre système en utilisant plusieurs bases de données. Vous pouvez avoir une seule application qui utilise une base de données pour chaque client, ou vous pouvez effectivement avoir une application distincte pour chaque client. Exécution d'une base de données pour chaque client coupe un peu contre le grain dans des rails, mais il est faisable. En fonction du nombre de clients que vous avez, et les attentes de la charge, je suggère effectivement avoir un regard sur l'exécution des applications individuelles. Avec un peu de travail sur la configuration de votre déploiement (Capistrano, chef, marionnettes, etc.), vous pouvez faire un processus très simplifié. Chaque client exécute dans un environnement tout à fait unique, et si un client particulier a des charges élevées, vous pouvez les tourner vers leur propre serveur.

Si vous utilisez PostgreSQL, vous pouvez faire quelque chose de similaire à l'aide de schémas. schémas PostGreSQL offrent un moyen très pratique de islolating vos données de différents clients. Une base de données contient un ou plusieurs schémas nommés, qui à leur tour contiennent des tables. Vous devez ajouter à vos smarts des migrations et les déploiements, mais il fonctionne très bien.

Dans votre application Rails, vous installer des filtres sur la demande que l'interrupteur du schéma de l'utilisateur en cours ou désactiver.

Quelque chose comme:

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

Autres conseils

Le problème des réponses sur plusieurs bases de données est quand ils proviennent de personnes qui ne disposent pas d'un besoin ou d'expérience avec de multiples bases de données. Le deuxième problème est que certaines bases de données ne permettent pas seulement de basculer entre plusieurs bases de données, y compris en permettant aux utilisateurs de faire leur propre sauvegarde et de restauration et mise à l'échelle, y compris pour pointer certains utilisateurs vers un serveur de données différentes. Voici un lien vers une vidéo utile http : //aac2009.confreaks.com/06-feb-2009-14-30-writing-multi-tenant-applications-in-rails-guy-naor.html

Ce lien vous aidera avec Ruby on Rails avec Postgresql.

J'ai actuellement un multi-locataire, multi-base de données, multi-utilisateurs (plusieurs connexions au même locataire avec différents niveaux d'accès), et d'être une application SaaS en ligne. Il y a en fait deux applications on est dans la catégorie comptable et l'autre banque. Les deux applications sont construites sur la même structure et les méthodes. Un client-utilisateur (locataire) peut changer les bases de données sous la connexion de l'utilisateur. Un utilisateur agent tel qu'un comptable fiscaliste peut basculer entre les bases de données pour ses clients seulement. Un super-utilisateur peut passer à une base de données. Il y a un dictionnaire de données à savoir un seul lieu où les tables et les colonnes sont définies. Il existe des données mondiales et des données locales. Les données globales telles que maître carte-de-comptes qui est disponible à tout le monde (lecture seule). Les données locales est la base de données de l'utilisateur. Un nouvel utilisateur peut obtenir un clone d'une base de données maître. Il y a plusieurs clones à choisir. Un super-utilisateur peut maintenir les bases de données de clone.

Le problème est qu'il est en COBOL et utilise ISAM et utilise la méthode CGI. Le problème est a) il y a une perception que COBOL est pas à jour, b) d'amener les gens formés, c) prix et d) l'aide en ligne. Sinon, cela fonctionne et je suis content.

Alors je fais des recherches par quoi le remplacer avec et quel champ de mines qui est.

Il a le temps passé et le decission pour cela a été d'utiliser des schémas PostgreSQL, ce qui rend les applications multi-tenant, j'ai appelé un schéma commun où les données relatives sont stockées.

# 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

Alors pour les migrations, je l'ai fait avec cet excellent tutoriel. http: // timnew. github.com/blog/2012/07/17/use-postgres-multiple-schema-database-in-rails/ utiliser ce, cela est bien mieux que ce que je voyais dans d'autres endroits, même la façon dont Ryan Bates a sur Railscasts.

Quand une nouvelle organisation est créée alors un nouveau schéma est créé avec le nom du sous-domaine de l'organisation. J'ai lu dans le passé que ce n'est pas une bonne idée d'utiliser différents schémas, mais cela dépend du travail que vous faites, cette application n'a presque pas de composant soccial il est donc un bon ajustement.

Non, vous ne devriez pas utiliser plusieurs bases de données.

Je ne suis pas vraiment sûr de ce que des conseils pour vous donner cependant, il semble que vous avez des malentendus très simples sur la conception de base de données, vous pouvez vous renseigner sur les bases des bases de données d'abord, avant d'aller plus loin.

Vous avez probablement voulez juste ajouter une colonne de type « id société » à vos tables pour identifier quelle entreprise un enregistrement particulier appartient.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top