2009-04-06 2 views
10

Ich richte eine SaaS-Website ein, in der ich mehrere Clients habe, die alle ihre Workflows und Daten auf derselben Site verwalten - und damit dieselbe Datenbank.Was ist die beste Methode zum Erstellen von "ummauerten Gärten" für mehrere Clients in Ihrer Datenbank?

Ich bin nicht einmal sicher, ob es ein Wort für dieses Konzept gibt, aber gibt es eine etablierte Art der automatischen Trennung der Daten, so dass alle ActiveRecord Aufrufe an die Datenbank durch die richtige client_id des Benutzers gefiltert/eingeschränkt werden das ist eingeloggt?

Der einfache Weg wäre natürlich, einfach eine "where client_id = ?" hinzuzufügen und die Client-ID des Benutzers ... am Ende jeder einzelnen ActiveRecord-Anfrage hinzuzufügen.

Gibt es irgendwelche vor Filter Idee für die Modelle, so dass jede Methode finden würde (einschließlich der dynamischen) auf die client_id zu ihnen automatisch ?. Also könnte ich einfach Model.find_by_what_I_want(foo) tun, und es würde automatisch wissen, um das auf nur Datensätze zu beschränken, die von der korrekten Klienten-ID besessen sind, obwohl ich es nicht ausdrücklich angegeben habe?

+0

Welche DBMS verwenden Sie? –

+0

Würde ** [Multitenancy] (http://en.wikipedia.org/wiki/Multenancy) ** das Wort für dieses Konzept sein? –

Antwort

10

Wenn Sie Rails verwenden 2.3+, haben Sie den Luxus der Standardbereiche:

class Model < ActiveRecord::Base 
    default_scope :conditions => ['client_id = ?', client_id] 
end 

Sie haben würde sicher client_id zu machen, ist irgendwo in der Init-Prozess festgelegt.

Dies würde sicherstellen, dass alle Datenbankabfragen in diesem Modell die client_id-Bedingung verwenden.

+0

Perfekt! Danke –

+0

Ich würde einen Hash für die Bedingungen Hash verwenden, der auch sicherstellt, dass neu erstellte Datensätze automatisch die richtige ID erhalten würden: default_scope: conditions => {: client_id => client_id} –

0

Wie wäre es mit dem Hinzufügen einer neuen Datenbank für jeden Kunden? Auf diese Weise wird die Trennung des Kunden konkreter und Fehler, bei denen Kunden andere Kundendaten verwenden könnten, sind weniger wahrscheinlich.