Je concevons une application multi-locataires qui utilisera le même schéma de base de données pour une instance de DB distincte par locataire (c'est-à-dire à chaque fois que je reçois un nouveau client, je crée une nouvelle base de données pour eux). Cette approche est souhaitable pour sa simplicité dans laquelle je n'ai pas besoin de filtrer les données par locataire -> Je peux simplement sélectionner chaque User
in dbo.Users
, par exemple - pas besoin de filtrer par CustomerId
/aucun danger que j'oublie et expose accidentellement les mauvaises données au mauvais client.
Ce que je me demande, c'est comment gérer les données communes à toutes les bases de données . Les codes postaux (code postal) constitueraient un excellent exemple. On dirait que je devais soit reproduire ces données dans chaque base de données (qui sera un cauchemar à maintenir et signifiera que je stocke charges de données dupliquées) [~ # ~] ou [~ # ~ ~] J'ai besoin d'utiliser une base de données commune qui m'empêche de rejoindre des tables de manière naturelle ou d'utiliser par exemple EntityFramework
hors de la boîte. Ni de ces sons droits/meilleurs que l'autre.
Quelqu'un a-t-il une bonne stratégie pour cela?
J'utiliserais une base de données partagée pour des données communes telles que les codes postaux. Vous ne pourrez pas rejoindre des tables entre les bases de données à l'aide d'un cadre d'entité, mais cela peut ne pas avoir été une option de toute façon (en raison de problèmes de performance) si vos classes DbContext
sont grandes. Vous pouvez toujours rejoindre à la volée à l'aide de Linq.
Je voudrais probablement envelopper les données partagées dans une sorte de SharedDataService
et utilisez-le pour le récupérer. Ce service pourrait utiliser un cache de longue durée de vie à faible latence pour le rendre rapide.
Être capable de maintenir les données partagées au même endroit vous facilitera votre vie si vous avez besoin de la mettre à jour. Les codes postaux changent rarement, mais d'autres types peuvent changer plus fréquemment (langue, ethnie, SOC, SCIAN, ICD, etc.).
Ne pas pouvoir utiliser correctement le cadre d'entité ne devrait pas prendre en compte votre décision. Si vous abstriez correctement l'accès aux données avec des référentiels (non facultatif pour quelque chose aussi compliqué qu'une application multi-locataires), avoir quelques entités qui n'utilisent pas l'ensemble de l'entité ne doivent pas être perceptibles. En outre, veuillez envisager d'utiliser -DAPPER.NET, il est utilisé par ce site, est facile à utiliser, performant et n'aura pas de problèmes avec l'une ou l'autre de ces approches.
Si vous avez choisi une base de données distincte et que vous disposez des données communes dans chaque base de données, vous passerez à une base de données distincte pour la base de données commune. Heureusement, vous n'avez pas à choisir entre ces deux approches.
Une autre option consiste à disposer d'une base de données distincte qui sert de source de vérité, puis appuyez sur ses données sur des bases de données client individuelles. Les enregistrements communs stockés dans les bases de données des clients sont traités comme un cache persistant. Tous Écrit des données communes Aller à la base de données commune dédiée, puis est poussée à la DBS du client. Dans mon esprit, c'est l'approche préférée.
|C1| <-- |S| --> |C2|
C = Customer DB, S = Shared DB
Exploitez un service de file d'attente, tel que RabbitMQ ou SQS pour planifier des poussées lorsque des données courantes sont ajoutées ou modifiées.
La chose est que vous aurez besoin d'une base de données commune distincte de toute façon pour des raisons telles que des enregistrements de clients, vous pourriez aussi bien tirer parti des données communes. En outre, il est très utile d'avoir une source de vérité bien définie.
Il n'y a rien de mal à avoir plusieurs copies des mêmes données, les problèmes réels se produisent lorsque vous ne disposez pas d'une source de vérité unique définie pour un morceau de données.