arrière-plan
J'ai une application qui stocke beaucoup d'entités dans une base de données relationnelle classique (Microsoft SQL Server) et j'utilise une orm (cadre d'entité) pour interroger les données de celui-ci. Cette base de données contient un schéma tout seul une "vue globale" à ces données existant. Les données sont mises à la disposition des utilisateurs via une API ODATA.
Pour la simplicité, disons que c'est un système de blog avec les tables Posts
, Comments
, Tags
, Users
. La relation exacte entre eux n'est pas si importante pour l'instant.
Question
Avec la version suivante de l'application, nous souhaitons utiliser plusieurs blogs dans une installation logicielle. Tous les blogs avec leur contenu sont indépendants les uns des autres et fonctionnant par différents utilisateurs.
Comment une telle extension du logiciel peut-elle être effectuée?
La solution la plus évidente au problème me semble faire partie de la séparation du modèle de données. Cela nécessiterait d'introduire un conteneur entité et laisser toutes les autres entités pointez via FK sur le conteneur qu'ils appartiennent. Ensuite, dans l'application, toutes les requêtes doivent être étendues par un filtre pour uniquement charger des données pour le Courant Conteneur.
Comme vous pouvez l'imaginer, cela nécessite beaucoup d'efforts de développement. Chaque requête doit spécifier correctement ce filtre et, le cas échéant, des données de mauvais blogs peuvent être affichées. Les contraintes uniques doivent également être retravaillées pour être un seul conteneur.
Une autre idée était de créer une base de données même par conteneur et de se connecter au dB correspondant en fonction de l'accès du conteneur. L'effort de maintenance derrière cela me semble également un peu complexe.
Y a-t-il peut-être d'autres solutions techniques à cette question?
Malheureusement, je manque des conditions correctes pour faire une recherche appropriée sur ce sujet. La meilleure chose à laquelle j'espère espérer est une fonctionnalité SQL Server qui permet de stocker plusieurs "séries" de données dans le même schéma de base de données avec une séparation stricte.
Vous avez cloué les deux choix évidents. Mais non plus aussi fort que vous le dites, et ce qui a plus de sens dépend de la quantité que vous attendez de faire pour intégrer le contenu d'un blog dans un autre.
approche de base de données séparée:
C'est la méthode la plus simple à mettre en œuvre. Vous avez déjà une chaîne de connexion pour vous connecter à votre base de données. Il suffit de l'envelopper derrière une fonction, qui prend une sorte d'objet "demande" comme argument. Il peut alors simplement renvoyer la bonne chaîne de connexion de base de données. Facile, et très modulaire. Essentiellement, rien ne change dans votre application.
Le seul inconvénient de cette approche est que si vous souhaitez analyser sur des blogs (par exemple, quel blog est le plus actif, lequel blog utilise le mot "pet" le plus souvent, etc.), qui ne fonctionnera pas bien avec cette approche.
Dans une approche de base de données:
Cela nécessite un champ supplémentaire "blogide" dans toutes vos tables de haut niveau (peut-être toutes les tables). Partout où vous attrapez des données sans y rejoindre d'abord sur une autre table (si vous vous joignez déjà sur une table avec le blogid, vous n'avez probablement pas besoin d'ajouter le blogide à la nouvelle table - comme peut-être la table des utilisateurs? Cela dépend de la sémantique que vous voulez aussi ).
Et oui, cela nécessite un petit changement sur vos requêtes de haut niveau - disant où blogid = blogidimworkingon. Mais cela facilite la tâche - lorsque vous souhaitez intégrer/analyser le contenu entre les blogs.
J'espère que cela t'aides! Bonne chance!
Bien que je ne suis pas vraiment un architecte expérimenté, mais comme la question est de la question, vous ne voudrez peut-être pas changer beaucoup du tout.
Vous simplement ajouter une table Blogs
et une colonne "blog_id" aux messages (juste comme votre "commentaire" a probablement déjà une colonne "post_id"). Eh bien, selon les entités que vous souhaitez séparer, vous pouvez faire d'autres modifications, par exemple, vous dites que vous souhaitez séparer les utilisateurs, mais que vous ne fournissez pas beaucoup de détails, il est juste de supposer que vous n'avez pas besoin de beaucoup de complexité. . Peut-être que les utilisateurs partagés entre des blogs seraient une fonctionnalité.
En fonction de la taille du projet, il pourrait ne pas être trop efficace, mais encore une fois, si vous ne trouvez aucun problème, aucune raison de surcharger le système
Nous avons résolu ce problème en utilisant une base de données par client et nous disposons d'une seule base de données de configuration qui plante quel sous-domaine/client se connecte à la base de données. En stockant simplement le ConnectionsR, le sous-domaine client et d'autres métainformations dans cette base de données de configuration. Semblable à ce que vous proposez comme deuxième solution.
Cela nécessite une certaine configuration par client, mais je ne pense pas que cela soit évité, peu importe la façon dont vous la mettez en œuvre. Nous utilisons une injection de dépendance et vous connectons à la bonne base de données lors de l'initialisation du conteneur. Ceci est fait sur une base par demande.
Ce n'est pas vraiment une bonne réponse, mais cela fonctionne pour nous, alors cela le fera probablement pour vous. Je n'ai aucune idée s'il y a de meilleurs moyens de le faire. ????