Au cours des 20 dernières années, j'ai vu quelques grandes conceptions de base de données modulaires et j'ai vu le scénario suggéré par David à plusieurs reprises, où les applications ont un accès en écriture à leur propre schéma / jeu de tables et un accès en lecture à un autre schéma / ensemble de tables. Le plus souvent, les données auxquelles une application / module obtient un accès en lecture seule peuvent être qualifiées de "données de base" .
À l'époque, je n'avais pas vu les problèmes que les réponses précédentes suggéraient que j'aurais dû voir. Je pense qu'il est donc utile d'examiner de plus près les points soulevés dans les réponses précédentes de manière plus détaillée.
Scénario: vous liez directement deux composants à un SGBDR et vous voyez un composant en particulier devenir un goulot d'étranglement
Je suis d'accord avec ce commentaire, sauf que c'est également un argument en faveur d'une copie locale des données pour que le microservice puisse être lu. C'est-à-dire que la plupart des bases de données matures prennent en charge la réplication . Ainsi, sans aucun effort de développement, les "données de base" peuvent être physiquement répliquées dans la base de données microservice si cela est souhaité ou nécessaire.
Certains pourraient reconnaître cela sous une apparence plus ancienne en tant que "base de données d'entreprise" répliquant les tables principales vers une "base de données ministérielle". Un point ici est qu’il est généralement bon qu’une base de données le fasse pour nous avec une réplication intégrée des données modifiées (uniquement les deltas, sous forme binaire et à un coût minimal pour la base de données source).
À l'inverse, lorsque nos choix de base de données n'autorisent pas cette prise en charge de la réplication "standard", nous pouvons nous retrouver dans une situation dans laquelle nous voulons transférer les "données principales" vers les bases de données de microservice, ce qui peut entraîner d'importants efforts de développement et également être un mécanisme sensiblement moins efficace.
peut vouloir dénormaliser la base de données, mais vous ne pouvez pas, car tous les autres composants seraient affectés
Pour moi, cette affirmation n’est tout simplement pas correcte. La dénormalisation est un changement "additif" et non pas un "changement radical" et aucune application ne devrait être interrompue en raison d'une dénormalisation.
La seule façon pour cette interruption d'une application est lorsque le code d'application utilise quelque chose comme "select * ..." et ne gère pas une colonne supplémentaire. Pour moi, ce serait un bug dans l'application?
Comment la dénormalisation peut-elle interrompre une application? Cela ressemble à du fud pour moi.
Dépendance du schéma:
Oui, l'application dépend maintenant du schéma de la base de données, ce qui implique un problème majeur. Bien que l'ajout de toute dépendance supplémentaire ne soit évidemment pas idéal, mon expérience est que la dépendance au schéma de base de données n'a pas posé de problème, alors pourquoi cela pourrait-il être le cas? Est-ce que je viens d'avoir de la chance?
Données de base
Le schéma auquel nous souhaitons généralement qu'un microservice ait un accès en lecture seule est le plus souvent ce que je qualifierais de " données de base " pour l'entreprise. Il contient les données essentielles essentielles à l'entreprise.
Historiquement, cela signifie que le schéma auquel nous ajoutons la dépendance est à la fois mature et stable (assez fondamental pour l’entreprise et immuable).
Normalisation
Si 3 concepteurs de base de données conçoivent un schéma de base de données normalisé, ils se retrouveront dans la même conception. Ok, il pourrait y avoir quelques variations 4NF / 5NF mais pas beaucoup. De plus, le concepteur peut poser toute une série de questions pour valider le modèle, afin de pouvoir être sûr qu'il est arrivé à 4NF (suis-je trop optimiste? Les gens ont-ils du mal à atteindre 4NF?).
update: par 4NF , je veux dire que toutes les tables du schéma ont atteint leur forme normale la plus élevée jusqu'à 4NF (toutes les tables ont été normalisées de manière appropriée jusqu'à 4NF).
Je crois que le processus de conception de la normalisation est la raison pour laquelle les concepteurs de bases de données sont généralement à l'aise avec l'idée de dépendre d'un schéma de base de données normalisé.
Le processus de normalisation donne à la conception de base de données une conception "correcte" connue et les variations à partir de là doivent être dénormalisées pour améliorer les performances.
- Il peut y avoir des variations en fonction des types de base de données pris en charge (JSON, ARRAY, prise en charge des types Geo, etc.)
- Certains pourraient argumenter pour une variation basée sur 4NF / 5NF
- Nous excluons la variation physique (parce que cela n'a pas d'importance)
- Nous limitons cela à la conception OLTP et non à la conception DW, car ce sont les schémas auxquels nous voulons accorder un accès en lecture seule.
Si 3 concepteurs avaient une conception à implémenter (sous forme de code), on s'attendrait à 3 implémentations différentes (potentiellement très différentes).
Pour moi, il y a potentiellement une question de "foi en la normalisation".
Briser les changements de schéma?
La dénormalisation, l’ajout de colonnes, la modification de colonnes pour un stockage plus important, l’extension de la conception avec de nouvelles tables, etc. constituent des modifications inébranlables.
Les changements de rupture sont évidemment possibles en supprimant des colonnes / des tableaux ou en effectuant un changement de type de rupture. Oui, mais concrètement, je n’ai rencontré aucun problème ici. Peut-être parce que l'on comprend ce que sont les changements de rupture et que ceux-ci ont été bien gérés?
Je serais intéressé d'entendre des cas de changements de schéma brisés dans le contexte de schémas partagés en lecture seule.
Qu'y a-t-il de plus important et de significatif dans un microservice: son API ou son schéma de base de données? L'API, car c'est son contrat avec le reste du monde.
Bien que je sois d’accord avec cette affirmation, j’estime qu’un architecte de l’entreprise pourrait nous avertir du fait que «les données durent éternellement» . En d’autres termes, bien que l’API soit l’aspect le plus important, les données sont également très importantes pour l’entreprise dans son ensemble et le resteront pendant très longtemps.
Par exemple, une fois que vous avez besoin de renseigner Data Warehouse for Business Intelligence, le schéma et la prise en charge de CDC deviennent importants du point de vue des rapports commerciaux, quelle que soit l'API.
Des problèmes avec les API?
Maintenant, si les API étaient parfaites et faciles, tous les points sont sans objet puisque nous choisirions toujours une API plutôt que d'avoir un accès local en lecture seule. Ainsi, même en considérant l'accès local en lecture seule, il est possible que l'API évite certains problèmes d'utilisation des API.
What motivates people to desire local read-only access?
Optimisation de l'API:
LinkedIn a une présentation intéressante (à partir de 2009) sur la question de l'optimisation de leur API et pourquoi c'est important pour eux à leur échelle. http://www.slideshare.net/linkedin/building-consistent-restful-apis-in-a-highperformance-environment
En bref, une fois qu'une API doit prendre en charge de nombreux cas d'utilisation différents, elle peut facilement se retrouver dans une situation où elle prend en charge un cas d'utilisation de manière optimale et le reste plutôt mal du point de vue du réseau et de la base de données.
Si l'API n'a pas la même sophistication que LinkedIn, vous pouvez facilement obtenir les scénarios suivants:
- L'API récupère beaucoup plus de données que nécessaire (gaspillage)
- API Chatty où vous devez appeler l'API plusieurs fois
Oui, nous pouvons bien sûr ajouter la mise en cache aux API, mais au bout du compte, l'appel de l'API est un appel à distance et une série d'optimisations est disponible pour les développeurs lorsque les données sont locales.
Je soupçonne qu'il y a un ensemble de personnes qui pourraient l'additionner comme:
- Réplication à faible coût des données de base dans la base de données microservice (sans frais de développement et techniquement efficace)
- Confiance en la normalisation et résilience des applications aux modifications de schéma
- Possibilité d'optimiser facilement chaque cas d'utilisation et d'éviter potentiellement les appels d'API distants bavards / inutiles / inefficaces
- Et quelques autres avantages en termes de contraintes et de conception cohérente
Cette réponse est trop longue. Excuses !!