| 

.NET C# Java Javascript Exception

Mandantenfähige Software

Dies ist das Archiv des ehemaligen Forums zum Thema Groovy, Grails, Griffon und Bean Scripting Framework, welches unter groovy-forum.de existierte. Die neue Adresse des Groovy-Forums ist: http://codekicker.de/fragen/themen/groovy.


Mandantenfähige Software

christian - 21.10.2008 16:17
Wie würdet ihr mandantenfähige Software mit Grails machen?

Es geht darum dass die Daten in der Datenbank nach Mandanten getrennt sind, dass das Layout für jeden Mandanten individuell sein kann und dass die Konfiguration (z. B. Mail-Server) soweit nötig individuell möglich sein kann.

Ich stelle mir das so vor, dass man in jedem Nutzer-Objekt speichert, zu welchem Mandanten er gehört und dieses Objekt in der Sitzung gespeichert ist. Dadurch kann die Anwendung entscheiden, welche Daten der Nutzer sehen darf. Die Daten müssen natürlich ebenfalls einem Mandanten zugeordnet werden.

Die Frage ist, ob man vorsichtshalber bei jedem Objekt den Mandanten speichert, oder sich auf Transitivität verlässt, was aber die Gefahr erhöht, dass man mal in einer Abfrage etwas falsch macht. Beispiel: Ein Mandant hat einen Projekt und ein Projekt hat Meilensteine. Auch wenn nur das Projekt dem Mandanten zugeordnet ist, gehören natürlich die Meilensteine des Projekts ebenfalls zum Mandanten. Die andere Variante wäre, dass man auch in jedem Meilenstein speichert, zu welchem Mandanten er gehört. So könnte man z. B. bei der Bearbeitung eines einzelnen Meilensteins prüfen, ob er zu einem bestimmten Mandanten gehört, statt erst über das Projekt zu gehen.

Man könnte die Daten natürlich auch als Baum strukturieren dessen Baum der Mandant ist. Man müsste dann bei allen Abfragen an der Wurzel anfangen, was natürlich die Gefahr bürgt, dass man (oder ein anderer Entwickler) mal die Abkürzung nimmt und man dann auf Daten eines anderen Mandanten zugreifen kann.

Oder würdet ihr das vielleicht ganz anders machen? Trennung auf DB-Ebene? ...?

Gruß
Christian


Re: Mandantenfähige Software

ziegfried - 22.10.2008 10:47
Also wenn die Daten komplett getrennt sind zwischen den Mandanten, würde ich eher zur Trennung auf DB Ebene tendieren. Es gibt da die Variante wo man einen speziellen Datasource verwendet ( UserCredentialsDataSourceAdapter ) bei dem man auf ThreadLocal Basis definieren kann, welcher DB Benutzer für die Connection verwendet wird (Wie sich das mit Connection Pooling verhält, muss man ausprobieren). Auf jeden Fall wäre das eine saubere Trennung, wo man in der Entwicklung der Applikation nicht darauf aufpassen muss.

Es sollte sogar möglich sein, bestimmte Domains zwischen den Mandanten gemeinsam zu verwenden, in dem man im mapping eine Tabelle samt Schema Prefix ("dbo.global_config") definiert und allen DB Benutzern diese Tabelle auch sehen lässt.

Nachteil dieser Variante ist der Konfigurationsaufwand auf der Datenbank und die Tatsache, dass es sehr schwer bis unmöglich wäre es Datenbank-agnostisch umzusetzen.


Re: Mandantenfähige Software

krey - 27.10.2008 15:15
Hallo Christian,

Zitat
christian
Du schlägst also eine Trennung durch verschiedene Datenbanken vor, die durch eine Factory ausgewählt werden?

Nein! Tablespaces. In einer Datenbank solltest du eine Trennung vornehmen. Ein Tablespace "kann" Physikalisch auf einem anderen Rechner oder einer anderen Festplatte laufen, muss er aber nicht. Du erhältst eine Logische Trennung die "wie eine physikalische" Trennung wirkt. Zumindest auf das Rechtesystem.

Zitat
christian
Und wie? Da wären wir ja wieder bei meiner ersten Idee. Ansonsten wäre die Trennung der Daten nach Mandanten ja durch die verschiedenen Datenbanken eh gegeben. Wobei es auch eine zentrale DB geben müsste, wo gemeinsame Einstellungen drin sind (und wenn dort nur gespeichert ist, welche Mandanten es gibt).

Nein, lies den Eintrag noch einmal. Das würde nicht deinem ersten Konzept entsprechen!

Schau dir mal folgende Links an:
[www.javacamp.org]
[www.javacamp.org]

Einen zentralen "Data - Store" sollte es nach deiner Beschreibung immer geben. Das ist richtig. Die Frage ist nur was du dort speicherst?!
Du könntest 98% in eine .properties Datei auslagern mit der du die Anwendung konfigurierst.

Zitat
christian
Klingt auf jeden Fall nach einem ordentlichen Ansatz. Aber letztlich erfolgt die Entscheidung, welcher Mandant genutzt wird, immer zur Laufzeit - wenn ich mich jetzt nicht total irre.

Das solltest du auf jeden Fall in Erfahrung bringen. Nicht "zur Laufzeit" hieße Hardcodiert? Solch eine Lösung wäre nicht praktikabel. Die Frage ist hier eher:
- Wird der Mandant beim Login bestimmt (es sieht bei dir stark danach aus!
oder
- Wechselt der Mandant wärend einer "Session" und wird durch den Kontext bestimmt in dem er sich befindet. (Rollenkonzept mit Mandantenkonzept als Element)

Ich denke mir dein System wie folgt:


Die Factories entscheiden über den Tablespace etc. indem ein Parameter aus der Session übergeben wird.
DAOFactory.getProject(session.mandant);

Dort schenkt dir Grails nicht mehr viel ;) Andererseits wäre dieser Weg sauberer, als eine Implementierung von etlichen Workarounds über Attribute in den Domänenklassen.
Dateianhänge:
öffnen | Download - phpTd75SK.gif (10.6 KB)


Re: Mandantenfähige Software

Grube - 01.04.2009 12:32
christian schrieb:
-------------------------------------------------------

> Mir erscheint diese harte Trennung auch sehr viel
> sauberer, als bei jedem Objekt zu speichern, zu
> welchem Mandanten es gehört und es in einer
> Abfrage dann doch vielleicht zu vergessen.


Ob physikalisch oder logisch: du kannst immer sauber oder weniger sauber trennen. Die Gefahr, in einer Abfrage die Trennung zu vergessen besteht eher bei schlechten Designs. Ganz schlimm zum Beispiel sind hart codierte Datenbankabfragen, egal ob mit SQL, HSQL o. ä.

Eine rein physikalische Lösung ist gar nicht möglich, das ist ein Widerspruch in sich: Dann kannst du gleich die Anwendung in verschiedenen Speicherbereichen laufen lassen (für verschiedene Mandanten), also EDV zu Fuss. Warum ist es nicht möglich? Der Knackpunkt an einer mandantenfähigen Software liegt schon beim Login. Wenn sich ein bestimmter user einloggt, muss die Anwendung wissen, zu welchem Mandant er gehört. Das ist logisch (im doppelten Sinne ;-)


Stelle deine Groovy-Frage jetzt!


Diese Seite zeigt den Thread "Mandantenfähige Software" der ehemaligen Webseite groovy-forum.de, welche durch einen Serverunfall zerstört wurde. codekicker.de hat viele Konversationen über die beliebte Programmiersprache Groovy und zugehörige Frameworks wie das Grails-Framework retten können.

Hast Du eine Frage zum Thema Groovy, Grails oder allgemein Java? Viele ehemalige groovy-forum.de Mitglieder beantworten dir auf codekicker.de deine Frage! Stelle jetzt eine Frage!

Viele weitere Diskussionen zu Grails und Groovy befinden sich auf der Threadübersicht des alten groovy-forum.de.