multi-tenant

___ answer20841183 ___

Sie müssen die Verbindungszeichenfolge für jeden Benutzer irgendwo speichern (vielleicht in der Benutzertabelle?) und diesen Wert nachsehen, wenn Sie eine neue db-Verbindung erstellen. Das bedeutet, dass Sie keine Verbindungszeichenfolge aus web.config verwenden können, aber ich nehme an, Sie wissen, wie Sie eine neue db-Verbindung mit einer benutzerdefinierten Verbindungszeichenfolge erstellen können.

    
___ qstntxt ___

Ich erstelle eine Case-Management-Anwendung und eine der Anforderungen ist, dass jeder Client seine eigene Datenbank mit einer eigenen URL bekommt. Es ist jedoch ein Alptraum, mehrere Instanzen der Anwendung beim Upgrade zu verwalten. Ich verwende IIS 7 ASP.NET MVC. Ich möchte eine Anwendung haben und die Anwendung wissen lassen, von welcher Datenbank die Daten abhängig von der Benutzerauthentifizierung abgerufen werden. Gibt es eine praktikable Alternative?

    
___ answer20946923 ___

Ein Problem sehe ich darin, dass Sie jetzt die Anwendung und ihre Datenbank trennen.

In einer gewöhnlichen Situation werden sie zusammen aktualisiert. Sie könnten jetzt mit einer aktualisierten Anwendung und einer oder mehreren Datenbanken, die nicht aktualisiert werden, enden.

Ich denke, Adarsh ​​Shahs Antwort ist sehr gut, aber es vermisst diesen Punkt.

Meine Frage wäre: Warum können Sie diese Datenbanken nicht zusammenführen?

Dafür gibt es Lösungen. Zum Beispiel:

Angenommen, Sie haben einen Tabellennamen Cases. Erstellen Sie eine Ansicht, z. B. Cases_V (V aus Sicht). Legen Sie bei der Anmeldung eine Sitzungsvariable CompanyId fest (ich denke, das ist in SQL Server möglich, zumindest in Oracle, die ich verwende).

Filtern Sie in der Ansicht die Tabelle für diese Sitzungsvariable.

Die SQL von Cases_V würde so aussehen (in Oracle-Syntax):

%Vor%

In Ihrer Anwendung würden Sie diese Ansicht folgendermaßen verwenden:

%Vor%

Dies verhindert, dass Benutzer auf Informationen von anderen "Installationen" zugreifen und die Wartung minimieren.

    
___ answer20938427 ___

Wenn ich Sie gut verstehe, müssen Sie Authentifizierung für jeden Kunden. Wenn der Client erfolgreich autorisiert wurde, sollte er auf seine Site umgeleitet werden, was bedeutet, dass die Verbindungszeichenfolge lauten sollte programmatisch geändert werden .

Alternativ können Sie die Anzahl der Verbindungszeichenfolgen in der Datei web.config definieren. Dann können Sie es verwenden, hängt von der Client-Autorisierung ab: Gewusst wie: Lesen von Verbindungszeichenfolgen aus der Datei "Web.config"

Hier ist ein Beispiel für die Einstellung von web.config:

%Vor%

Prost!

    
___ answer20947416 ___

Ihre Frage ist wirklich nur eine Frage des Eisbergs. Mandantenfähigkeit ist ein komplexes Thema. Eine Verbindung pro Client mit der Tenant-Datenbank ist nur ein Aspekt. Es gibt noch andere Aspekte zu beachten:

  • Ausbalancierung von Mandanten: Wie stellen Sie sicher, dass Mandanten, die viel schneller wachsen als der Durchschnitt, angemessene Ressourcen erhalten und andere Mandanten nicht überlagern, die auf demselben Speicher (z. B. dieselbe Instanz) zusammengeschlossen sind. Wie bewegt man einen Mieter, der gewachsen ist? Wie aggregieren Sie kleine Mieter mit geringer Aktivität?
  • Isolation von Ressourcen: Ein Mandant kann einen großen Prozentsatz der Ressourcen verbrauchen (z. B. kann er eine Abfrage in der Datenbank ausführen, die die gesamte CPU aufnimmt und alle anderen Abfragen verhungern lässt), wie gewährleisten Sie anderen Mandanten die Fairness sind zusammengelegt?
  • geteilte Daten. Änderungen an gemeinsam genutzten Daten replizieren (Daten, die allen Mandanten gemeinsam sind, zB Nachschlagetabellen) kann problematisch sein.
  • Schemaänderungen. Dies ist eines der kniffligsten Themen. Datenbankschema und -code werden normalerweise synchron geändert (Code erwartet ein bestimmtes Schema), und die Bereitstellung einer Schemaänderung für alle Mandanten kann problematisch sein.

Ich empfehle Ihnen, das Multi-Tenant Data Architecture Whitepaper zu lesen. Dies stellt drei grundlegende Ansätze vor:

Zusätzlich würde ich die Option SQL Azure Federations hinzufügen (was nicht der Fall war) verfügbar zu der Zeit, als das Weißbuch geschrieben wurde). Der Artikel diskutiert die Vor- und Nachteile dieser Ansätze aus Sicht der Datenbank / Speicher, unter Berücksichtigung von Dingen wie:

  • Speicherkosten
  • Sicherheit
  • Verfügbarkeit
  • Skalierbarkeit
  • Leichtigkeit der Schemaänderung (App-Upgrade)
  • Erweiterbarkeit

Auf der Client-Seite ist mir keine MVC-Erweiterung bekannt, die für den Multi-Tenant-Fall hilfreich ist, etwas in der Art des act_as_tenant Juwel in Rails.

  

fängt an, ein Alptraum zu sein, um mehrere Instanzen der Anwendung beim Upgraden aufrechtzuerhalten.

Dies ist tatsächlich eines der größten Probleme in Multi-Tenant-Architekturen. Selbst wenn Sie die Reibung beseitigt haben, das Upgrade in einer DB tatsächlich durchzuführen, ist es immer noch ein schwer zu lösendes Problem. Sofern Sie sich keine Downtime für alle Mandanten leisten und das gesamte System offline schalten, alle Tenant-Datenbanken aktualisieren, neuen Code implementieren, der ein neues Schema versteht, und dann alle Mandanten online schalten, ist dies aufgrund des App-Codes eine Herausforderung (der ASP / MVC-Code) muss in der Lage sein, beide Versionen (alt und neu) gleichzeitig zu verstehen. Es ist nicht unmöglich zu lösen, aber es ist schwierig und muss sorgfältig codiert werden.

Dies ist ein wichtiger Teil, wenn "die Reibung des tatsächlichen Upgrades beseitigt wird". Ich mache keine Prozedur, die Sie zum Bereitstellen eines Upgrades verwenden. Es ist wichtig, dass das Upgrade automatisch und ohne manuellen Eingriff durchgeführt wird. Diff-basierte Tools werden manchmal verwendet, wie SQL Compare von Red-Gate oder sogar Visual Studio %code% . Mein bevorzugter Ansatz ist jedoch die Verwendung von Upgrade-Skripts und Metadaten-Versionierung in der Anwendung. Weitere Informationen finden Sie unter Versionskontrolle und Ihre Datenbank . Als Referenz dient dieser Ansatz im Wesentlichen dem Rails Migrations -Ansatz.

    
___ tag123sql ___ Structured Query Language (SQL) ist eine Sprache für die Abfrage von Datenbanken. Fragen sollten Codebeispiele, Tabellenstruktur, Beispieldaten und ein Tag für die verwendete DBMS-Implementierung (z. B. MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 usw.) enthalten. Wenn sich Ihre Frage nur auf ein bestimmtes DBMS bezieht (verwendet bestimmte Erweiterungen / Funktionen), verwenden Sie stattdessen das Tag des DBMS. Antworten auf mit SQL gekennzeichnete Fragen sollten den ISO / IEC-Standard SQL verwenden. ___ answer20943134 ___

AdarshShah-Anweisung ist sehr korrekt. Sie sollten die Verbindungszeichenfolgen verschiedener Datenbanken in einer separaten MetaDatabase verwalten, um die Identifizierung der jeweiligen Verbindungszeichenfolge des bestimmten Clients zu vereinfachen, insbesondere in einer Multi-Tenant-Umgebung Möglicherweise müssen Sie eine dedizierte Datenbank oder ein bestimmtes Schema für einen Client ausrollen / zuweisen. Es kann daher ein Alptraum werden, Verbindungszeichenfolgen in der XML-Datei wie SQL.Config oder Web.Config zu verwalten und zu verwalten.

Ich bin Teil einer Organisation, in der wir uns auf den Aufbau von Multi-Tenant-Framework spezialisiert haben, das von ISVs und Entwicklern verwendet werden kann, um SaaS-Anwendungen schneller zu entwickeln, ohne dabei die üblichen nicht-funktionalen Anforderungen zu analysieren und zu verstehen. Eine der primären Komponenten des Frameworks ist der Data Shader, der genau das Gleiche tut.

Bitte sehen Sie Ссылка

    
___ tag123aspnetmvc ___ Das ASP.NET MVC Framework ist ein Open-Source-Webanwendungsframework und Tooling, das eine auf Webanwendungen basierende Version des Model-View-Controller (MVC) -Musters implementiert und auf einer ASP.NET-Technologiegrundlage aufbaut. ___ tag123multitanten ___ Ein Prinzip in der Softwarearchitektur, bei dem eine einzelne Instanz der Software auf einem Server ausgeführt wird und mehrere Client-Organisationen (Mandanten) bedient. ___ answer21063549 ___

Ich werde vorstellen, wie ich versuchen würde, dieses Problem zu lösen.

Zuallererst müssen mehrere Verbindungszeichenfolgen in Ihrer Anwendungskonfiguration vorhanden sein. Ich empfehle Ihnen, Entity Framework für DB Management zu verwenden, wenn Ihre App in ASP.NET MVC ist. Sie können Wrapper über die DbContext- und ObjectContext-Klassen erstellen (ich meine Sie Wrapper, um die erwähnten Klassen zu erben) und Factory-Methode verwenden, um den Kontext basierend auf dem angemeldeten Benutzer auszuwählen.

Ich nehme an, dass Sie die Datenbank kennen, in der die Benutzer gespeichert sind. Aus Global.asax gehen Sie zuerst zu diesem dbContext und wählen dann basierend auf dem Benutzerprofil den richtigen Kontext.

    
___ qstnhdr ___ Eine Anwendung Mehrere Instanzen und verschiedene DB ___ tag123databaseconnection ___ Eine Datenbankverbindung ist eine Funktion, mit der Clientsoftware mit Datenbankserversoftware kommunizieren kann, unabhängig davon, ob sie sich auf demselben Computer befindet oder nicht. Eine Verbindung ist erforderlich, um Befehle zu senden und Antworten zu erhalten. ___ answer20926407 ___

Ja, es ist besser, wenn möglich eine Instanz der Anwendung zu haben, sonst wird es kompliziert. Wenn die Funktionen für verschiedene Clients unterschiedlich sind, verwenden Sie Feature-Flags, um Funktionen für jeden Client / Benutzer ein- und auszuschalten. Siehe unten Artikel von Martin Fowler darüber. Feature-Flags können pro Benutzer oder Client sein. Facebook und einige andere große Websites verwenden Feature-Flags effektiv.

Ссылка

In Bezug auf die Datenbank denke ich, dass Sie eine Gemeinsame Datenbank haben können, die alle grundlegenden Informationen einschließlich aller Clients enthält und dann andere spezifische Datenbanken für jeden Client hat, die alle anderen hat Daten für den Kunden.

Wenn ein Benutzer eine clientspezifische URL in der Session_Start -Methode von Global.asax antrifft, wird Logik hinzugefügt, um die entsprechende Verbindungszeichenfolge abzurufen und in Sitzung zu speichern ( %code% ), damit Sie sie immer dann verwenden können, wenn Sie Daten aus der Client-DB benötigen.

Ich würde vorschlagen, dass Sie alle Verbindungszeichenfolgen in einer Tabelle in Common-Datenbank speichern (mit einem Schlüssel, der jeden Client identifiziert), damit Sie eine neue Verbindungszeichenfolgendatei hinzufügen können, wenn Sie einen neuen Client an Bord haben möchten. Immer wenn Sie eine neue Version erstellen, würde ich vorschlagen, alle Client-Datenbanken zusammen zu aktualisieren, anstatt nur eine Client-DB zu aktualisieren, sonst wird sie nach einer Weile nicht mehr zu verwalten sein.

    
___
2
Antworten

Mandantenfähige Zugriffssteuerung: Repository- oder Service-Layer?

Sollte ich in einer mandantenfähigen ASP.NET MVC-Anwendung, die auf der MVC Storefront von Rob Conery basiert, die Daten des Mandanten im Repository oder der Service Ebene filtern? 1. Die Daten des Mieters im Repository filtern: %Vor%...
30.04.2010, 14:52
2
Antworten

MultiTenant im Vergleich zu mehreren DBs

Ich entwickle eine kundenspezifische CRM-Lösung, die über das Web / SaaS-Modell verkauft wird. Ich erwarte Zehner oder Hunderte von Kunden, die diese Lösung verwenden. Ich werde MS SQL als db-Engine verwenden. Option 1 besteht darin, einen ei...
24.06.2010, 08:46
2
Antworten

Der beste Ansatz für mandantenfähige Primärschlüssel

Ich habe eine Datenbank, die von mehreren Clients verwendet wird. Ich möchte nicht, dass inkrementelle Schlüsselwerte zwischen den Clients bluten. Ich möchte, dass die Nummerierung bei 1 beginnt und kundenspezifisch ist. Ich verwende einen zw...
16.09.2012, 20:58
1
Antwort

Filtern von DbContext in einer mandantenfähigen Anwendung mithilfe von Entity Framework mit MVC4

Ich entwickle eine mandantenfähige Webanwendung mit MVC4 und EF5 . Ich habe zuvor diese Frage bezüglich der Filterung meines DbContext gestellt: Ist es eine schlechte Übung, nach ID im Repository-Muster zu filtern . Offensichtlich war m...
19.06.2013, 11:34
3
Antworten

Multi-Tenant Rails-Anwendung: Was sind die Vor- und Nachteile der verschiedenen Techniken?

Ich habe ursprünglich meine Ruby on Rails-Anwendung für einen Client geschrieben. Jetzt ändere ich es, damit es für verschiedene Kunden verwendet werden kann. Mein Endziel ist, dass ein Benutzer (nicht ich) auf eine Schaltfläche klicken und ein...
09.08.2011, 21:08
3
Antworten

Mandantenfähigkeit mit SQLAlchemy

Ich habe eine Web-Anwendung, die mit Pyramid / SQLAlchemy / Postgresql erstellt wurde und Benutzern erlaubt, einige Daten zu verwalten, und diese Daten sind für verschiedene Benutzer fast völlig unabhängig. Sagen wir, Alice besucht alice.domain...
14.11.2012, 02:02
2
Antworten

Legen Sie eine Route {Mandanten} / {Controller} / {Aktion} / {ID} mit ASP.NET MVC fest?

Ich möchte eine mandantenfähige ASP.NET MVC-App einrichten. Idealerweise hätte diese App eine Route mit {tenant}/{controller}/{action}/{id} , wobei jede tenant eine logische Instanz der App darstellt (einfach unabhängige Multi-User-Accounts...
09.11.2009, 09:15
1
Antwort

Mehrfachmiete in Shiro

Wir evaluieren Shiro für eine benutzerdefinierte Saas-App, die wir erstellen. Scheint wie ein großartiges Framework tut 90% von dem, was wir wollen, out of the box. Mein Verständnis von Shiro ist grundlegend, und hier ist, was ich zu erreichen v...
13.02.2012, 21:46
1
Antwort

ASP.NET MVC 3 - Mehrere Domänen verwalten und eine einzige Codebasis gemeinsam nutzen

Ich habe mich schon seit einigen Tagen gefragt, wie ich das am besten machen könnte, und ich habe mich gefragt, was die anderen wohl gedacht haben. Wir möchten alle Websites unserer Unternehmen auf ASP.NET MVC 3 umstellen und aktualisieren un...
30.07.2011, 23:31
2
Antworten

Entity Framework Multitenant-Architektur für gemeinsame Daten: einzelne Spalte, mehrere Fremdschlüssel

Ich habe folgende Datenstruktur: %Vor% Ich erhalte den folgenden Fehler:    Die Fremdschlüsselkomponente 'TenantId' ist keine deklarierte Eigenschaft für   Geben Sie 'SpecialOrder' ein. Stellen Sie sicher, dass es nicht explizit ausgeschl...
14.08.2012, 09:48