Veuillez pardonner ma longue question. J'ai une idée pour un design sur lequel je pourrais utiliser quelques commentaires. Est-ce une bonne idée de le faire? Et quelles sont les chutes de fosse dont je devrais être conscient? Y a-t-il d'autres implémentations similaires qui sont meilleures?Correctif dynamique des bases de données
Ma situation est la suivante:
Je travaille sur une ré-écriture d'une application Windows Forms qui se connecte à un serveur SQL 2008 (plus tôt, il était SQL 2005) serveur. L'application est un "système expert" pour une société d'ingénierie où nous stockons des données structurées sur les constructions. Nous avons le contrôle de toutes les installations du logiciel client, nous n'avons pas de clients ou d'utilisateurs externes, ils sont tous internes à l'entreprise, et on peut leur faire confiance pour ne rien faire de malveillant pour le logiciel ou la base de données.
La conception actuelle n'a pas trop de tables (environ 10 - 20) mais certaines d'entre elles ont des millions d'enregistrements qui appartiennent à plusieurs centaines de constructions. La performance des systèmes a été satisfaisante jusqu'à présent, mais elle commence à se dégrader à mesure que nous repoussons les limites de la conception. Dans le cadre de la réécriture, j'envisage de diviser la base de données en une base de données principale et plusieurs bases de données «enfant» où chacune décrit une construction. Chaque base de données enfant doit être de conception identique. Cela devrait éliminer les problèmes de performance que nous voyons aujourd'hui puisque les données stockées dans chaque base de données seraient inférieures à un pour cent de la quantité totale de données. Mon souci est qu'au lieu de maintenir une base de données, nous allons maintenant obtenir des centaines de bases de données qui doivent être tenues à jour. Le système évolue constamment au fur et à mesure que les exigences de l'entreprise changent (vous savez comment c'est), et pendant que nous essayons de réduire le nombre de changements, les changements vont arriver. Nous aurons donc besoin d'un système où nous garderons une trace de toutes les modifications apportées à la base de données du système afin qu'elles puissent être appliquées aux bases de données enfant. La mise à jour de l'application client ne sera pas un problème, nous avons un bon contrôle de cet aspect.
Je pense à un système de suivi des modifications dans lequel nous stockons des scripts de base de données pour toutes les modifications d'une table dans la base de données master. Nous pouvons ensuite donner à chaque changement un numéro de version et nous pouvons stocker un numéro de version actuel dans chaque base de données enfant. Lorsque le programme client se connecte à une base de données enfant, nous pouvons vérifier le numéro de version de la base de données par rapport au numéro de version actuel et s'il existe des correctifs dont le numéro de version est supérieur au numéro de version de la base de données enfant. la base de données enfant à la dernière version. Comme je le vois, cela devrait bien fonctionner. Toute modification du système sera d'abord testée et validée avant d'être validée en tant que nouvelle version de la base de données. La modification sera ensuite appliquée à la base de données la première fois qu'un utilisateur l'ouvre. Je suppose que nous ouvririons la base de données en mode exclusif tout en appliquant les changements, mais tant que les changements ne sont pas trop fréquents cela ne devrait pas poser de problème.
Alors, qu'en pensez-vous? Est-ce que ça va marcher? Est-ce que l'un d'entre vous a fait quelque chose de similaire? Devrions-nous abandonner la solution et opter plutôt pour le système monolithique?
Nous envisageons toujours de faire des optimisations sur la base de données au lieu de la diviser, mais il y a d'autres raisons pour lesquelles je veux le faire en dehors des performances. Mais merci pour les liens, surtout le dernier était très utile! –